如何在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仍会为这些空水平生成曲线。以下是修正方案:
关键修改步骤
- 针对当前分析的变量,精准筛选出该变量无缺失的行
- 将该变量转换为因子并删除空水平(使用
droplevels()) - 用处理后的数据拟合生存模型
修改后的完整脚本
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
相关产品推荐
相关产品推荐

