1. 项目概述
在肿瘤研究中,DNA甲基化作为表观遗传学的重要调控机制,其异常变化与肿瘤的发生、发展和预后密切相关。TCGA(The Cancer Genome Atlas)数据库提供了大量肿瘤样本的甲基化数据,为研究者开展甲基化与肿瘤分子表型的关联分析提供了宝贵资源。本系列文章旨在分享基于TCGA甲基化数据进行数据挖掘和分子表型验证的完整流程代码。
在前两期内容中,我们已经完成了甲基化数据的基础分析,包括数据下载、预处理、差异甲基化位点分析等。本期将聚焦于更深入的生物学问题解析,主要包括:
- 特定基因甲基化信号值的可视化比较
- 生存分析(Kaplan-Meier曲线和Cox回归)
- AUC分析等高级分析方法
2. 数据准备与预处理
2.1 数据加载与整理
首先需要加载前期处理好的甲基化数据和临床数据:
r复制# 加载甲基化数据
load('./00.data/pangguangai_21paired_meLoad_data_412481.Rdata')
# 读取临床数据
dd = read.delim('../00.data/clinical.tsv')
2.2 数据质量控制
在进行深入分析前,需要对数据进行严格的质量控制:
- 样本筛选:确保只包含肿瘤样本
r复制sample$sample_type_fix[sample$sample_type_fix=='Primary Tumor']='Tumor'
exp = normalized_counts[,sample$sample_type_fix %in% "Tumor"]
- 临床数据处理:
- 转换生存时间为月份单位
- 定义事件状态(0=存活,1=死亡)
- 处理年龄分组
r复制meta$time = ifelse(meta$vital_status == 'Alive',meta$days_to_last_follow_up,meta$days_to_death)
meta$time = as.numeric(meta$time)/30
meta$event = ifelse(meta$vital_status== 'Alive',0,1)
meta$age = ceiling(abs(as.numeric(meta$days_to_birth))/365)
meta$age_group=ifelse(meta$age>median(meta$age,na.rm = T),'older','younger')
3. 甲基化信号值可视化分析
3.1 单个基因甲基化水平比较
我们可以通过折线图和柱状图展示特定基因在不同样本组中的甲基化水平差异。以IFFO1基因为例:
r复制# 设置颜色
color <- c("#E63863","#0228A5")
gene <- "IFFO1"
# 提取目标基因数据
marker_plot_sub = marker_plot[marker_plot$gene %in% gene,]
# 绘制折线图
ggplot(marker_plot_sub, aes(x = rowname, y = AVG, group = group, colour=group, shape= group, fill = group)) +
geom_line(size=0.5)+
geom_point(size=3)+
geom_text(aes(label=AVG),position = position_dodge(.9),vjust =-1,hjust=1.3)+
scale_shape_manual(values = c(24,22)) +
scale_fill_manual(values =color)+
scale_color_manual(values = color)+
labs(x="",y="β value", title = "IFFO1", subtitle = "Padj < 0.00001 & |logFC| >= 0.4") +
theme(
axis.text.x = element_text(size = 12,colour="black"),
axis.text.y = element_text(size = 12,colour="black"),
axis.title.x = element_text(size = 14),
axis.title.y = element_text(size = 12),
plot.title = element_text(hjust = 0.5, vjust=1),
panel.background = element_blank(),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
axis.line = element_line(colour = "black"),
panel.border = element_rect(colour = "black", fill=NA))
# 保存图片
ggsave(paste0("../03.plot/", "line_βval_IFFO1",".pdf"), width = 6*1.5, height = 6*1.5)
3.2 多基因甲基化水平比较
对于多个基因的甲基化水平比较,我们可以使用相同的方法:
r复制gene <- c("IFFO1","TMEM106A","SHANK2")
marker_plot_sub = marker_plot[marker_plot$gene %in% gene,]
# 设置因子水平确保顺序
marker_plot_sub$rowname <- factor(marker_plot_sub$rowname,
levels = c("cg08875705","cg01979888", "cg01493517",
"cg00983904", "cg23737737", "cg18222083",
"cg19548479", "cg20170028"))
# 绘制多基因折线图
ggplot(marker_plot_sub, aes(x = rowname, y = AVG, group = group, colour=group, shape= group, fill = group)) +
geom_line(size=0.5)+
geom_point(size=3)+
geom_text(aes(label=AVG),position = position_dodge(.9),vjust =-1,hjust=1.3)+
scale_shape_manual(values = c(24,22)) +
scale_fill_manual(values =color)+
scale_color_manual(values = color)+
labs(x="",y="β value", title = "TCGA BLCA", subtitle = "Padj < 0.00001 & |logFC| >= 0.4") +
theme(
axis.text.x = element_text(size = 12,colour="black"),
axis.text.y = element_text(size = 12,colour="black"),
axis.title.x = element_text(size = 14),
axis.title.y = element_text(size = 12),
plot.title = element_text(hjust = 0.5, vjust=1),
panel.background = element_blank(),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
axis.line = element_line(colour = "black"),
panel.border = element_rect(colour = "black", fill=NA))
4. 生存分析
4.1 Kaplan-Meier生存曲线分析
生存分析是评估甲基化位点与患者预后关系的重要方法。我们可以使用survival和survminer包进行Kaplan-Meier分析。
4.1.1 基础生存分析
r复制library(survival)
library(survminer)
# 创建生存对象
fit <- survfit(Surv(time,event) ~age_group, data = meta)
# 绘制生存曲线
ggsurvplot(fit,
pval = TRUE,
palette = c("#EB736B", "#57B5AB"),
title="age_group",
xlab="Time")
4.1.2 多因素生存分析
我们可以同时分析多个临床因素对生存的影响:
r复制# 性别和年龄的生存分析
sfit1=survfit(Surv(time, event)~gender, data=meta)
sfit2=survfit(Surv(time, event)~age_group, data=meta)
splots<- list()
splots[[1]]<- ggsurvplot(sfit1,pval =TRUE,data = meta,risk.table = TRUE)
splots[[2]]<- ggsurvplot(sfit2,pval =TRUE,data = meta,risk.table = TRUE)
# 排列图形
arrange_ggsurvplots(splots, print = TRUE,
ncol=2,nrow=1,risk.table.height=0.4)
4.2 基于甲基化水平的生存分析
我们可以分析特定甲基化位点的高/低甲基化组间的生存差异:
r复制# 选择目标甲基化位点
g='cg19548479'
# 根据中位数分组
meta$gene = ifelse(exp[g,]> median(exp[g,]),'high','low')
# 生存分析
sfit1=survfit(Surv(time, event)~gene, data=meta)
# 绘图
ggsurvplot(sfit1,pval =TRUE, data = meta, risk.table = TRUE)
4.3 批量生存分析
对于多个甲基化位点,可以进行批量生存分析:
r复制# 定义目标甲基化位点
gs=c("cg08875705","cg01979888", "cg01493517", "cg00983904",
"cg23737737", "cg18222083", "cg19548479", "cg20170028")
# 批量分析
splots <- lapply(gs,function(g){
meta$gene = ifelse(exp[g,]> median(exp[g,]),'high','low')
sfit1=survfit(Surv(time, event)~gene,data=meta)
ggsurvplot(sfit1,pval =TRUE, data = meta, risk.table = TRUE)
})
# 排列图形
arrange_ggsurvplots(splots, print = TRUE,
ncol=4,nrow=2,risk.table.height=0.4)
5. Cox比例风险回归分析
Cox回归可以评估多个因素对生存风险的独立影响。
5.1 单因素Cox回归
r复制# 创建生存对象
mySurv <- with(meta, Surv(time, event == "1"))
# 执行单因素Cox回归
unicox_results <- pbapply(exp, 1, function(gene){
group <- ifelse(gene > median(gene), "high","low")
survival_dat <- data.frame(group = group,
stage = meta$stage,
age = meta$age,
gender = meta$gender,
gene = gene,
stringsAsFactors = F)
# 拟合Cox模型
m <- coxph(mySurv ~ gender + age + stage + group, data = survival_dat)
# 提取结果
beta <- coef(m)
se <- sqrt(diag(vcov(m)))
tmp <- round(cbind(coef = beta,
se = se,
z = beta/se,
p = 1 - pchisq((beta/se)^2, 1),
HR = exp(beta),
HRCILL = exp(beta - qnorm(.975, 0, 1) * se),
HRCIUL = exp(beta + qnorm(.975, 0, 1) * se)), 3)
return(tmp["grouplow",])
})
unicox_results <- as.data.frame(t(unicox_results))
5.2 结果解读与筛选
我们可以筛选具有统计学意义的甲基化位点:
r复制# 筛选p<0.05的位点
table(unicox_results[,4] < 0.05)
unicox <- rownames(unicox_results)[unicox_results[,4] < 0.05]
# 保存结果
save(log_rank_p,unicox_results,file = './00.data//surve_cox_log_rank_p.Rdata')
write.csv(unicox_results,'./00.data//unicox_results_mean.csv')
6. 注意事项与常见问题
6.1 数据预处理注意事项
-
样本匹配:确保甲基化数据与临床数据的样本ID完全匹配,避免因样本不匹配导致的分析错误。
-
生存时间处理:
- 存活患者的生存时间应使用最后一次随访时间
- 死亡患者的生存时间使用死亡时间
- 建议将时间统一转换为月份单位,便于结果解释
-
缺失值处理:临床数据中常存在缺失值,需要根据具体情况决定是删除还是填补。
6.2 生存分析常见问题
-
中位数vs均值分组:使用中位数分组通常更稳健,但对极端值不敏感;使用均值分组对极端值更敏感。建议尝试两种方法比较结果。
-
多重检验校正:当分析大量甲基化位点时,需要进行多重检验校正(如FDR校正),避免假阳性结果。
-
比例风险假设:Cox回归要求满足比例风险假设,可通过检验残差或绘制Schoenfeld残差图验证。
6.3 可视化技巧
-
图形美化:
- 使用协调的颜色方案
- 调整文字大小确保可读性
- 添加适当的标题和注释
-
多图排列:当需要展示多个相关图形时,使用
arrange_ggsurvplots可以确保图形排列整齐。 -
图形格式:建议同时保存PDF和PNG格式,PDF适合出版印刷,PNG适合网页展示。
7. 高级分析扩展
7.1 时间依赖性ROC分析
除了传统的生存分析,我们还可以进行时间依赖性ROC分析,评估甲基化标志物在不同时间点的预测效能:
r复制library(timeROC)
# 以cg19548479为例
g='cg19548479'
meta$gene = exp[g,]
# 计算1年、3年、5年ROC
ROC <- timeROC(T=meta$time,
delta=meta$event,
marker=meta$gene,
cause=1,
times=c(12,36,60), # 1年、3年、5年
ROC=TRUE)
# 绘制ROC曲线
plot(ROC, time=12, col="red", title=FALSE)
plot(ROC, time=36, col="blue", add=TRUE)
plot(ROC, time=60, col="green", add=TRUE)
legend("bottomright",
c("1-year AUC","3-year AUC","5-year AUC"),
col=c("red","blue","green"),lty=1,lwd=2)
7.2 多因素Cox回归模型
在单因素分析基础上,可以构建包含多个显著甲基化位点的多因素Cox模型:
r复制# 选择显著位点
significant_sites <- rownames(unicox_results)[unicox_results[,4] < 0.05]
# 准备数据
covariates <- t(exp[significant_sites,])
colnames(covariates) <- paste0("site_",1:length(significant_sites))
surv_data <- cbind(meta[,c("time","event","age","gender","stage")], covariates)
# 构建多因素模型
multi_cox <- coxph(Surv(time, event) ~ . , data = surv_data)
# 结果摘要
summary(multi_cox)
7.3 甲基化风险评分
结合多个甲基化位点,可以构建甲基化风险评分系统:
r复制# 使用Cox回归系数作为权重
coefficients <- coef(multi_cox)[grepl("site_",names(coef(multi_cox)))]
risk_score <- covariates %*% coefficients
# 添加到meta数据
meta$risk_score <- as.numeric(risk_score)
# 根据风险评分中位数分组
meta$risk_group <- ifelse(meta$risk_score > median(meta$risk_score), "high","low")
# 绘制生存曲线
sfit_risk <- survfit(Surv(time, event) ~ risk_group, data = meta)
ggsurvplot(sfit_risk, pval = TRUE, risk.table = TRUE)
8. 完整分析流程总结
-
数据准备阶段:
- 下载TCGA甲基化数据和临床数据
- 数据预处理和质量控制
- 样本匹配和筛选
-
差异甲基化分析:
- 计算β值差异
- 筛选显著差异甲基化位点
- 基因注释和功能分析
-
可视化分析:
- 单个基因甲基化水平比较
- 多基因甲基化模式展示
- 热图或聚类分析
-
生存分析:
- Kaplan-Meier曲线分析
- Log-rank检验
- 单因素和多因素Cox回归
-
高级分析:
- 时间依赖性ROC分析
- 风险评分模型构建
- 独立验证集验证
-
结果解释与报告:
- 生物学意义解释
- 临床相关性分析
- 局限性和未来方向
9. 实际应用建议
-
生物标志物开发:通过上述分析可以筛选潜在的甲基化生物标志物,用于肿瘤早期诊断、预后预测或治疗反应预测。
-
机制研究:差异甲基化基因可为进一步研究表观遗传调控机制提供线索。
-
个性化医疗:甲基化风险评分可用于患者分层,指导个性化治疗决策。
-
数据整合:建议整合甲基化数据与基因表达、突变等其他组学数据,进行多组学联合分析。
-
独立验证:在TCGA数据中发现的结果,应在其他独立队列中进行验证,确保结果的可靠性。