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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:17:42