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

如何为Weibull分布生成的生存数据同时添加右删失与区间删失

解决方案

你可以通过以下两步解决下限为负的问题,同时整合右删失与区间删失的逻辑:

1. 修正区间下限取值逻辑

生存时间的取值不可能小于0,直接用pmax()函数将区间下限限制在0即可,不需要删除小取值样本:

library(dplyr)
# 生成原始Weibull分布数据,加随机种子方便结果复现
set.seed(123) 
df <- data.frame(y = rweibull(1000, shape = 1.4, scale = 70))
# 先为所有样本生成基础区间上下限
df <- df %>% 
  mutate(
    y_lower = pmax(y - 5, 0), # 下限最小取0,直接解决负数问题
    y_upper = y + 5
  )

2. 整合右删失逻辑

你设定的右删失阈值为150,所有真实值大于150的样本,实际观测到的只有「生存时间大于150」的信息,所以需要把这部分样本的区间调整为右删失标准格式,同时可按需更新删失状态标记:

df <- df %>% 
  mutate(
    # 调整右删失样本的区间:仅知道真实值大于150
    y_lower = if_else(y > 150, 150, y_lower),
    y_upper = if_else(y > 150, Inf, y_upper),
    # 基础删失状态:1=右删失,0=非右删失
    cens = if_else(y > 150, 1, 0),
    # 也可以新增多分类删失标记,适配不同模型的输入要求:
    # 1=右删失,2=区间删失,0=完全观测
    cens_type = case_when(
      y > 150 ~ 1,
      TRUE ~ 2
    )
  )

逻辑说明

  • 对于y<5的样本,生成的区间为[0, y+5],属于左端点截尾的区间删失,符合实际观测逻辑——你只知道真实值落在0到y+5之间,不需要删除这部分样本
  • 最终输出的y_lower、y_upper、cens格式兼容所有主流R生存分析包(survival、flexsurv等)的区间删失拟合函数要求

可选调整:如果你不需要所有非右删失样本都为区间删失,可以随机抽样生成区间删失样本,比如设置30%的非右删失样本为区间删失,其余为完全观测:

df <- df %>% 
  mutate(
    # 随机标记30%的非右删失样本为区间删失
    is_interval = sample(c(TRUE, FALSE), n(), replace = TRUE, prob = c(0.3, 0.7)) & cens == 0,
    y_lower = case_when(
      cens == 1 ~ 150,
      is_interval ~ pmax(y-5, 0),
      TRUE ~ y
    ),
    y_upper = case_when(
      cens ==1 ~ Inf,
      is_interval ~ y+5,
      TRUE ~ y
    ),
    cens_type = case_when(
      cens == 1 ~ 1,
      is_interval ~ 2,
      TRUE ~ 0
    )
  )

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 21:36:03