R中mice()插补数据运行crr() Fine-Gray模型遇Cov1参数报错
问题核心原因
cmprsk::crr()和coxph()的参数逻辑存在本质差异:
coxph()支持formula接口,with.mids()遍历插补集时会自动把当前插补集的变量加载到临时运行环境,直接写变量名就能读取到无缺失的插补值cmprsk::crr()不支持formula接口,cov1参数要求手动传入与ftime/fstatus行序完全匹配的协变量矩阵。你之前在表达式中传入的原始数据集test1、提前在全局环境构造的cov1都不属于with.mids的临时环境,模型会直接读取全局环境下带缺失值的原始数据;直接传入mids对象、mids$imp这类list结构的对象不符合矩阵/数据框的输入要求,自然报维度错误;基于长格式插补数据构造的协变量矩阵行数是原始数据的数倍,和单插补集的生存数据长度不匹配,完全无法对应。
解决方案
方案1:手动遍历插补集适配原生crr()
不需要硬套with.mids语法,手动循环提取每个插补集构造协变量矩阵,再转成mira对象供pool合并即可,代码如下:
library(survival) library(mice) library(cmprsk) test1 <- as.data.frame(list(time=c(4,3,1,1,2,2,3,5,2,4,5,1, 4,3,1,1,2,2,3,5,2,4,5,1), status=c(1,1,1,0,2,2,0,0,1,1,2,0, 1,1,1,0,2,2,0,0,1,1,2,0), x=c(0,2,1,1,NA,NA,0,1,1,2,0,1, 0,2,1,1,NA,NA,0,1,1,2,0,1), sex=c(0,0,0,NA,1,1,1,1,NA,1,0,0, 0,0,0,NA,1,1,1,1,NA,1,0,0))) dat <- mice(test1,m=10, seed=1982) # 存储每个插补集的模型结果 fg_fits <- vector("list", dat$m) for(i in seq_len(dat$m)){ # 提取第i个完成插补的无缺失数据集 imp_dat <- complete(dat, i) # 基于当前插补集构造协变量矩阵 cov_mat <- as.matrix(imp_dat[, c("x", "sex")]) fg_fits[[i]] <- crr( ftime = imp_dat$time, fstatus = imp_dat$status, cov1 = cov_mat, failcode = 1, cencode = 0, variance = TRUE ) } # 转换为mira类型后合并结果 fg_res <- as.mira(fg_fits) summary(pool(fg_res, dfcom = nrow(test1) - ncol(cov_mat) - 1))
运行后不会再出现缺失值剔除提示,结果可正常合并。
方案2:使用兼容mice流程的Fine-Gray模型函数
直接换用支持formula接口的竞争风险函数,写法和coxph完全一致,不需要额外适配:
- 用
riskRegression::FGR():原生支持Fine-Gray模型,formula写法直接适配with.mids
library(riskRegression) models.FG <- with(dat, FGR(Hist(time, status) ~ x + sex, cause = 1)) summary(pool(models.FG))
- 用
survival包原生的finegray()加权法:先构造Fine-Gray权重数据集,再用加权Cox模型得到等价结果,完全兼容现有mice流程
models.FG_surv <- with(dat, { fg_wt_data <- finegray(Surv(time, status) ~ x + sex, data = data.frame(time, status, x, sex), etype = 1) coxph(Surv(fgstart, fgstop, fgstatus) ~ x + sex, weight = fgwt, data = fg_wt_data) }) summary(pool(models.FG_surv))
内容的提问来源于stack exchange,提问作者Algot
相关产品推荐
相关产品推荐

