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

蚂蚁巢拓扑实验生存分析图末尾竖线问题排查及原因咨询

生存曲线末端竖线的原因与修正方法

问题背景

开展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") 

末端竖线的原因

  1. Surv函数的状态定义完全颠倒:Surv()默认规则是status=1代表发生终点事件(死亡),status=0代表截尾(存活)。但你的数据里Statut=0是死亡、Statut=1是存活,和默认规则完全相反。
  2. 截尾标识错误:存活到实验结束的个体(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 08:52:44