17강 / 20강
정규화와 로그 — 깊이가 다른 세포를 견주려면
왜 10,000 을 곱하고 왜 1 을 더하나
세포 A 에서 CD3D 가 10개, 세포 B 에서 20개 잡혔습니다. B 가 CD3D 를 두 배 켠 것일까요?
A 의 총 UMI 가 1,000 이고 B 가 4,000 이라면 이야기가 달라집니다. 비율로 보면 A 가 1%, B 가 0.5% 예요. A 가 더 켰습니다.
세포마다 잡힌 분자 수는 세포 크기 · RNA 양 · 방울의 운에 따라 열 배 넘게 차이 납니다. 그래서 먼저 눈금을 맞춥니다.
두 걸음
① 비율로 바꾼다 x / (그 세포의 총 UMI) × 10,000
② 로그를 씌운다 log(1 + 위 값)
| 걸음 | 왜 하나 | 안 하면 |
|---|---|---|
| ① 비율 | 세포 크기 차이를 없앤다 | 큰 세포가 모든 유전자에서 이긴다 |
| × 10,000 | 숫자를 사람이 읽을 만한 크기로 | 0.001 같은 값이 줄줄이 |
| ② 로그 | 드물게 아주 큰 값이 혼자 다 정하는 것을 막는다 | MALAT1 하나가 PCA 를 지배한다 |
| +1 | 0 의 로그를 피한다 | log(0) = 마이너스 무한대 |
이 한 번의 나눗셈이 결론을 뒤집습니다.
Python
브라우저에서 실행
로그는 '큰 값의 목소리를 줄이는' 장치입니다.
Python
브라우저에서 실행
다른 방법도 있다
| 방법 | 착상 | 언제 |
|---|---|---|
| LogNormalize (CP10K + log1p) | 위에서 한 것 | 기본값. 대부분 이걸로 충분 |
| SCTransform | 깊이와 분산의 관계를 모형으로 잡는다 | 깊이 차이가 아주 클 때 |
| pearson residuals | 기대값 대비 잔차 | 희소한 데이터에서 |
어느 것을 써도 세포 크기를 없앤다 는 목적은 같습니다. 처음에는 기본값으로 가고, 결과가 이상할 때 바꿔 보세요.
🤔 확인 문제
정규화에서 10,000 을 곱하는 이유는?
해설 비율만 쓰면 0.001 같은 값이 나옵니다. 10,000 을 곱하면
'만 분자당 몇 개' 라는 읽기 좋은 눈금이 돼요. 임의로 정한 상수입니다.
🤔 확인 문제
log1p 에서 +1 을 하는 이유는?해설 단일세포 행렬은 97% 이상이 0 입니다. log(0) 은 마이너스 무한대라
계산이 전부 깨져요. 1 을 더하면 0 은 0 이 됩니다.