免疫检查点分析¶
一句话概述:免疫检查点(PD-1/PD-L1/CTLA-4等)是肿瘤抑制免疫应答的"刹车"分子,生信分析中通过表达谱数据评估其表达水平和免疫微环境,为免疫治疗预测提供依据。
核心知识点速览¶
| 概念 | 白话解释 |
|---|---|
| 免疫检查点 | 免疫系统的"刹车踏板",防止免疫细胞攻击自身细胞 |
| PD-1(PDCD1) | T细胞上的"疲劳信号"受体,被激活后T细胞就"躺平"了 |
| PD-L1(CD274) | 肿瘤细胞表面的"免死金牌",和PD-1结合后让T细胞"收手" |
| CTLA-4 | T细胞激活早期的"刹车",比PD-1更早阻断免疫应答 |
| ICI | 免疫检查点抑制剂,松开刹车让免疫系统攻击肿瘤 |
| TME | 肿瘤微环境,肿瘤周围的免疫细胞和基质细胞组成的"生态圈" |
| TIMER | 用RNA-seq估算肿瘤中各类免疫细胞浸润程度的工具 |
| CIBERSORT | 反卷积算法,从bulk RNA-seq推算免疫细胞组成 |
| ssGSEA | 单样本GSEA,用基因集评估免疫功能活性 |
| IPS | 免疫表型评分,预测免疫治疗应答的综合评分 |
一、核心免疫检查点分子¶
1.1 主要检查点分子列表¶
| 分子 | 基因名 | 分布 | 功能 | 对应药物 |
|---|---|---|---|---|
| PD-1 | PDCD1 | T细胞 | 抑制T细胞活化 | Nivolumab, Pembrolizumab |
| PD-L1 | CD274 | 肿瘤/APC | PD-1配体,传递抑制信号 | Atezolizumab, Durvalumab |
| PD-L2 | PDCD1LG2 | APC | PD-1另一个配体 | — |
| CTLA-4 | CTLA4 | T细胞 | 竞争B7,阻断T细胞共刺激 | Ipilimumab |
| LAG-3 | LAG3 | T/NK细胞 | 抑制T细胞增殖 | Relatlimab |
| TIM-3 | HAVCR2 | T/髓系细胞 | 促进T细胞耗竭 | 临床试验中 |
| TIGIT | TIGIT | T/NK细胞 | 抑制NK和T细胞功能 | Tiragolumab |
| VISTA | VSIR | 髓系/T细胞 | 抑制T细胞早期激活 | 临床试验中 |
| B7-H3 | CD276 | 肿瘤/APC | 抑制T细胞和NK细胞 | 临床试验中 |
| IDO1 | IDO1 | 肿瘤/APC | 色氨酸耗竭抑制免疫 | Epacadostat |
1.2 PD-1/PD-L1/CTLA-4机制图解¶
正常免疫应答:
APC → B7 → CD28(T细胞) → T细胞激活 → 杀死肿瘤
肿瘤免疫逃逸(装上"刹车"):
肿瘤细胞 → PD-L1 → PD-1(T细胞) → T细胞"躺平" → 肿瘤生长
APC → B7 → CTLA-4(T细胞) → T细胞不能激活
免疫治疗(松开"刹车"):
抗PD-1抗体 → 阻断PD-1/PD-L1 → T细胞恢复活力
抗CTLA-4抗体 → 阻断CTLA-4/B7 → T细胞正常激活
二、表达分析实操¶
2.1 从TCGA获取表达数据¶
# 使用TCGAbiolinks下载数据
library(TCGAbiolinks)
# 下载TCGA-LUAD(肺腺癌)RNA-seq数据
query <- GDCquery(
project = "TCGA-LUAD", # 项目名
data.category = "Transcriptome Profiling", # 数据类别
data.type = "Gene Expression Quantification",
workflow.type = "STAR - Counts" # 定量方法
)
GDCdownload(query) # 下载
data <- GDCprepare(query) # 整理数据
# 提取表达矩阵
expr_matrix <- assay(data, "tpm_unstrand") # TPM值
2.2 免疫检查点基因表达比较¶
library(ggplot2)
library(reshape2)
# 定义免疫检查点基因列表
checkpoint_genes <- c(
"PDCD1", "CD274", "PDCD1LG2", "CTLA4", # PD-1/PD-L1/PD-L2/CTLA-4
"LAG3", "HAVCR2", "TIGIT", "VSIR", # LAG-3/TIM-3/TIGIT/VISTA
"CD276", "IDO1" # B7-H3/IDO1
)
# 提取检查点基因表达
checkpoint_expr <- expr_matrix[checkpoint_genes, ]
checkpoint_expr <- log2(checkpoint_expr + 1) # log2转换
# 区分肿瘤和正常样本(TCGA样本条码规则)
sample_type <- ifelse(
substr(colnames(checkpoint_expr), 14, 15) == "01", "Tumor", "Normal"
)
# 转换数据格式
plot_data <- melt(t(checkpoint_expr)) # 转为长格式
colnames(plot_data) <- c("Sample", "Gene", "Expression")
plot_data$Type <- rep(sample_type, length(checkpoint_genes))
# 画箱线图
ggplot(plot_data, aes(x = Gene, y = Expression, fill = Type)) +
geom_boxplot(outlier.size = 0.5) + # 箱线图
stat_compare_means(aes(group = Type), method = "wilcox.test",
label = "p.signif", size = 3) + # 添加显著性标记
theme_bw() +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) + # 旋转X轴标签
labs(title = "Immune Checkpoint Gene Expression",
y = "log2(TPM + 1)") +
scale_fill_manual(values = c("Tumor" = "#E41A1C", "Normal" = "#377EB8"))
2.3 检查点基因相关性热图¶
library(corrplot)
# 计算检查点基因之间的相关性(只用肿瘤样本)
tumor_expr <- checkpoint_expr[, sample_type == "Tumor"]
cor_matrix <- cor(t(tumor_expr), method = "spearman") # Spearman相关
# 画相关性热图
corrplot(
cor_matrix,
method = "color", # 颜色填充
type = "upper", # 只显示上三角
tl.col = "black", # 标签颜色
tl.cex = 0.8, # 标签大小
addCoef.col = "black", # 显示相关系数
number.cex = 0.6, # 系数字体大小
col = colorRampPalette(c("blue", "white", "red"))(100) # 蓝白红配色
)
三、免疫浸润分析¶
3.1 CIBERSORT(22种免疫细胞反卷积)¶
# CIBERSORT在线版:https://cibersortx.stanford.edu/
# R版本可用 immunedeconv 包
library(immunedeconv)
# 运行CIBERSORT(需要TPM矩阵)
cibersort_result <- deconvolute(
expr_matrix, # 表达矩阵(TPM)
method = "cibersort", # 方法
arrays = FALSE # RNA-seq数据设FALSE
)
# 结果是每个样本中22种免疫细胞的比例
head(cibersort_result)
3.2 ssGSEA免疫功能评分¶
library(GSVA)
# 定义免疫相关基因集(或用IMvigor210等预定义集)
immune_genesets <- list(
CD8_T_cells = c("CD8A", "CD8B", "GZMA", "GZMB", "PRF1"),
NK_cells = c("NCR1", "KLRD1", "KLRK1", "NKG7"),
Macrophages = c("CD68", "CD163", "CSF1R", "MSR1"),
Tregs = c("FOXP3", "IL2RA", "CTLA4", "TNFRSF18"),
Antigen_presentation = c("HLA-A", "HLA-B", "HLA-C", "B2M", "TAP1")
)
# 运行ssGSEA
ssgsea_result <- gsva(
as.matrix(expr_matrix), # 表达矩阵
immune_genesets, # 基因集
method = "ssgsea", # ssGSEA方法
kcdf = "Gaussian" # 核密度函数
)
3.3 ESTIMATE算法¶
library(estimate)
# 计算免疫评分、基质评分和肿瘤纯度
# 需要先保存表达矩阵为GCT格式
write.table(expr_matrix, file = "expr_for_estimate.txt",
sep = "\t", quote = FALSE)
filterCommonGenes(input.f = "expr_for_estimate.txt",
output.f = "filtered.gct", id = "GeneSymbol")
estimateScore("filtered.gct", "estimate_scores.gct")
# 读取结果
scores <- read.table("estimate_scores.gct", skip = 2, header = TRUE)
# StromalScore: 基质评分
# ImmuneScore: 免疫评分
# ESTIMATEScore: 综合评分(越高纯度越低)
四、免疫治疗应答预测¶
4.1 IPS(免疫表型评分)¶
# IPS可以从TCIA数据库获取:https://tcia.at/
# 也可以自己计算
# IPS评分的四个组成部分:
# 1. MHC分子表达(抗原呈递能力)
# 2. 效应细胞浸润(CD8+ T细胞等)
# 3. 免疫抑制细胞(Treg、MDSC等)
# 4. 免疫检查点表达(PD-1、CTLA-4等)
# IPS范围:0-10,越高越可能响应免疫治疗
4.2 综合预测模型¶
# 整合多个免疫标志物构建预测模型
library(randomForest)
# 准备特征矩阵
immune_features <- data.frame(
PD_L1 = expr_matrix["CD274", ], # PD-L1表达
TMB = clinical$tmb, # 肿瘤突变负荷
CD8_infiltration = cibersort_result["T cells CD8", ], # CD8浸润
IFN_gamma = ssgsea_result["IFN_gamma_signature", ], # IFNγ信号
response = clinical$response # 治疗应答(标签)
)
# 建立随机森林模型
rf_model <- randomForest(response ~ ., data = immune_features,
ntree = 500, importance = TRUE)
importance(rf_model) # 查看变量重要性
常见报错与解决¶
| 报错信息 | 原因 | 解决方案 |
|---|---|---|
Gene not found in matrix | 基因名不匹配 | 检查是否用official symbol |
CIBERSORT: mixture file format | 输入矩阵格式不对 | 确保行=基因,列=样本 |
ESTIMATE: invalid GCT format | GCT文件格式错误 | 用filterCommonGenes()处理 |
ssGSEA: too few genes | 基因集太小 | 确保基因名匹配,检查基因集大小 |
TCGAbiolinks download failed | 网络问题 | 用代理或手动从GDC下载 |
速查表¶
# 免疫检查点分析流程
获取表达数据 → 提取检查点基因 → 差异比较 → 相关性分析
→ 免疫浸润评估 → 免疫治疗预测
# 主要分析工具
CIBERSORT: 22种免疫细胞反卷积(金标准)
TIMER: 6种免疫细胞浸润估算
ESTIMATE: 免疫/基质/纯度评分
ssGSEA: 免疫功能评分(灵活自定义)
MCPcounter: 8种免疫和2种基质细胞评分
# 核心检查点基因(面试必记)
PD-1: PDCD1 — T细胞表面
PD-L1: CD274 — 肿瘤/APC表面
CTLA-4: CTLA4 — T细胞表面
LAG-3: LAG3 — T/NK细胞
TIM-3: HAVCR2 — T/髓系细胞
# 免疫治疗应答预测标志物
PD-L1表达 > 50%: 可能应答(FDA批准标准)
TMB ≥ 10 mut/Mb: 可能应答(FDA批准标准)
MSI-H/dMMR: 可能应答
CD8+ T细胞浸润高: 热肿瘤,更可能应答
IFNγ信号活跃: 更可能应答
面试高频问题¶
Q1:PD-1和PD-L1的区别是什么?¶
答:PD-1(PDCD1)是受体,表达在T细胞表面;PD-L1(CD274)是配体,主要表达在肿瘤细胞和抗原呈递细胞表面。PD-L1和PD-1结合后,传递抑制信号给T细胞,导致T细胞功能被抑制("耗竭")。抗PD-1药物(如Nivolumab)阻断T细胞上的受体,抗PD-L1药物(如Atezolizumab)阻断肿瘤细胞上的配体,两种策略殊途同归。
Q2:为什么有些患者PD-L1高表达却对免疫治疗无效?¶
答:PD-L1高表达只是免疫逃逸的一个方面。无效的原因可能包括:①肿瘤缺乏新抗原(TMB低)——虽然刹车松了但"T细胞没找到目标";②T细胞被多重抑制(LAG-3、TIM-3等其他检查点代偿);③免疫抑制微环境(Treg、MDSC大量浸润);④MHC分子缺失(抗原呈递障碍);⑤Wnt/β-catenin等通路导致T细胞排斥。
Q3:如何用生信方法评估肿瘤免疫微环境?¶
答:①反卷积法(CIBERSORT/CIBERSORTx)——从bulk RNA-seq推算22种免疫细胞比例;②ssGSEA——用免疫基因集评估免疫功能;③ESTIMATE——计算免疫评分和基质评分;④TIMER——专门做TCGA肿瘤免疫浸润分析的在线工具;⑤单细胞RNA-seq——最精细但成本最高。如果有条件,推荐多种方法取交集。
Q4:什么是"热肿瘤"和"冷肿瘤"?¶
答:热肿瘤(Hot tumor)指免疫细胞特别是CD8+ T细胞大量浸润的肿瘤,通常PD-L1表达高、IFNγ信号活跃,更可能对免疫治疗应答。冷肿瘤(Cold tumor)指免疫细胞稀少的肿瘤,免疫治疗通常无效。生信上可通过CIBERSORT的CD8 T细胞比例、ESTIMATE的免疫评分、IFNγ信号基因集等来判断冷/热状态。
Q5:CTLA-4和PD-1通路的治疗时机有什么不同?¶
答:CTLA-4主要在T细胞激活的早期(淋巴结中)发挥抑制作用,竞争性结合B7分子阻止CD28的共刺激信号。PD-1主要在效应阶段(肿瘤微环境中)抑制已激活的T细胞。因此抗CTLA-4治疗(如Ipilimumab)"从源头放开刹车",抗PD-1治疗"在前线解除束缚"。联合使用(如Ipilimumab+Nivolumab)可以覆盖两个阶段,效果更强但副作用也更大。