如何为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
相关产品推荐
相关产品推荐

