가장 흔한 답은 상관계수입니다. 하나가 오를 때 다른 하나도 오르면 +1,
반대로 움직이면 −1, 무관하면 0. 간단하고 계산도 빠릅니다.
그런데 상관계수에는 치명적인 사각지대가 있습니다.
직선이 아닌 관계를 못 봅니다. 예를 들어 B 가 A 에 대해
U 자 모양으로 움직이면 — A 가 작을 때도 B 가 크고 A 가 클 때도 B 가 큰 관계 —
상관계수는 0 에 가깝게 나옵니다. 관계가 분명히 있는데 없다고 답하는 거죠.
스무고개로 생각하기
상호정보량(mutual information, MI) 은 다르게 묻습니다.
"B 의 값을 맞히는 스무고개를 한다고 하자.
A 의 값을 미리 알려 주면 질문을 몇 번 덜 해도 되는가?"
덜 해도 되는 질문 수 = 상호정보량. 전혀 도움이 안 되면 0.
관계의 모양은 상관없습니다. 직선이든 U자든 계단이든,
A 가 B 를 맞히는 데 도움이 되기만 하면 MI 가 큽니다.
ARACNE 가 상관계수 대신 MI 를 쓰는 이유가 이것입니다.
전사인자와 표적의 관계는 포화(더 넣어도 안 늘어남) 나
문턱(어느 선을 넘어야 켜짐) 같은 비선형이 흔하기 때문입니다.
MI 의 정의를 그대로 옮긴 코드입니다. 여덟 칸짜리 표 하나로 관계의 세기를 잽니다.
PythonRuns in your browser
실전에서는 칸 나누기 대신 순위를 쓴다
위 코드는 정의에 충실하지만 문제가 있습니다.
칸을 몇 개로 나눌지에 따라 값이 흔들리고, 유전자 쌍이 수백만 개면 너무 느립니다.
그래서 ARACNE 계열 도구는 보통 순위 변환 + 가우시안 근사를 씁니다.
순위-가우시안 상호정보량
1) 유전자마다 값을 순위로 바꾼다 (1등, 2등, 3등 …)
2) 순위를 표준정규 눈금으로 옮긴다 (van der Waerden 변환)
3) 그 위에서 상관계수 rho 를 구한다 (= 스피어만 상관)
4) MI = -0.5 * ln(1 - rho^2)
단조로운(오르내리는 방향이 일정한) 관계면 이 근사가 아주 잘 맞습니다.
이 방법의 장점은 행렬 곱 한 번으로 수백만 쌍을 동시에 계산할 수 있다는 것입니다.
브라우저 안에서 1,807 × 525 개의 쌍을 몇 초 만에 끝낼 수 있는 이유가 이것입니다.
순위로 바꾼 뒤의 상관이 곧 스피어만 상관이고, 거기서 MI 가 바로 나옵니다.
PythonRuns in your browser
🎮 상호정보량 실험실
관계의 모양을 바꿔 가며 상관계수와 MI 가 어떻게 달라지는지 보세요.
그다음 실제 TCGA 유전자 쌍으로도 확인할 수 있습니다.
상호정보량 실험실 — 상관계수가 놓치는 관계 찾기
Loading…
🤔 Check yourself
상호정보량이 상관계수보다 나은 점은?
Answer 상관계수는 직선 관계의 세기만 잽니다. MI 는 'A 를 알면 B 를 얼마나 잘 맞히나' 를 재므로 U자·계단·포화 같은 비선형 관계도 잡습니다. 전사 조절에는 이런 관계가 흔합니다.
🤔 Check yourself
두 변수가 완전히 무관할 때 MI 값은?
Answer 무관하면 P(x,y) = P(x)·P(y) 이므로 로그 안이 1 이 되어 log 1 = 0, 즉 MI = 0 입니다. '알려 줘도 스무고개 질문이 하나도 안 줄어든다'는 뜻이죠.
🤔 Check yourself
MI = -0.5 * ln(1 - rho**2) 라는 근사식을 쓰는 대가는?
Answer 순위 변환은 순서를 보존하므로 단조 관계에는 강하지만, U자처럼 오르다 내리는 관계는 순위 상관이 0 에 가까워져 놓칩니다. 속도를 얻는 대신 치르는 대가이고, 실제 도구들도 같은 절충을 합니다.