蚂蚁巢拓扑实验生存分析图末尾竖线问题排查及原因咨询
生存曲线末端竖线的原因与修正方法
问题背景
开展10天蚂蚁巢拓扑结构(NTS、NTC、TS、TC)对比实验,死亡率极低,但用ggsurvplot绘制的生存曲线末端出现异常竖线,不符合预期效果。
数据集包含5列:
- ID:个体标识
- Statut:0代表死亡,1代表存活
- Time:死亡日期,存活至实验结束记为10
- Condition:拓扑分组信息
- Colony:蚁群编号(1-6)
使用的R脚本:
morta <- read.csv("mortalite.test.csv", head=TRUE, sep = ";") morta$Statut <- as.integer(morta$Statut) morta$Condition <- as.factor(morta$Condition) morta$Time <- as.numeric(morta$Time) table(morta$Statut) table(morta$Time) summary(morta) head(morta) complete_cases <- complete.cases(morta) sum(complete_cases) # 完整观测数 sum(!complete_cases) # 缺失观测数 surv_obj <- Surv(morta$Time, morta$Statut) fit_km <- survfit(surv_obj ~ Condition, data = morta) print(fit_km) logrank_testCondition <- survdiff(surv_obj ~ Condition, data = morta) logrank_testColony <- survdiff(surv_obj ~ Colony, data = morta) print(logrank_testCondition) print(logrank_testColony) ggsurvplot(fit_km, data = morta, risk.table = TRUE, pval=TRUE, conf.int = FALSE)+ labs(x = "Temps (en jour)", y = "Probabilité de survie")
数据集结构示例:
structure(list(ID = 1:20, Statut = c(0L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), Time = c(4, 8, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10), Condition = structure(c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("NTC", "NTS", "TC", "TS"), class = "factor"), Colony = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L)), row.names = c(NA, 20L), class = "data.frame")
末端竖线的原因
- Surv函数的状态定义完全颠倒:
Surv()默认规则是status=1代表发生终点事件(死亡),status=0代表截尾(存活)。但你的数据里Statut=0是死亡、Statut=1是存活,和默认规则完全相反。 - 截尾标识错误:存活到实验结束的个体(Time=10)本应标记为截尾,但你的设置让程序误判这些个体在第10天"发生死亡事件",结合低死亡率的实际情况,这种矛盾的标识导致生存曲线末端出现竖线(表示生存概率骤变)。
操作中的问题
未匹配Surv()函数的状态参数定义,既没有转换原始状态值,也没有指定自定义事件规则,直接用颠倒的状态值构建生存对象。
修正方法
方法1:反转Statut取值
将Statut的值转为符合默认规则的格式,1代表死亡,0代表存活:
# 反转Statut值 morta$Statut <- ifelse(morta$Statut == 0, 1, 0) # 重新构建生存对象并绘图 surv_obj <- Surv(morta$Time, morta$Statut) fit_km <- survfit(surv_obj ~ Condition, data = morta) ggsurvplot(fit_km, data = morta, risk.table = TRUE, pval=TRUE, conf.int = FALSE)+ labs(x = "Temps (en jour)", y = "Probabilité de survie")
方法2:指定Surv函数的事件规则
不修改原始数据,直接在Surv()中明确Statut=0代表死亡事件:
# 自定义事件规则,Statut=0时为死亡事件 surv_obj <- Surv(morta$Time, event = morta$Statut == 0) fit_km <- survfit(surv_obj ~ Condition, data = morta) ggsurvplot(fit_km, data = morta, risk.table = TRUE, pval=TRUE, conf.int = FALSE)+ labs(x = "Temps (en jour)", y = "Probabilité de survie")
验证要点
修正后查看fit_km的输出,确认n.censor(截尾数)对应存活到第10天的个体数,此时生存曲线末端应为水平状态(符合低死亡率的预期),竖线会消失。
内容的提问来源于stack exchange,提问作者lddc
相关产品推荐
相关产品推荐

