혼자 잰 값과 모두가 알려 준 값 사이 어딘가 로 끌어당기기 — 그것이 수축(shrinkage)입니다.
수축(shrinkage)의 최종 공식은 놀랄 만큼 간단합니다.
s2p = (d0 *s0 + d*s2) / (d0 + d)
가중 평균 입니다. 그것뿐이에요.
s2 — 이 유전자가 직접 잰 분산, 무게는 d(=5, 우리 자유도)
s0 — 13,095개 전체가 알려 준 보통의 분산 , 무게는 d0
즉 d0 는 "전체의 의견을 샘플 몇 개어치로 쳐 줄까" 입니다.
d0 가 크면 개별 유전자의 측정을 덜 믿고 전체 쪽으로 강하게 끌어당기고,
d0 가 0에 가까우면 보통의 t 검정과 같아집니다.
우리 데이터에서 계산하면 d0 ≈ 2.65 , s0 ≈ 0.0285 가 나옵니다.
자유도 5짜리 개별 측정에 자유도 2.65짜리 "전체 의견"을 섞는 셈이니,
꽤 묵직한 보정입니다.
고등학생 분산을 빌려온다
12강이 이 강의에서 가장 어려운 부분입니다.
그런데 발상 자체는 단순 해요.
각 유전자의 분산을 전체 평균 쪽으로 끌어당긴다
식으로 보면
s²ₚ = (d₀·s₀ + d·s²) / (d₀ + d)
무섭게 생겼지만 가중평균 입니다.
중학교에서 배운 그것이에요.
기호 무엇
s² 이 유전자에서 잰 분산
s₀ 전체에서 추정한 공통 분산
d 이 유전자의 자유도 (반복 수 관련)
d₀ 공통 분산에 주는 무게
둘을 섞는다 — 얼마나 섞을지는 d₀ 가 정한다
비유 — 시험 점수와 평소 성적
어떤 학생이 시험에서 100점 을 받았습니다.
실력이 100점일까요?
정보 값
이번 시험 100점
평소 성적 70점
합리적 추정 둘 사이 어딘가
한 번의 관찰을 그대로 믿지 않고 배경 정보와 섞는다
시험을 여러 번 봤다면 그 점수를 더 믿고,
한 번 만 봤다면 평소 성적을 더 믿는 거죠.
그게 식의 d 와 d₀ 가 하는 일입니다.
수축이 하는 일 — 한 문장
우연히 분산이 아주 작게 나온 유전자는 분모를 키워 t 를 끌어내리고,
우연히 아주 크게 나온 유전자는 분모를 줄여 t 를 살려 준다.
그 결과 "변화가 진짜 큰" 유전자만 위로 올라옵니다.
고등학생 수축이 하는 일 — 한 문장
note 가 한 문장 으로 정리합니다.
극단적으로 작은 분산은 키우고 , 극단적으로 큰 분산은 줄인다
그림으로 그리면
원래 분산 수축 후 결과
아주 작다 (0.01) 커진다 t 가 줄어든다 ✔
보통 거의 안 변한다 그대로
아주 크다 줄어든다 t 가 커진다
양 극단을 가운데로 끌어당긴다 — 그래서 '수축'
11강의 사고가 해결됩니다
Rassf3 처럼 우연히 조용한 유전자는
분산이 키워져서 t 가 내려갑니다.
더 이상 1등이 아니다
13강 코드가 그 결과 를 보여 줍니다 —
"수축 덕분에 우연히 조용한 유전자가 더 이상 1등이 아닙니다."
그리고 자유도도 늘어납니다
정보를 빌려 왔으니 자유도가 커집니다 — d₀ + d 로요.
자유도 t 분포
보통 t 검정 d (작다) 꼬리가 두껍다
moderated t d₀ + d (크다)꼬리가 얇다
정보를 빌리면 반복이 는 것과 비슷한 효과
돈을 안 쓰고 통계적으로 반복을 늘린 셈이에요.
그래서 limma 가 그렇게 널리 쓰입니다.
d0 와 s0 는 어떻게 구하나
여기가 코드랩에서 가장 낯선 부분입니다. 한 줄씩 뜯어봅시다.
e = np.log(s2) - digamma (d/2) + np.log(d/2)
tri = np.var(e, ddof=1) - polygamma (1, d/2)
d0 = brentq (lambda x: polygamma(1, x/2) - tri, 1e-3, 1e6)
s0 = np.exp(e.mean() + digamma(d0/2) - np.log(d0/2))
발상은 이렇습니다. 분산 13,095개가 어떤 분포 에서 나왔다고 보고,
그 분포의 중심(s0) 과 폭(d0) 을 데이터로부터 되짚어 내는 것입니다.
"데이터에서 사전분포를 얻는다"고 해서 경험적(empirical) 베이즈라고 부릅니다.
digamma 와 polygamma 는 어렵게 생겼지만 하는 일은 소박합니다.
"자유도 d 로 잰 분산에 로그를 씌우면 평균과 분산이 이론적으로 얼마가 되는가"를
알려 주는 보정표 예요. 그 이론값과 실제 관측값의 차이 가
바로 유전자마다 진짜로 다른 만큼(tri)이고,
그 크기에 맞는 d0 를 brentq 가 찾아 줍니다.
brentq — 답을 '찾아 주는' 함수
brentq(f, 1e-3, 1e6) 는 f(x) = 0 이 되는 x 를 찾아라 는 뜻입니다.
구간 [0.001, 1000000] 안에서 반씩 좁혀 가며 답을 찾습니다.
우리는 polygamma(1, x/2) == tri 인 x 를 원하므로
polygamma(1, x/2) - tri 가 0이 되는 지점을 찾게 한 것입니다.
공식으로 풀리지 않는 방정식을 수치적으로 푸는 아주 흔한 기법입니다.
고등학생 brentq — 답을 '찾아 주는' 함수
note 가 brentq 를 설명합니다.
낯설지만 발상은 쉬워요.
식을 풀 수 없을 때 답을 찾아 준다
무슨 뜻인가
어떤 방정식은 손으로 못 풉니다.
x 를 한쪽으로 몰 수가 없어요.
그럴 때 답을 대입해 가며 찾습니다.
단계 하는 일
1 범위를 정한다 (예: 0.001 ~ 1,000,000)
2 가운데 값을 넣어 본다
3 결과를 보고 범위를 반으로 줄인다
4 충분히 좁아질 때까지 반복
이게 이분법 이다 — 수학 시간에 배운 그것
비유 — 숫자 맞히기 게임
1부터 100 사이의 숫자를 맞힙니다.
"더 큽니다 / 더 작습니다" 만 들을 수 있어요.
가장 빠른 방법은? 가운데를 부르는 겁니다.
50 → 75 → 62 → … 7번 이면 맞힙니다.
범위를 반씩 줄이면 아주 빨리 좁혀진다
그래서 컴퓨터가 잘합니다
사람은 계산이 느리지만 컴퓨터는 1초에 수백만 번 합니다.
그러니 풀 수 없는 식도 답을 찾아 낼 수 있어요.
수학적으로 못 풀어도 수치적으로 풀 수 있다
이게 현대 과학 계산의 기본입니다
많은 문제가 깔끔한 공식이 없습니다.
그래서 찾아 가는 방법을 씁니다.
/stat 12·13강의 순열검정 · 붓스트랩 도 같은 정신이에요 —
공식이 없으면 만들어 쓴다.
limma 의 핵심을 외부 R 없이 20줄로 재현했습니다.
고등학생 limma 를 20줄로 재현했습니다
캡션이 자랑스럽게 적습니다 —
"limma 의 핵심을 외부 R 없이 20줄로 재현했습니다" .
유명한 도구도 핵심은 몇십 줄 이다
이게 왜 인상적인가
limma 는 생물정보학에서 가장 많이 인용된 도구 중 하나입니다.
논문 인용이 수만 회 예요.
그런데 핵심 아이디어 는 20줄로 쓸 수 있습니다.
복잡해 보이는 것도 중심 발상은 단순 할 때가 많다
물론 진짜 limma 는 훨씬 큽니다
우리 20줄 진짜 limma
핵심 발상 + 여러 실험 설계 지원
두 군 비교만 + 복잡한 모형
기본 경우 + 온갖 가장자리 경우
실무 도구의 대부분은 가장자리 처리 다
/py 7강의 그 이야기입니다 —
빈 값, 0 나누기, 이상한 입력을 다 막아야 하니까요.
그래도 20줄을 써 보는 값어치
안이 보인다 — 결과가 이상할 때 원인을 찾는다
믿을 수 있다 — 마법이 아니라는 걸 안다
고칠 수 있다 — 내 상황에 맞게 바꾼다
한 번 열어 보면 도구가 무섭지 않다
/py 8강의 "직접 짜 보는 것의 값어치" 와 같습니다.
그다음부터는 진짜 limma 를 쓰면 돼요.
🎮 수축 강도를 손으로 돌려 보기
d0 슬라이더를 움직여 보세요. 0 이면 보통의 t 검정,
크게 올리면 모든 유전자가 같은 분산을 쓰게 됩니다.
실제 데이터가 고른 값(2.65)이 그 사이 어디쯤인지 확인해 보세요.
🤔 확인 문제
s2p = (d0*s0 + d*s2) / (d0 + d) 는 무엇인가요?
A 두 분산의 곱
B 개별 분산과 전체 분산의 가중 평균
C 분산의 제곱근
D p값 계산식
해설 무게 d 를 가진 개별 분산 s2 와, 무게 d0 를 가진 전체 분산 s0 의 가중 평균 입니다. 아주 단순한 식이에요.
🤔 확인 문제
d0 가 0에 아주 가까워지면 결과는 어떻게 되나요?
A 모든 유전자가 같은 분산을 쓰게 된다
B 보통의 t 검정과 거의 같아진다
C 계산이 불가능해진다
D p값이 전부 1이 된다
해설 d0 → 0 이면 s2p → s2, 즉 개별 측정을 그대로 쓰게 되어 보정 없는 t 검정 과 같아집니다. 반대로 d0 가 아주 크면 모두 s0 를 쓰게 됩니다.
🤔 확인 문제
brentq(lambda x: polygamma(1, x/2) - tri, 1e-3, 1e6) 가 하는 일은?
A polygamma 값을 출력한다
B 주어진 구간에서 식이 0이 되는 x 를 수치적으로 찾는다
C 1e-3 과 1e6 의 평균을 구한다
D tri 를 최소화한다
해설 근(root) 찾기 입니다. 공식으로는 풀리지 않는 polygamma(1, x/2) = tri 를, 구간을 좁혀 가며 수치적으로 풀어 d0 를 얻습니다.
← 11강 두 그룹 비교 ②
이 강의 완료 ✓
13강 → moderated t 와 p값