在map2()函数中指定predict.coxph的type参数问题
嘿,我来给你捋清楚怎么在嵌套数据里完成coxph模型的type="expected"预测,还能算出个体生存概率——就用你提到的mpg数据集来做完整示例:
嵌套数据构建coxph模型并计算生存概率
1. 先给mpg补全生存分析所需的数据
mpg本身没有生存时间和事件状态这类coxph必需的变量,我们先模拟一组符合要求的数据:
library(tidyverse) library(survival) set.seed(123) # 固定随机种子保证结果可复现 mpg_surv <- mpg %>% mutate( surv_time = sample(1:100, n(), replace = TRUE), # 模拟生存时长 status = sample(c(0,1), n(), replace = TRUE, prob = c(0.3, 0.7)) # 模拟事件发生状态(1=事件发生) ) %>% # 按制造商分组嵌套数据,和你做的训练集嵌套逻辑一致 nest(data = -manufacturer)
2. 用嵌套数据批量训练coxph模型
这里用map(或者你习惯的map2,如果需要绑定更多参数)把每个嵌套数据集对应的模型训练好,并存到嵌套表里:
mpg_models <- mpg_surv %>% mutate( model = map(data, ~ coxph(Surv(surv_time, status) ~ displ + hwy, data = .x)) )
3. 批量执行type="expected"预测并计算生存概率
按照你查到的文档,个体生存概率等于exp(-expected),我们用map2把每个模型和对应的数据集绑定,避免预测时数据错配:
mpg_predictions <- mpg_models %>% mutate( # 对每个模型和对应数据集执行预测,指定type="expected" expected_risk = map2(model, data, ~ predict(.x, newdata = .y, type = "expected")), # 把预测结果和原始数据合并,计算生存概率 final_results = map2(data, expected_risk, ~ .x %>% mutate( expected = .y, survival_prob = exp(-expected) )) ) # 展开嵌套查看结果 mpg_predictions %>% unnest(final_results) %>% select(manufacturer, displ, hwy, surv_time, status, expected, survival_prob) %>% head()
几个关键提醒
- 一定要保证
predict的newdata是对应模型的数据集,用map2绑定模型和数据就能避免维度不匹配或者数据错配的问题 - 你查的文档完全正确:
type="expected"返回的是累积风险的期望值,所以exp(-expected)就是个体的生存概率,这个逻辑没问题 - 如果你的“但……”是遇到了报错,比如变量缺失、模型调用失败,可以检查嵌套数据的结构,确保每个子数据集都包含模型里用到的所有变量
内容的提问来源于stack exchange,提问作者Wendy Tate
相关产品推荐
相关产品推荐

