含限制性立方样条的模型循环更新异常:简化模型与全模型一致求解决
解决R中update()无法正确移除复杂模型项的问题
你遇到的问题核心是as.name(i)无法正确解析包含限制性立方样条(rcs)和交互项的复杂表达式。as.name()只能处理单个简单变量名,像rcs(x2, c(110,90,60,30))*rcs(x3, c(50,65,80))这种带函数和运算符的复杂字符串,会被它当成一个不存在的“单一变量名”,模型里根本没有这个项,所以update()等于没做任何移除操作,简化模型自然和全模型一致。
直接通过字符串拼接构造完整的更新公式,再转为公式对象就能解决:
vars <- list("x1", "rcs(x2, c(110, 90, 60, 30))*rcs(x3, c(50, 65, 80))", "rcs(x4, c(8, 10, 12, 14, 16))" ) for (i in vars) { # 拼接成完整的更新公式文本,再转为公式 reduced <- update(fit, as.formula(paste(". ~ . -", i))) print(reduced$sformula) lrtest(fit, reduced) }
原理说明
paste(". ~ . -", i)会把每个要移除的复杂项拼接到更新规则里,比如对第二个元素,会生成字符串. ~ . - rcs(x2, c(110, 90, 60, 30))*rcs(x3, c(50, 65, 80)),as.formula()会正确解析这个字符串里的函数调用和交互运算符,让update()精准定位并移除对应的模型项。
内容的提问来源于stack exchange,提问作者Pavel Roshanov
相关产品推荐
相关产品推荐

