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

如何在R的survfit函数中忽略缺失值以去除空类别生存曲线?

问题描述

我用R语言的survfit包批量处理多组文件,结合变量向量构建生存模型并绘制生存曲线。示例输入数据如下:

record_id   time    event   variable1   variable2
A   5   1   x1  y1
B   7   0   x2  
C   12  0   x3  y2
D   7   1       y3
F   8   1   x4  y4

数据中variable1和variable2存在缺失值,绘制生存曲线时会生成包含空类别的曲线(比如示例中会生成5条曲线,其中1条是空类别)。我希望只保留变量中实际存在的类别对应的生存曲线,尝试过在survfit和ggsurvplot中加na.omit,也用过!is.na筛选数据,但都没成功。以下是我的简化脚本:

files=c(file1,file2)
variables=c(variable1,variable2)

for (k in 1:length(files)){
     for(i in 1:length(variables)){
         tables[[k]]<-read.csv(files[k], header = T,sep = "\t", dec =".")
         fit[[k]] <- survfit(as.formula(paste0("Surv(time, event) ~", variables[i])),
                 data = tables[[k]])
  file_curve = paste(substr(files[k]),"_",variables[i],".tiff", sep="")
  tiff(file_curve)
print(
ggsurvplot(fit[[k]])
dev.off()

解决方案

问题核心在于:仅删除缺失值不会自动更新因子变量的水平(原变量若为因子,空类别对应的水平仍会保留),导致survfit仍会为这些空水平生成曲线。以下是修正方案:

关键修改步骤

  1. 针对当前分析的变量,精准筛选出该变量无缺失的行
  2. 将该变量转换为因子并删除空水平(使用droplevels())
  3. 用处理后的数据拟合生存模型

修改后的完整脚本

library(survival)
library(survminer)

files <- c("file1.csv", "file2.csv")  # 替换为实际文件名
variables <- c("variable1", "variable2")

# 初始化列表存储数据和模型结果
tables <- vector("list", length(files))
fit <- vector("list", length(files))

for (k in seq_along(files)){
    # 读取数据
    tables[[k]] <- read.csv(files[k], header = TRUE, sep = "\t", dec = ".")
    
    for(i in seq_along(variables)){
        # 提取当前变量名
        var <- variables[i]
        
        # 1. 筛选当前变量非缺失的行
        data_filtered <- tables[[k]][!is.na(tables[[k]][[var]]), ]
        
        # 2. 将当前变量转为因子并删除空水平
        data_filtered[[var]] <- droplevels(factor(data_filtered[[var]]))
        
        # 3. 拟合生存模型
        fit_current <- survfit(as.formula(paste0("Surv(time, event) ~ ", var)),
                               data = data_filtered)
        
        # 生成输出文件名(去除原文件后缀)
        file_curve <- paste0(substr(files[k], 1, nchar(files[k])-4), "_", var, ".tiff")
        
        # 绘制并保存生存曲线
        tiff(file_curve)
        print(ggsurvplot(fit_current))
        dev.off()
    }
}

说明

  • droplevels()会彻底移除因子中没有实际数据的水平,确保survfit仅针对存在的类别建模
  • 筛选数据时仅针对当前分析变量,避免误删其他变量有缺失但当前变量正常的行
  • 修正了原脚本中的语法错误(如print()括号不完整、dev.off()位置错误)

内容的提问来源于stack exchange,提问作者Perceval Vellosillo Gonzalez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 14:03:20