跳转至

肿瘤分子亚型分类


一句话说明

同一种癌症(如乳腺癌)在分子层面可以分成几个完全不同的亚型,它们的预后和治疗方案截然不同——分子亚型分类就是用基因表达等组学数据给肿瘤"精准分型"。


核心知识点

1. 为什么需要分子亚型

  • 同一器官的肿瘤,分子机制可能完全不同(白话:都叫"感冒",但有的是病毒有的是细菌)
  • 分子亚型指导治疗选择:如 HER2+ 乳腺癌用靶向药,三阴性乳腺癌用化疗/免疫
  • 分子亚型预测预后:Luminal A 乳腺癌预后好,Basal-like 预后差

2. 经典分子亚型举例

癌种亚型分类依据
乳腺癌Luminal A/B, HER2+, Basal-like, Normal-likePAM50 基因表达
结直肠癌CMS1-4基因表达(CMS分类器)
胃癌EBV, MSI, GS, CINTCGA 四分类
胶质母细胞瘤Proneural, Classical, Mesenchymal基因表达
膀胱癌Luminal, Basal, Neuronal基因表达

3. 分类方法

  • 监督分类:用已知亚型的数据训练分类器(如 PAM50 的 50 个基因做最近质心法)
  • 无监督分类:NMF(非负矩阵分解)、共识聚类发现新亚型
  • 整合分类:结合多组学数据(突变+表达+甲基化+CNV)做综合分型,如 iCluster

4. 关键分析工具

  • NMFNMF R包 / sklearn.decomposition
  • 共识聚类ConsensusClusterPlus R包
  • PAM50genefu R包
  • CMS 分类CMSclassifier R包
  • 多组学整合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
临床意义不同亚型不同治疗方案