Gene Set Enrichment Analysis · MSigDB Hallmark H

GSEA 教學手冊:以 HALLMARK_G2M_CHECKPOINT 為例

先用 10 個基因手算一次 Running ES,再看一張 5,000 個基因的真實尺度富集圖,最後學會怎麼判讀 NES、FDR 和 Leading-edge。

GSEA 在問什麼一群基因(基因集)在全基因排序榜上,是否整體偏向頂端或底端。
怎麼算由上往下走榜單,遇到成員加分、遇到非成員扣分,偏離 0 最遠的那一點就是 ES。
怎麼判讀NES 的正負代表方向,FDR 代表可信度,Leading-edge 基因是後續要驗證的對象。
01 · 觀念

GSEA 與 ORA:全名、原理與差別

GSEA 的全名是 Gene Set Enrichment Analysis(基因集富集分析)。ORA 的全名是 Over-Representation Analysis(過度代表性分析),一般說的「GO / KEGG 富集分析」多半就是 ORA。

ORA 會先用 padj < 0.05、|log2FC| > 1 這類門檻切出 DEG 清單,再看通路成員是否在清單裡過多。GSEA 不設門檻,而是把所有基因依差異指標排序,再問整個基因集是否集體往排序榜的某一端靠攏。

ORA 怎麼算

ORA 問的是:顯著基因清單中屬於某條通路的基因,是否比隨機抽樣預期的還多?它用超幾何檢定(hypergeometric test,相當於單尾的 Fisher's exact test)檢查下面這張 2×2 表。

在通路中不在通路中合計
顯著基因(DEG)kn − kn
非顯著基因K − kN − K − n + kN − n
合計KN − KN

N 是背景基因總數(universe),K 是通路的基因數,n 是 DEG 數,k 是兩者重疊的基因數。p 值是「從 N 個基因隨機抽 n 個,抽中至少 k 個通路成員」的機率:

p = Σi=kmin(n,K) C(K, i) · C(N−K, n−i) / C(N, n)

常見報表中的 GeneRatio = k/n,BgRatio = K/N。如果 GeneRatio 明顯大於 BgRatio,就表示這條通路在 DEG 中過度出現。

ORA 的四個限制:(1)結果依賴門檻,換一個 cutoff 結果就可能改變;(2)沒過門檻的基因全部被當成「沒變化」,log2FC 大小也不列入計算;(3)背景基因要用「實驗中實際偵測到的基因」,用全基因組當背景會讓 p 值偏小;(4)假設基因之間互相獨立,但同一條通路的基因常常是共同調控的。

兩種方法的比較

ORA(Over-Representation Analysis,門檻法)GSEA(Gene Set Enrichment Analysis,排序法)
輸入DEG 清單(離散)全基因排序榜 L(連續)
門檻必須設定,結果對門檻很敏感不需要
擅長捕捉少數劇烈變化的基因很多基因微幅但方向一致的變化
方向性通常需上調、下調分開跑NES 正負直接給出方向
統計檢定超幾何檢定 / Fisher's exact testRunning-sum ES + 置換檢定
代價快、簡單需要置換檢定,依賴完整表現資料
常用工具clusterProfiler enrichGO / enrichKEGG、DAVID、g:Profiler、EnrichrGSEA 桌面版、fgsea、clusterProfiler gseGO

Hallmark(MSigDB Collection H)從 MSigDB 數千條彼此重疊的基因集中,歸納出 50 條代表性強、重疊少的基因集,每條代表一個明確的生物狀態或過程。第一輪分析先跑這 50 條,多重檢定的負擔小,結果也比較容易聚焦。

02 · Standard workflow

GSEA 標準流程

  1. 準備表現資料與分組RNA-seq 計數矩陣或晶片表現矩陣,加上兩組表型標籤(例如 Tumor vs Normal)。GSEA 桌面版用 .gct 與 .cls。
  2. 計算排序指標 ri,產生排序榜 L常用 Signal-to-Noise(桌面版預設)、t 統計量、DESeq2 的 Wald stat,或 sign(log2FC) × −log10(p)。不建議只用 log2FC,因為它不考慮變異度。榜單依 r 由大到小排序,重複的基因符號要先合併。
  3. 載入基因集 (.gmt)例如人類 Hallmark 的 h.all.v2024.1.Hs.symbols.gmt(版本號以下載時為準)。通常只保留在資料中有 15–500 個成員的基因集。
  4. 沿榜單計算 Running ES,取得 ES成員(Hit)依 |ri|p 加權加分,非成員(Miss)平均扣分。標準加權為 p = 1(weighted)。
  5. 置換檢定,建立虛無分佈重複 1,000 次。每組 ≥ 7 個樣本時用 phenotype permutation(打亂樣本標籤,保留基因間相關性);樣本少或用 Preranked 時改用 gene_set permutation。
  6. 標準化與校正:NES、nominal p、FDR qNES 用同號虛無 ES 的平均值校正基因集大小的影響,FDR 則把所有基因集一起評估。
  7. Leading-edge 分析找出把 ES 推到峰值的核心基因子集。
  8. 判讀與驗證依 NES / FDR 篩選,檢查圖形型態,再挑 Leading-edge 基因做 qPCR、Western 或功能實驗。
03 · Example gene set

範例基因集:HALLMARK_G2M_CHECKPOINT

這條基因集有 200 個基因,代表「細胞完成 DNA 複製後、進入有絲分裂前」的檢查點與分裂機器,例如 Cyclin B–CDK1 複合體、啟動分裂的 PLK1 與 AURKA、DNA 損傷時踩煞車的 CHEK1、負責去磷酸化活化 CDK1 的 CDC25 家族,以及紡錘體組裝檢查點的 BUB1、MAD2L1、CDC20。

情境預期 NES生物學解讀
腫瘤 vs 正常組織正(+)細胞增殖旺盛,進入 M 期的細胞多,分裂相關基因整體上調
CDK4/6 抑制劑 vs DMSO負(−)細胞停在 G1,進不了 G2/M,這群基因整體下調
處理與細胞週期無關≈ 0,不顯著成員散佈在榜單各處,沒有集體偏向
注意:G2M_CHECKPOINT 與 E2F_TARGETS、MITOTIC_SPINDLE 的成員有部分重疊,三者常一起出現。判讀時應視為同一條「增殖」主線,而不是三個獨立的發現。
04 · Worked example, N = 10

十基因微縮演算:一步一步算出 ES

情境:腫瘤 vs 正常組織。下表 10 個基因已依排序指標 ri 由高到低排好。G2M 基因集在這 10 個基因中只有 3 個成員:PLK1、CDK1、CHEK1(綠色標記),其餘 7 個是非成員(低氧、糖解、細胞外基質、代謝相關)。

N = 10  NH = 3  NR = Σg∈S|rg|p = |2.0| + |1.0| + |−0.2| = 3.2 (p = 1)
Hit:Phit = |ri|p / NR   Miss:Pmiss = 1 / (N − NH) = 1/7 ≈ 0.1429
ES = 走完全程時 Running ES 偏離 0 的最大值(保留正負號)
加權 p:

← 圖可左右滑動 →

Rank基因屬於 S?ri這一步Running ES

點任一列可把該基因加入或移出基因集,圖和數字會即時重算。按「重設」回到 PLK1 / CDK1 / CHEK1。

p = 1 的精確分數試算表

Rank基因ri加 / 扣分Running ES(分數)小數
1VEGFAMiss+2.5−1/7−1/7−0.1429
2PLK1Hit+2.0+2.0/3.2 = +5/8−1/7 + 5/8 = 27/56+0.4821
3LDHAMiss+1.5−1/719/56+0.3393
4CDK1Hit+1.0+1.0/3.2 = +5/1673/112(峰值)+0.6518
5SLC2A1Miss+0.5−1/757/112+0.5089
6CHEK1Hit−0.2+|−0.2|/3.2 = +1/1657/112 + 7/112 = 4/7+0.5714
7COL1A1Miss−0.8−1/73/7+0.4286
8CD36Miss−1.2−1/72/7+0.2857
9ALBMiss−1.8−1/71/7+0.1429
10PPARGMiss−2.4−1/700.0000

為什麼最後一定回到 0:所有 Hit 的加分總和 = (2.0 + 1.0 + 0.2) / 3.2 = 1;所有 Miss 的扣分總和 = 7 × 1/7 = 1。兩者相減必為 0。

結果:ES = +73/112 ≈ +0.6518,峰值在 Rank 4(CDK1)。正值表示 G2M 成員偏向榜單頂端,也就是在腫瘤中上調。

Leading-edge:正向富集時取 Rank 1 到峰值之間的成員,所以是 PLK1、CDK1。CHEK1 雖然是成員,但位在峰值之後,而且 r 為 −0.2,對 ES 沒有貢獻,不屬於 Leading-edge。

試試看:把 p 切到 0,每個 Hit 都加 1/3。CHEK1 的加分會從 0.0625 變成 0.333,峰值移到 Rank 6,ES 變小(4/7 ≈ 0.5714)。這說明加權讓「變化大的成員」主導分數,而 p = 0 只看位置。
05 · Enrichment plot, N = 5,000

真實尺度的富集圖

把同樣的規則放大到 5,000 個基因、200 個 G2M 成員,就是 GSEA 論文常見的三層圖。以下是依三種情境模擬的資料。統計量在你的瀏覽器裡用 1,000 次 gene-set 置換即時算出。游標移到圖上可以看到每個位置的數值。

ES
–
NES
–
Nominal p
–
峰/谷位置 (rank)
–
Leading-edge 基因數
–

← 圖可左右滑動 →

置換虛無分佈:觀察到的 ES 落在哪裡

三層圖怎麼讀

圖層內容看什麼
上層:Running ES 曲線由左走到右的累計分數峰值在左、高於 0 代表正富集;谷值在右、低於 0 代表負富集。峰越尖、越靠邊,代表成員越集中在榜單一端。
中層:條碼每條直線是一個成員基因的位置條碼在左側密集代表上調,在右側密集代表下調,均勻散開代表沒有偏向。綠色底色是 Leading-edge 範圍。
下層:排序指標全基因的 ri 分佈左邊高於 0 是處理組較高,右邊低於 0 是對照組較高。零交叉點是上調與下調的分水嶺。
06 · Interpretation

判讀方式

統計門檻

指標意義常用門檻
ESRunning ES 偏離 0 的最大值不直接比較(會受基因集大小影響)
NESES ÷ 同號置換 ES 的平均值,可跨基因集比較|NES| > 1.5 算強(經驗值);正負代表方向
Nominal p單一基因集的置換 p 值,未做多重校正只作參考
FDR q依所有基因集的 NES 虛無分佈估計偽陽性比例< 0.25 探索性(GSEA 官方建議);< 0.05 嚴謹發表
FWER p最保守的整體錯誤率< 0.05 時結論非常穩

四種常見曲線型態

判讀檢查清單

寫進論文的範例句:「GSEA 顯示 HALLMARK_G2M_CHECKPOINT 在腫瘤組顯著富集(NES = 2.41,FDR q < 0.001),Leading-edge 基因包括 CDK1、PLK1、AURKA 與 CCNB2,提示腫瘤細胞 G2/M 轉換活躍。」數字請換成你自己的結果。
07 · Code

實作:R(fgsea + msigdbr)

# DESeq2 結果 res 已備妥(Tumor vs Normal),並已加上基因符號欄 symbol
library(msigdbr); library(fgsea); library(dplyr)

# msigdbr 10 版起,完整資料在另一個套件 msigdbdf,第一次用要先安裝
h  <- msigdbr(species = "Homo sapiens", collection = "H")   # 舊版用 category = "H"
pw <- split(h$gene_symbol, h$gs_name)

rk <- res |> as.data.frame() |> filter(!is.na(stat), !is.na(symbol)) |>
      group_by(symbol) |> summarise(stat = mean(stat))      # 重複基因合併
ranks <- sort(setNames(rk$stat, rk$symbol), decreasing = TRUE)

set.seed(42)
fg <- fgsea(pw, ranks, minSize = 15, maxSize = 500)
fg |> arrange(padj) |> select(pathway, NES, padj, size) |> head(10)

plotEnrichment(pw[["HALLMARK_G2M_CHECKPOINT"]], ranks) +
  ggplot2::labs(title = "HALLMARK_G2M_CHECKPOINT")
fg$leadingEdge[[which(fg$pathway == "HALLMARK_G2M_CHECKPOINT")]]

fgsea 的 padj 是 Benjamini–Hochberg 校正後的 p 值,與 GSEA 桌面版的 FDR q 算法不同,但用途相同。使用 GSEA 桌面版時,建議設定:Permutations 1000、Enrichment statistic weighted、Metric Signal2Noise、Max/Min size 500/15。

08 · Pitfalls

常見誤解

主題常見誤解正確說法
ES 的定義ES = argmax |Phit − Pmiss|argmax 回傳的是位置。ES 是 Running ES 偏離 0 最大的那個數值,並保留正負號;位置則是峰(谷)所在的 rank。
NESES 除以所有置換 ES 的平均值除以同號置換 ES 的平均值:正 ES 用正的虛無值,負 ES 用負的虛無值(取絕對值)。
FDRGSEA 的 FDR 就是 Benjamini–HochbergGSEA 原始 FDR 是用所有基因集的 NES 虛無分佈直接估計,不是 BH;BH 是 fgsea、clusterProfiler 的做法。
Leading-edge基因集的成員都是 Leading-edge只有排在峰值之前(正富集)或谷值之後(負富集)的成員才是。像第 4 節的 CHEK1 就不是。
Hallmark 數量有些條目重複或共用代碼Hallmark 共 50 條,彼此不重複;名稱都以 HALLMARK_ 開頭,例如 HALLMARK_PEROXISOME 與 HALLMARK_SPERMATOGENESIS 是兩條不同的基因集。