RNA-seq 정규화란? — 읽은 수를 '비교 가능한 값'으로 바꾸는 법 (정량·정규화·DESeq2 완전 정리)

정렬 후 읽은 수(raw count) → 깊이 보정 → 길이 보정 → 비교 가능한 값(TPM·DESeq2). RNA-seq 정규화의 흐름. (직접 그린 도식)

TL;DR — 시퀀싱한 read를 유전체에 정렬하고 나면, 유전자마다 몇 번 읽혔는지(raw count)를 셉니다. 그런데 이 날 카운트는 그대로 비교하면 안 됩니다. 샘플마다 시퀀싱 깊이가 다르고, 유전자마다 길이가 달라 긴 유전자가 더 많이 읽히기 때문입니다.

그래서 정규화(normalization)를 합니다. CPM은 깊이만, RPKM·FPKM은 깊이+길이, TPM은 깊이+길이를 보정하되 샘플 간 비교에 더 일관적입니다(열 합이 항상 같아 '비율'이 됨). 한 줄 요약 — 한 샘플 안에서 유전자끼리 비교하면 TPM, 조건 간 차등발현(DE)이면 raw count + DESeq2입니다.

가장 흔한 실수가 여기 있습니다 — DESeq2·edgeR 같은 DE 도구엔 정규화한 값(TPM·FPKM)이 아니라 '날 정수 카운트(raw count)'를 넣어야 합니다. 이 도구들은 자체 정규화(DESeq2의 median-of-ratios, edgeR의 TMM)로 깊이뿐 아니라 조성 편향까지 잡는데, TPM을 미리 넣으면 그 통계 모델이 깨집니다.

🔗 관련 글  ·  같은 RNA-seq 파이프라인: SAM/BAM 정렬 결과  ·  DESeq2 차등발현 분석(실전)

1. 정렬 다음 단계 — 읽은 수를 센다

정렬까지 끝났다면, 다음은 '어느 유전자가 몇 번 읽혔나'를 세는 일입니다.

  • 유전자 카운팅 — BAM (정렬 결과)을 받아 유전자마다 read 수를 셉니다(featureCounts·HTSeq). 결과는 유전자 × 샘플 정수 행렬(counts matrix)입니다.
  • 정렬 없이 바로 — Salmon·kallisto는 전사체에 빠르게 대응시키는 유사정렬(pseudo-alignment) 방식으로, 추정 카운트 + TPM + 유효 길이를 한 번에 냅니다.

참고로 RNA는 인트론이 잘려 있어 엑손과 엑손을 건너뛰는 read가 생기므로, 정렬엔 그걸 처리하는 스플라이스 인지(splice-aware) 정렬기(STAR·HISAT2)를 씁니다. (DNA용 BWA는 이 점프를 처리하지 못합니다.)

이렇게 얻은 날 카운트(raw count)가 모든 분석의 출발점입니다. 그런데 이걸 그대로 비교하면 안 됩니다.

2. 왜 날 카운트는 못 비교하나 — 두 가지 편향

날 카운트에는 '생물학적 차이'가 아닌 두 가지 기술적 편향이 섞여 있습니다.

  • ① 시퀀싱 깊이(라이브러리 크기) — 더 깊게 시퀀싱한 샘플은 모든 유전자에서 read가 많습니다. 그러니 샘플끼리(between-sample) 비교하려면 깊이를 맞춰야 합니다.
  • ② 유전자 길이 — 전장을 읽는 프로토콜에서 긴 유전자는 read가 더 많이 잡힙니다. 그러니 한 샘플 안에서 서로 다른 유전자(within-sample)를 비교하려면 길이를 맞춰야 합니다.

핵심은 — '무엇을 비교하느냐'에 따라 필요한 보정이 다르다는 것. 이게 지표 선택의 전부입니다.

3. 깊이만 보정 — CPM

가장 단순한 보정이 백만당 카운트(CPM, counts per million)입니다.

CPM = (유전자 카운트 ÷ 총 매핑 read 수) × 10⁶

총 read로 나눠 깊이(라이브러리 크기)만 맞춥니다. 길이는 보정하지 않으므로, 같은 샘플 안에서 길이가 다른 유전자끼리 비교하는 데는 부족합니다.

4. 길이까지 보정 — RPKM과 FPKM

길이까지 나눈 게 RPKM (Mortazavi 외 2008)과 FPKM (Trapnell 외 2010)입니다.

RPKM = 10⁹ × C ÷ (N × L)  —  C = 유전자 read 수, N = 총 read, L = 길이(bp). 즉 CPM ÷ 길이(kb).
  • RPKM (reads per kilobase per million) — read를 셉니다(단일말단 시절 표기).
  • FPKM (fragments per kilobase per million) — fragment를 셉니다. 양말단(paired-end)에서 한 fragment의 두 read를 이중으로 세지 않으려는 것일 뿐, 아이디어는 RPKM과 같습니다.

RPKM ≈ FPKM (read냐 fragment냐 차이). 둘 다 깊이+길이를 보정합니다.

그림 1. 네 지표 — CPM은 깊이만, RPKM·FPKM은 깊이+길이, TPM은 거기에 '열 합=100만'으로 샘플 간 비교까지.

5. 샘플 간 비교엔 TPM

RPKM·FPKM엔 약점이 있습니다 — 샘플마다 값의 총합(열 합)이 달라, 샘플끼리 비교할 때 기준이 흔들립니다. 이를 고친 게 TPM (transcripts per million)입니다. 비결은 나누는 순서입니다.

  1. 먼저 길이로 나눈다 → RPK = 카운트 ÷ 길이(kb)
  2. 그다음 그 샘플의 모든 RPK 합으로 나눠 × 10⁶ → TPM

RPKM/FPKM이 '깊이 먼저, 길이 나중'이라면 TPM은 '길이 먼저, 깊이 나중'입니다. 효과가 큽니다 — 모든 샘플에서 TPM 열 합이 항상 10⁶로 같아져, 각 값이 '백만 전사체 중 몇 개'라는 비율이 됩니다. 그래서 샘플 간 비교는 FPKM보다 TPM이 일관적입니다(Wagner 외 2012).

6. 가장 중요한 함정 — DE엔 raw count를 넣어라

여기서 학생이 가장 많이 틀립니다. 차등발현(DE) 분석 도구 DESeq2·edgeR엔 정규화한 값이 아니라 '날 정수 카운트(raw count)'를 넣어야 합니다.

  • 왜? 이 도구들은 카운트를 음이항분포(negative binomial)로 모델링하고, 내부에서 자체 정규화를 합니다 — DESeq2는 median-of-ratios (크기 인자), edgeR는 TMM. TPM·FPKM처럼 미리 정규화한 값을 넣으면, 더 이상 정수도 아니고 모델이 가정하는 평균–분산 관계가 깨져 통계가 무너집니다.
  • 무엇이 더 좋은가 — median-of-ratios·TMM은 깊이뿐 아니라 조성 편향(composition bias)까지 잡습니다. 소수의 초고발현 유전자가 read를 독식하면 나머지가 상대적으로 적게 잡히는데, 단순 CPM (총합 스케일링)으론 이걸 못 잡습니다. 그래서 DE에선 CPM이 아니라 median-of-ratios·TMM이 정석입니다(Love 외 2014; Robinson 외 2010).
⚠️ 흔한 오해 정리 — ❌ "TPM으로 정규화한 뒤 DESeq2에 넣는다"(모델이 깨짐) · ❌ "edgeR TMM이 유전자 길이까지 보정한다"(아니다 — TMM은 깊이+조성만; 길이는 같은 유전자를 두 조건에서 비교할 때 상쇄되어 DE엔 불필요).
그림 2. DE의 함정 — DESeq2·edgeR엔 raw count를 넣어야(자체 정규화로 깊이+조성 보정). TPM·FPKM을 넣으면 모델이 깨진다.

7. 어떤 질문엔 어떤 값을 쓰나

정리하면 질문이 지표를 정합니다.

질문무엇을 보정?권장
한 샘플 안에서 "유전자 A가 B보다 높나?"유전자 길이TPM (또는 FPKM)
조건 간 "유전자 A가 차등발현됐나?"깊이+조성raw count + DESeq2·edgeR
시각화(히트맵·PCA·클러스터링)분산 안정화log₂(x+1) 또는 DESeq2 VST·rlog

DESeq2의 VST·rlog는 저(低)카운트 유전자에서 분산이 평균에 끌려가는 문제를 완화하는 시각화·탐색용 변환입니다(DE 검정 자체는 raw 카운트 모델 그대로). 차등발현 시각화·농축분석으로 이어집니다.

💡 한 가지 더 — "샘플 간 비교엔 TPM"도 상대적 우위일 뿐입니다. 샘플 간 총 RNA 양·조성이 크게 다르면 TPM조차 정량 비교가 안전하지 않습니다(Zhao 외 2020). 엄밀한 조건 간 정량·DE는 결국 raw count + DESeq2입니다.
그림 3. 질문별 가이드 — 샘플 내 유전자 비교=TPM, 조건 간 DE=raw+DESeq2, 시각화=log₂·VST.

8. 단일세포는 다르다 — 길이 보정을 하지 않는다

단일세포 RNA-seq에선 보정 공식이 바뀝니다. 대부분의 단일세포 기법(10x 등)은 3′ 말단만 읽는 3′-태그 방식이라, 전사체가 길든 짧든 한 개로 세집니다 → 유전자 길이 편향이 없습니다. 따라서 TPM·길이 정규화를 쓰지 않습니다(이때 TPM = CPM).

대신 세포별 깊이 정규화(CPM류 · Seurat의 LogNormalize)나 모델 기반 SCTransform (Hafemeister·Satija 2019)을 씁니다. (Seurat 실전 참고.) 전장을 읽는 Smart-seq2는 길이 편향이 있어 또 다릅니다.

9. 핵심 정리

  • 정렬 뒤 유전자별 날 카운트(raw count)를 센다 → 그대로는 못 비교(깊이·길이 편향).
  • CPM = 깊이만 · RPKM/FPKM = 깊이+길이(read vs fragment 차이) · TPM = 길이 먼저·깊이 나중 → 열 합이 항상 10⁶라 샘플 간 비교에 일관적.
  • 질문이 지표를 정한다 — 샘플 내 유전자 비교 = TPM, 조건 간 DE = raw count + DESeq2·edgeR, 시각화 = log₂·VST.
  • ⚠️ DE엔 정규화 값 금지 — DESeq2·edgeR는 raw 카운트 + 자체 정규화(median-of-ratios·TMM)로 깊이+조성까지 잡는다. TMM은 길이 보정 안 함.
  • 단일세포(3′-태그)는 길이 편향이 없어 TPM 안 씀 → LogNormalize·SCTransform.

10. 다음 학습 추천

References

  1. Mortazavi, A., et al. (2008). Mapping and quantifying mammalian transcriptomes by RNA-Seq (RPKM). Nature Methods, 5(7), 621–628.
  2. Trapnell, C., et al. (2010). Transcript assembly and quantification by RNA-Seq (FPKM/Cufflinks). Nature Biotechnology, 28(5), 511–515.
  3. Li, B., et al. (2010). RNA-Seq gene expression estimation with read mapping uncertainty (TPM 정의). Bioinformatics, 26(4), 493–500.
  4. Wagner, G. P., Kin, K., & Lynch, V. J. (2012). Measurement of mRNA abundance using RNA-seq data: RPKM measure is inconsistent among samples (TPM). Theory in Biosciences, 131(4), 281–285.
  5. Love, M. I., Huber, W., & Anders, S. (2014). Moderated estimation of fold change and dispersion for RNA-seq data with DESeq2. Genome Biology, 15(12), 550.
  6. Robinson, M. D., McCarthy, D. J., & Smyth, G. K. (2010). edgeR. Bioinformatics, 26(1), 139–140. · Robinson, M. D., & Oshlack, A. (2010). A scaling normalization method (TMM). Genome Biology, 11(3), R25.
  7. Conesa, A., et al. (2016). A survey of best practices for RNA-seq data analysis. Genome Biology, 17, 13.
  8. Zhao, S., et al. (2020). Misuse of RPKM or TPM normalization when comparing across samples. RNA, 26(8), 903–909.

Pipette & Pipeline · A bio portfolio journal — bridging research, data, and industry.

이 글을 쓴 사람 Yumingming

생명융합공학과 박사과정.
Microbiome · Cosmetics · RNA Therapeutics · Bioinformatics를 공부하며,
실험(Wet Lab)과 데이터(Dry Lab)를 잇는 글을 논문(article) 기반으로 씁니다.

About · 더 알아보기 →

⚕️ 이 글은 학습·정보 제공 목적이며, 의학적 진단·치료·조언을 대체하지 않습니다. 건강·질병·치료에 관한 결정은 반드시 의사 등 전문가와 상의하세요. 자세한 내용은 면책조항을 참고해 주세요.