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

加权生存分析中使用ggsurvfit添加删失标记报错求助

问题1:加权生存分析中添加删失标记的报错解决

报错核心原因:add_censor_mark()内部通过tidyr::uncount()根据权重重复删失点,但你生成的random_weight是连续型浮点数(rexp()生成),而uncount()要求权重为整数,因此触发精度丢失的转换错误。

解决方法1:用点的大小映射权重(推荐)

无需修改权重,直接通过aes(size = weights)用点的大小表示权重,避免调用uncount():

library(ggsurvfit)
library(tidyverse)

data(df_lung)
df_lung$random_weight = rexp(nrow(df_lung))

df_lung %>%
  survfit2(Surv(time, status) ~ sex, data = ., weight = random_weight) %>%
  ggsurvfit() +
  add_censor_mark(aes(size = random_weight)) +
  scale_size_continuous(name = "权重") # 可选:添加图例说明权重含义

解决方法2:将权重转换为整数(谨慎使用)

如果需要保留重复删失点的逻辑,可将权重缩放后取整(注意:这会改变权重绝对大小,仅适合可视化场景):

df_lung$scaled_weight = as.integer(df_lung$random_weight * 1000)

df_lung %>%
  survfit2(Surv(time, status) ~ sex, data = ., weight = scaled_weight) %>%
  ggsurvfit() +
  add_censor_mark()

问题2:ggsurvfit与survey包结合估算置信区间

survey包的svykm()支持复杂抽样设计下的加权生存分析,可通过以下步骤结合ggsurvfit可视化:

步骤1:构建调查设计并计算加权生存曲线

library(survey)
library(ggsurvfit)
library(tidyverse)

data(df_lung)
df_lung$random_weight = rexp(nrow(df_lung))

# 构建调查设计对象(需根据实际抽样方案修改id参数)
svy_design <- svydesign(
  id = ~1,
  weights = ~random_weight,
  data = df_lung
)

# 计算加权生存曲线及置信区间
svy_surv <- svykm(Surv(time, status) ~ sex, design = svy_design)

步骤2:转换数据后用ggsurvfit可视化

提取svykm结果并整理为ggsurvfit可识别的格式:

# 提取生存曲线数据(包含置信区间)
svy_surv_df <- broom::tidy(svy_surv) %>%
  mutate(strata = factor(strata, labels = c("男性", "女性"))) # 根据实际sex标签修改

# 使用ggsurvfit绘制
ggsurvfit(data = svy_surv_df, surv = ~estimate, time = ~time, strata = ~strata) +
  add_confidence_interval(aes(ymin = conf.low, ymax = conf.high)) +
  add_censor_mark(data = filter(svy_surv_df, n.event == 0), aes(size = weight)) +
  labs(x = "时间", y = "生存概率", color = "性别")

若需要更灵活的自定义,也可直接用ggplot原生函数绘制:

ggplot(svy_surv_df, aes(x = time, y = estimate, color = strata)) +
  geom_step() +
  geom_ribbon(aes(ymin = conf.low, ymax = conf.high, fill = strata), alpha = 0.2, color = NA) +
  geom_point(data = filter(svy_surv_df, n.event == 0), aes(size = weight), shape = 3) +
  labs(x = "时间", y = "生存概率", color = "性别", fill = "性别") +
  theme_minimal()

内容的提问来源于stack exchange,提问作者Kartoffelkeks

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 15:14:59