9강 / 20강
정규분위수 — 순위를 다시 숫자로
1등과 2등의 차이를, 500등과 501등의 차이보다 크게
순위로 바꾼 것까지는 좋았습니다. 그런데 순위에는 이상한 구석이 있어요. 20,000개 중 1등과 2등의 차이가 10,000등과 10,001등의 차이와 똑같이 "한 칸"이라는 것입니다.
그런데 우리 직관은 다르죠. 맨 끝에 있는 유전자들은 특별합니다. 가운데 있는 유전자들은 다 고만고만하고요. 양 끝을 벌리고 가운데를 붙여야 합니다.
그래서 VIPER 는 한 걸음 더 갑니다. 순위를 0 과 1 사이의 비율로 바꾼 뒤, 그 비율에 해당하는 정규분포의 값을 찾습니다. 이것을 정규분위수 변환 (quantile normalization to normal, 줄여서 qnorm)이라고 부릅니다.
순위 r · 전체 N → p = r / (N+1) → z = Φ⁻¹(p)
Φ⁻¹ 는 정규분포 누적함수의 역함수입니다. inv_cdf 가 그것입니다.
Python
브라우저에서 실행
🎮 순위가 종 모양 위에 얹히는 것을 보세요
슬라이더로 순위를 옮겨 보세요. 왼쪽의 줄 위에서 한 칸씩 움직일 때, 오른쪽의 종 모양 위에서는 얼마나 움직이는지 보십시오. 가운데에서는 거의 안 움직이고, 끝에서는 훌쩍 뜁니다.
이 함수는 10강의 aREA 에서 그대로 다시 씁니다.
Python
브라우저에서 실행
두 개의 z 를 만듭니다
7강에서 순위를 두 가지로 매긴다고 했습니다. 그 둘을 각각 z 로 바꾸면 VIPER 가 쓰는 두 값이 나옵니다.
| 이름 | 어떻게 만드나 | 무엇을 말하나 |
|---|---|---|
| t2 (방향성) | 부호 있는 순위 → z | 이 유전자가 어느 쪽으로 얼마나 갔나 |
| t1 (비방향성) | 절대값 순위 → z | 이 유전자가 방향과 무관하게 얼마나 흔들렸나 |
t2 는 −3 에서 +3 사이를 오갑니다. t1 은 가운데 유전자가 작고
양 끝의 유전자가 큰, 늘 0 이상인 값입니다. 다음 강의에서 이 둘을 합칩니다.
🤔 확인 문제
순위를 정규분위수(z)로 바꾸는 목적으로 가장 알맞은 것은?
해설 순위에서는 모든 이웃 간격이 똑같이 “한 칸” 입니다. 종 모양 위에 얹으면 꼬리 쪽 간격이 크게 벌어져, 극단에 있는 유전자가 마땅히 더 큰 발언권을 얻습니다.
🤔 확인 문제
정규분위수 변환에서
p = r / (N+1) 처럼 N 이 아니라 N+1 로 나누는 까닭은?해설
Φ⁻¹(0) = −∞, Φ⁻¹(1) = +∞ 입니다. N+1 로 나누면 p 가 열린 구간 (0,1) 안에 머물러 계산이 안전합니다.🤔 확인 문제
정규분위수 변환을 거치면 얻게 되는 계산상의 이점은?
해설 정규분포를 따르는 값들의 가중합은 다시 정규분포입니다. 이 성질 덕분에 aREA 는 순열 검정 없이 수식만으로 p 값을 냅니다 — GSEA 대비 속도의 비밀입니다.