在R中如何同时为coxph设置robust=T并在modelsummary中使用vcov='robust'?
解决coxph(robust=T)与modelsummary(vcov='robust')兼容及显著性星号问题
问题原因
当你在coxph()中设置robust=T时,模型内部已计算出稳健方差-协方差矩阵,但modelsummary()的vcov='robust'参数会尝试调用通用稳健方差提取方法,与coxph内置的稳健矩阵格式不兼容,因此报错。而使用vcov='classical'时,modelsummary()会提取普通方差矩阵,和coxph(robust=T)生成的稳健p值不匹配,导致显著性星号消失。
解决方案
方法一:直接传递模型内置的稳健方差矩阵
coxph(robust=T)的模型对象会将稳健方差矩阵储存在$var属性中,可直接将该矩阵传给modelsummary()的vcov参数:
示例代码
library(survival) library(modelsummary) # 构建带稳健标准误的Cox模型 data(lung) mod1 <- coxph(Surv(time, status) ~ age + sex, data = lung, robust = TRUE) mod2 <- coxph(Surv(time, status) ~ age + sex + ph.ecog, data = lung, robust = TRUE) models_list <- list("Model 1" = mod1, "Model 2" = mod2) # 汇总模型,传递每个模型的稳健方差矩阵 modelsummary(models_list, stars = TRUE, vcov = list(mod1$var, mod2$var) )
方法二:用自定义函数批量提取稳健方差
如果有多个模型,写一个简单的提取函数更高效:
# 自定义提取coxph稳健方差的函数 extract_cox_robust_vcov <- function(model) { model$var } # 调用modelsummary时指定该函数 modelsummary(models_list, stars = TRUE, vcov = extract_cox_robust_vcov )
额外说明
- 上述方法会让
modelsummary()基于稳健方差矩阵计算标准误、置信区间和p值,显著性星号可正常显示。 - 若不需要在
coxph()中预先设置robust=T,也可直接通过sandwich包在modelsummary()中计算稳健方差(需先安装sandwich包),示例:
# 不设置coxph的robust=T mod1 <- coxph(Surv(time, status) ~ age + sex, data = lung) mod2 <- coxph(Surv(time, status) ~ age + sex + ph.ecog, data = lung) # 用sandwich包计算稳健方差 modelsummary(models_list, stars = TRUE, vcov = sandwich::vcovHC )
内容的提问来源于stack exchange,提问作者hobsbawm
相关产品推荐
相关产品推荐

