9강 / 20강
섞어서 문턱을 세운다 — 우연이면 얼마나 나오나
귀무분포와 유의수준
8강에서 279개의 MI 값을 얻었습니다. 이제 어디서 자를까를 정해야 합니다.
"0.3 이상"처럼 눈대중으로 정할 수는 없습니다. 6강에서 봤듯이 MI 값은 칸 수와 샘플 수에 따라 통째로 오르내리니까요. 기준을 자료 스스로에게 물어야 합니다.
관계가 정말 없을 때 MI 는 얼마나 나오는가?
거기서 안 나오는 값이면 관계가 있는 것이다.
관계가 없는 자료를 만드는 법
간단합니다. 두 유전자 중 한쪽의 샘플 순서만 섞어 버리면 됩니다. 값의 분포는 그대로인데 짝만 흐트러지므로, 관계는 사라지고 나머지 조건은 똑같습니다.
섞을 때마다 값이 조금씩 다릅니다. 그 흔들림의 전체 모습이 바로 귀무분포입니다.
Python
브라우저에서 실행
귀무분포는 유전자마다 다르지 않습니다 — 순위 변환을 했기 때문에 모두 같은 균등분포거든요. 그래서 한 번만 뽑으면 됩니다.
Python
브라우저에서 실행
🎮 문턱을 옮겨 보기
히스토그램이 귀무분포입니다. α 를 바꾸면 문턱(주황 선)이 움직이고, 그에 따라 몇 개의 간선이 살아남는지와 그중 진짜가 몇 개인지가 함께 바뀝니다.
α 를 조이면 가짜가 줄지만 진짜도 놓치기 시작합니다. α = 0.001 이 이 자료에서는 좋은 자리입니다.
Python
브라우저에서 실행
섞기를 몇 번 해야 하나
α = 0.001 짜리 문턱을 2000번 섞기로 정하는 것은 사실 아슬아슬합니다. 0.999 분위수를 잡으려면 위쪽 2개의 값에 기대는 셈이거든요. 어림잡아 섞기 횟수 ≫ 1/α 여야 합니다.
실제 ARACNe-AP 는 두 가지로 해결합니다.
- 많이 섞는다 — 백만 번 이상 (자바로 멀티스레드니까 가능합니다)
- 꼬리를 함수로 맞춘다 — 상위 10%에 지수함수를 맞춰 놓고 α = 10⁻⁶ 같은 곳까지 외삽합니다
MI 의 귀무 꼬리가 지수분포에 가깝다는 사실을 이용합니다. ARACNe-AP 가 실제로 쓰는 요령입니다.
Python
브라우저에서 실행
🤔 확인 문제
귀무분포를 만들 때 한쪽 벡터의 순서만 섞는 이유는?
해설 섞기는 주변분포는 보존하고 결합만 끊는 조작입니다. 그래서 '같은 자료, 관계만 없는 세계'가 만들어지고, 편향·칸 수·샘플 수의 영향이 문턱에 자동으로 반영됩니다.
🤔 확인 문제
α = 0.001 인 문턱을 쓰면서 후보 쌍 279개를 검사했습니다. 우연히 넘는 쌍은 평균 몇 개일까요?
해설 279 × 0.001 ≈ 0.28개. 다중검정을 감안해도 충분히 엄격한 값입니다. 실제 규모(3천만 쌍)라면 α = 0.001 이 3만 개의 거짓 간선을 뜻하므로 훨씬 더 조여야 합니다 — ARACNe 가 α = 10⁻⁸ 같은 값을 쓰는 이유입니다.
🤔 확인 문제
α 를 극단적으로 조였는데도 가짜 간선 15개가 남았습니다. 이 15개의 정체는?
해설 DDX54 → MYC → NPM1 처럼 길이 있어서 정보가 새어 나온 쌍들입니다. 우연이 아니라 실제로 MI 가 크기 때문에 문턱으로는 절대 걸러지지 않습니다. 10강의 DPI 가 바로 이것을 지우는 도구입니다.