You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 11:55:22