肿瘤分子亚型分类¶
一句话说明¶
同一种癌症(如乳腺癌)在分子层面可以分成几个完全不同的亚型,它们的预后和治疗方案截然不同——分子亚型分类就是用基因表达等组学数据给肿瘤"精准分型"。
核心知识点¶
1. 为什么需要分子亚型¶
- 同一器官的肿瘤,分子机制可能完全不同(白话:都叫"感冒",但有的是病毒有的是细菌)
- 分子亚型指导治疗选择:如 HER2+ 乳腺癌用靶向药,三阴性乳腺癌用化疗/免疫
- 分子亚型预测预后:Luminal A 乳腺癌预后好,Basal-like 预后差
2. 经典分子亚型举例¶
| 癌种 | 亚型 | 分类依据 |
|---|---|---|
| 乳腺癌 | Luminal A/B, HER2+, Basal-like, Normal-like | PAM50 基因表达 |
| 结直肠癌 | CMS1-4 | 基因表达(CMS分类器) |
| 胃癌 | EBV, MSI, GS, CIN | TCGA 四分类 |
| 胶质母细胞瘤 | Proneural, Classical, Mesenchymal | 基因表达 |
| 膀胱癌 | Luminal, Basal, Neuronal | 基因表达 |
3. 分类方法¶
- 监督分类:用已知亚型的数据训练分类器(如 PAM50 的 50 个基因做最近质心法)
- 无监督分类:NMF(非负矩阵分解)、共识聚类发现新亚型
- 整合分类:结合多组学数据(突变+表达+甲基化+CNV)做综合分型,如 iCluster
4. 关键分析工具¶
- NMF:
NMFR包 /sklearn.decomposition - 共识聚类:
ConsensusClusterPlusR包 - PAM50:
genefuR包 - CMS 分类:
CMSclassifierR包 - 多组学整合:
iClusterPlus,MOFA+,SNF
实战代码¶
# === 基于 NMF 的肿瘤分子亚型发现 ===
library(NMF) # 非负矩阵分解包
# 1. 准备基因表达矩阵(非负值,如 TPM)
expr <- as.matrix(read.table(
"expression_tpm.txt", # 输入TPM矩阵
header = TRUE, row.names = 1))
# 筛选高变异基因(减少噪音)
gene_var <- apply(expr, 1, var) # 计算每个基因的方差
top_genes <- names(sort(gene_var, # 按方差排序
decreasing = TRUE))[1:2000] # 取前2000
expr_sub <- expr[top_genes, ] # 子集矩阵
# 2. 运行 NMF(测试不同 k 值)
estim <- nmf(expr_sub, # 输入矩阵
rank = 2:6, # 测试2-6个亚型
method = "brunet", # Brunet算法
nrun = 30, # 每个k运行30次
seed = 42) # 随机种子
# 3. 选择最优 k 值
plot(estim) # 绘制cophenetic等指标
# 选择 cophenetic 系数最高且开始下降前的 k
# 4. 用最优 k 运行最终 NMF
best_k <- 4 # 假设最优k=4
final_nmf <- nmf(expr_sub, # 输入矩阵
rank = best_k, # 最优k
method = "brunet", # 算法
nrun = 100, # 100次运行取共识
seed = 42)
# 5. 提取亚型分配
subtypes <- predict(final_nmf) # 每个样本的亚型
table(subtypes) # 各亚型样本数
# 6. 可视化
consensusmap(final_nmf) # 共识矩阵热图
# === 乳腺癌 PAM50 分类 ===
library(genefu) # 基因签名包
# PAM50 分类
pam50_result <- molecular.subtyping(
sbt.model = "pam50", # PAM50模型
data = t(expr), # 转置(样本为行)
annot = gene_annotation, # 基因注释(需要EntrezID)
do.mapping = TRUE # 自动映射基因ID
)
# 查看结果
table(pam50_result$subtype) # 各亚型人数
# === 共识聚类确定最优分型数 ===
from sklearn.cluster import KMeans # K-Means聚类
import numpy as np # 数值计算
import pandas as pd # 数据处理
def consensus_clustering(data, k_range=range(2, 7), n_iter=100):
"""简化版共识聚类"""
results = {} # 存储结果
n_samples = data.shape[0] # 样本数
for k in k_range: # 遍历每个k值
consensus = np.zeros((n_samples, n_samples)) # 共识矩阵
count = np.zeros((n_samples, n_samples)) # 共现次数
for _ in range(n_iter): # 重复n次
# 随机抽样80%的样本
idx = np.random.choice(n_samples,
size=int(0.8 * n_samples),
replace=False)
sub_data = data[idx] # 子集数据
# K-Means 聚类
km = KMeans(n_clusters=k, n_init=10, random_state=None)
labels = km.fit_predict(sub_data) # 聚类标签
# 更新共识矩阵
for i in range(len(idx)): # 遍历被选中的样本
for j in range(i+1, len(idx)):
count[idx[i], idx[j]] += 1 # 共同被选中次数
if labels[i] == labels[j]: # 如果分在同一类
consensus[idx[i], idx[j]] += 1 # 共识+1
# 归一化
consensus = np.divide(consensus, count,
where=count > 0) # 共识/共现
consensus += consensus.T # 对称化
np.fill_diagonal(consensus, 1) # 对角线=1
# 计算 CDF 下面积(评估聚类稳定性)
flat = consensus[np.triu_indices(n_samples, k=1)]
results[k] = {"matrix": consensus, "auc": np.mean(flat)}
print(f"k={k}, CDF AUC={np.mean(flat):.4f}")
return results
# 使用
# result = consensus_clustering(expression_matrix.T)
面试常问点¶
★ 乳腺癌的 PAM50 分型包括哪些亚型?¶
参考答案:PAM50 用 50 个基因的表达水平将乳腺癌分为 5 个亚型:(1) Luminal A——ER+/HER2-,低增殖,预后最好,内分泌治疗有效;(2) Luminal B——ER+,高增殖,预后较差,可能需要化疗;(3) HER2-enriched——HER2 扩增/过表达,靶向治疗(曲妥珠单抗);(4) Basal-like——多为三阴性,预后差,化疗/免疫治疗;(5) Normal-like——类似正常乳腺组织,临床意义有争议。
★ NMF 和 K-Means 聚类有什么区别?¶
参考答案:NMF(非负矩阵分解)将原始矩阵分解为两个非负矩阵的乘积,每个样本是多个"基础模式"的加权组合,允许样本同时属于多个模式(软分配)。K-Means 是硬分配,每个样本只属于一个簇。对于肿瘤亚型发现,NMF 更适合,因为肿瘤可能具有多种分子特征的混合。另外 NMF 的基底矩阵(W 矩阵中的列)可以解释为每个亚型的"基因表达程序",生物学可解释性好。
速查卡片¶
| 问题 | 答案 |
|---|---|
| 分子亚型目的 | 精准分型指导治疗和预后 |
| 乳腺癌分型 | PAM50(5 种亚型) |
| 结直肠癌分型 | CMS1-4 |
| NMF 用途 | 发现新的分子亚型 |
| 共识聚类 | 确定最优亚型数 k |
| PAM50 工具 | genefu R包 |
| CMS 工具 | CMSclassifier R包 |
| 多组学分型 | iClusterPlus, MOFA+ |
| 选 k 的指标 | Cophenetic 系数、CDF AUC |
| 临床意义 | 不同亚型不同治疗方案 |