flexsurvspline中offset函数报错求助(R 4.4.0 flexsurv 2.3)
问题与解决方案
问题背景
在Windows环境(RStudio 2024.04.0、R 4.4.0)下,使用flexsurv 2.3版本的flexsurvspline函数时,尝试通过offset()固定回归系数权重为1,代码在旧版本flexsurv中可正常运行,但升级后抛出错误:
Error in model.matrix.default(forms[[i]], m) :
model frame and formula mismatch in model.matrix()
问题代码如下:
library(survival) rfs <- pmax(rotterdam$recur, rotterdam$death) rfstime <- with(rotterdam, ifelse(recur==1, rtime, dtime)) fit1 <- flexsurvspline(Surv(rfstime, rfs) ~ age + meno + size + er, k=2, data = rotterdam) # 计算每个患者的线性预测值 predf <- model.matrix(fit1) %*% fit1$res[-(1:4),"est"] # 预测5年基线生存率 y5_Flex_1 <- summary(fit1,type="survival",t=5) y5_Flex <- y5_Flex_1[[1]]$est y5_Flex # 收缩因子 vanH <- 0.9589255 heuristic_lp_flex = vanH*predf # 通过offset固定收缩后的线性预测值,计算收缩模型的5年基线生存率 fit1_shrunk <- flexsurvspline(Surv(rfstime,rfs)~offset(heuristic_lp_flex),k=2,data=rotterdam)
解决方法
flexsurv 2.3版本调整了模型矩阵的构建逻辑,要求公式中所有变量(包括offset()内的变量)必须存在于data参数指定的数据框中,旧版本允许直接引用全局环境中的向量,新版本不再支持。
修改步骤:
- 将
heuristic_lp_flex向量添加到rotterdam数据框中; - 在公式中引用数据框内的列名,而非全局环境中的向量。
修改后的代码:
library(survival) library(flexsurv) rfs <- pmax(rotterdam$recur, rotterdam$death) rfstime <- with(rotterdam, ifelse(recur==1, rtime, dtime)) fit1 <- flexsurvspline(Surv(rfstime, rfs) ~ age + meno + size + er, k=2, data = rotterdam) # 计算每个患者的线性预测值 predf <- model.matrix(fit1) %*% fit1$res[-(1:4),"est"] # 预测5年基线生存率 y5_Flex_1 <- summary(fit1,type="survival",t=5) y5_Flex <- y5_Flex_1[[1]]$est y5_Flex # 收缩因子 vanH <- 0.9589255 heuristic_lp_flex = vanH*predf # 关键修改:将offset变量加入数据集 rotterdam$heuristic_lp_flex <- heuristic_lp_flex # 重新拟合收缩模型 fit1_shrunk <- flexsurvspline(Surv(rfstime,rfs)~offset(heuristic_lp_flex),k=2,data=rotterdam)
验证逻辑
通过将heuristic_lp_flex整合到rotterdam数据框,确保公式中的变量与模型框架完全匹配,符合flexsurv 2.3版本对变量来源的要求,从而解决模型矩阵构建时的匹配错误。
内容的提问来源于stack exchange,提问作者Laura Howard
相关产品推荐
相关产品推荐

