在R语言中绘制生存曲线并进行Log-Rank检验的技术问询
R语言生存曲线绘制与Log-Rank检验完整流程
1. 安装并加载所需包
先确保安装生存分析相关工具包,未安装则执行安装命令:
install.packages(c("survival", "survminer", "readxl", "tidyverse"))
加载包:
library(survival) library(survminer) library(readxl) library(tidyverse)
2. 导入Excel数据
假设你的数据文件名为survival_data.xlsx,放在当前工作目录下:
df <- read_excel("survival_data.xlsx")
3. 数据格式转换(宽格式转长格式)
你的数据是宽格式(每列对应一天的生存状态),生存分析需要长格式(每行对应一个样本的生存时间与结局)。以下代码提取每个样本的死亡时间和生存状态:
- 死亡时间:样本首次出现死亡的天数(若Day20仍存活,时间记为20)
- 生存状态:1=死亡,0=删失(Day20仍存活)
# 将Day0到Day20列转为长格式 df_long <- df %>% pivot_longer(cols = starts_with("Day"), names_to = "Day", values_to = "Status") %>% mutate(Day = as.numeric(str_remove(Day, "Day "))) %>% # 提取天数数值 group_by(Sample, Age, Sex, `Bacteria status`) %>% # 计算每个样本的生存时间和结局 summarize( Time = ifelse(any(Status == 1), min(Day[Status == 1]), 20), Event = ifelse(any(Status == 1), 1, 0) ) %>% ungroup()
注意:这里假设Day列中
1代表死亡、0代表存活。若你的标记规则相反,需将Status == 1替换为Status == 0。
4. 创建生存分析对象
用Surv()函数定义生存分析核心对象:
surv_obj <- Surv(time = df_long$Time, event = df_long$Event)
5. 绘制分组生存曲线
实验组vs对照组
fit_sample <- survfit(surv_obj ~ Sample, data = df_long) ggsurvplot(fit_sample, data = df_long, xlab = "天数", ylab = "生存概率", legend.title = "分组", pval = TRUE, # 显示Log-Rank检验p值 risk.table = TRUE, # 显示各时间点风险人数 ggtheme = theme_bw())
性别分组
fit_sex <- survfit(surv_obj ~ Sex, data = df_long) ggsurvplot(fit_sex, data = df_long, xlab = "天数", ylab = "生存概率", legend.title = "性别", pval = TRUE, risk.table = TRUE, ggtheme = theme_bw())
年龄分组
fit_age <- survfit(surv_obj ~ Age, data = df_long) ggsurvplot(fit_age, data = df_long, xlab = "天数", ylab = "生存概率", legend.title = "年龄", pval = TRUE, risk.table = TRUE, ggtheme = theme_bw())
细菌状态分组
fit_bacteria <- survfit(surv_obj ~ `Bacteria status`, data = df_long) ggsurvplot(fit_bacteria, data = df_long, xlab = "天数", ylab = "生存概率", legend.title = "细菌状态", pval = TRUE, risk.table = TRUE, ggtheme = theme_bw())
6. Log-Rank (Mantel-Cox) 检验
分别对各因素进行生存差异显著性检验:
实验组vs对照组
survdiff(surv_obj ~ Sample, data = df_long)
性别
survdiff(surv_obj ~ Sex, data = df_long)
年龄
survdiff(surv_obj ~ Age, data = df_long)
细菌状态
survdiff(surv_obj ~ `Bacteria status`, data = df_long)
检验结果中的
pvalue为Log-Rank检验的显著性值,若p<0.05则认为两组生存曲线存在显著差异。
内容的提问来源于stack exchange,提问作者m.rodwell
相关产品推荐
相关产品推荐

