跳转至

免疫检查点分析

一句话概述:免疫检查点(PD-1/PD-L1/CTLA-4等)是肿瘤抑制免疫应答的"刹车"分子,生信分析中通过表达谱数据评估其表达水平和免疫微环境,为免疫治疗预测提供依据。

核心知识点速览

概念白话解释
免疫检查点免疫系统的"刹车踏板",防止免疫细胞攻击自身细胞
PD-1(PDCD1)T细胞上的"疲劳信号"受体,被激活后T细胞就"躺平"了
PD-L1(CD274)肿瘤细胞表面的"免死金牌",和PD-1结合后让T细胞"收手"
CTLA-4T细胞激活早期的"刹车",比PD-1更早阻断免疫应答
ICI免疫检查点抑制剂,松开刹车让免疫系统攻击肿瘤
TME肿瘤微环境,肿瘤周围的免疫细胞和基质细胞组成的"生态圈"
TIMER用RNA-seq估算肿瘤中各类免疫细胞浸润程度的工具
CIBERSORT反卷积算法,从bulk RNA-seq推算免疫细胞组成
ssGSEA单样本GSEA,用基因集评估免疫功能活性
IPS免疫表型评分,预测免疫治疗应答的综合评分

一、核心免疫检查点分子

1.1 主要检查点分子列表

分子基因名分布功能对应药物
PD-1PDCD1T细胞抑制T细胞活化Nivolumab, Pembrolizumab
PD-L1CD274肿瘤/APCPD-1配体,传递抑制信号Atezolizumab, Durvalumab
PD-L2PDCD1LG2APCPD-1另一个配体
CTLA-4CTLA4T细胞竞争B7,阻断T细胞共刺激Ipilimumab
LAG-3LAG3T/NK细胞抑制T细胞增殖Relatlimab
TIM-3HAVCR2T/髓系细胞促进T细胞耗竭临床试验中
TIGITTIGITT/NK细胞抑制NK和T细胞功能Tiragolumab
VISTAVSIR髓系/T细胞抑制T细胞早期激活临床试验中
B7-H3CD276肿瘤/APC抑制T细胞和NK细胞临床试验中
IDO1IDO1肿瘤/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 formatGCT文件格式错误用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)可以覆盖两个阶段,效果更强但副作用也更大。