如何运行Kaplan-Meier分析比较两组生存差异并提取卡方p值
报错原因
你调用plot()的输入对象f是survdiff()返回的对数秩检验结果对象,不包含绘图所需的生存曲线坐标数据,因此触发坐标解析错误。KM曲线需要基于survfit()函数的拟合结果绘制。
正确实现流程
1. 依赖加载与数据预处理
合并group变量与ann文件后,整理生存分析所需的标准字段:
library(survival) library(tidyverse) library(survminer) # x为group和ann文件合并后的初始数据集 df <- x %>% rename(status = vital_status, time = months_to_event) %>% mutate(status = case_when( status == "LIVING" ~ 0, # 0代表删失 status == "DECEASED" ~ 1 # 1代表终点事件(死亡)发生 ))
2. 拟合KM曲线+组间差异检验
分别完成生存曲线拟合、组间差异检验及p值提取:
# 拟合KM生存曲线 km_fit <- survfit(Surv(time, status) ~ group, data = df) # 执行log-rank检验计算组间生存差异 log_rank_res <- survdiff(Surv(time, status) ~ group, data = df) # 提取卡方检验p值 p_val <- pchisq(log_rank_res$chisq, df = length(log_rank_res$n)-1, lower.tail = FALSE)
结合你提供的survdiff输出结果,计算得到p值约为0.073。
3. 绘制KM曲线
两种常用绘图方案可选:
- 基础R绘图版
plot(km_fit, lwd = 2, col = c("#2E86AB", "#A23B72"), xlab = "Time (Months)", ylab = "Survival Probability", main = "KM Survival Curves by Group") # 添加图例 legend("topright", legend = c("Group 0", "Group 1"), col = c("#2E86AB", "#A23B72"), lwd = 2) # 标注p值 text(x = max(df$time, na.rm = T)*0.7, y = 0.1, labels = paste0("Log-rank p = ", round(p_val, 3)))
- survminer美化版(科研场景更常用)
ggsurvplot(km_fit, data = df, pval = TRUE, # 自动添加log-rank检验p值 pval.method = TRUE, lwd = 2, palette = c("#2E86AB", "#A23B72"), xlab = "Time (Months)", ylab = "Survival Probability", legend.title = "Group", legend.labs = c("Group 0", "Group 1"), risk.table = TRUE) # 可选添加每组各时间点的剩余样本量风险表
内容的提问来源于stack exchange,提问作者melil
相关产品推荐
相关产品推荐

