加权生存分析中使用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
相关产品推荐
相关产品推荐

