R语言merlin包运行mlrcs函数添加协变量和交互项报错如何处理
报错原因解析
- 第一个语法错误:merlin包的
mlrcs()函数存在公式解析缺陷,当rcs()项出现在公式中间、后面紧跟+连接其他变量时,解析过程会丢失该+运算符,你的公式被错误解析为value ~rcs(time, 3) location,缺少运算符导致语法报错。 - 第二个运算错误:
mlrcs()不会把公式中的*识别为回归交互项语法,而是直接当做算术乘法运算符处理,因子类型的location无法参与乘法运算,因此报非数值参数错误。
解决方案
你将fish作为随机截距项处理重复测量自相关的逻辑是合理的,符合分层模型的规范要求。两种修复方式可选:
方式1:调整公式变量顺序(仅适用于加主效应场景)
把非样条变量放在rcs()项之前,避免rcs()后面紧跟+运算符,主效应模型可正常运行:
mod2_fix <- mlrcs(formula = value ~ location + rcs(time, 3), random = ~ 1 | fish, data = dat)
该方式不支持交互项写法,如需检验交互请用第二种方式。
方式2:预生成限制性立方样条基函数(通用方案,支持交互)
先手动生成样条基变量再放入模型,完全避开mlrcs()的解析缺陷:
library(rms) # 生成3个节点的限制性立方样条基,保留原始时间列方便后续分析 rcs_basis <- rcspline.eval(dat$time, nk = 3, inclx = TRUE) # 基变量并入原数据集 dat <- cbind(dat, setNames(as.data.frame(rcs_basis), paste0("rcs_time_", 1:ncol(rcs_basis)))) # 含location主效应的模型 mod2_fix <- mlrcs(value ~ rcs_time_1 + rcs_time_2 + location, random = ~ 1 | fish, data = dat) # 含时间样条与location交互的模型,手动写交互项避免用*号 mod4_fix <- mlrcs(value ~ rcs_time_1 + rcs_time_2 + location + rcs_time_1:location + rcs_time_2:location, random = ~ 1 | fish, data = dat)
补充说明
如需检验交互项的整体显著性,可对两个嵌套模型做似然比检验:
anova(mod2_fix, mod4_fix)
检验结果的p值小于显著性阈值即可判定时间与location的交互作用显著。
内容的提问来源于stack exchange,提问作者Dr.FishGirl
相关产品推荐
相关产品推荐

