如何在R中正确传递含随机效应的变量关联公式至拟合回归模型
解决
stan_gamm4中传递公式变量后保留原公式结构的问题 这个问题我之前也碰到过,核心原因是R函数会记录你传入的表达式而非变量指向的实际对象——当你直接把formula.rand作为参数传入时,br$call里保存的是变量名这个表达式,而不是它指向的公式内容。下面分享两种可行的解决方法:
方法一:用do.call()调用函数(推荐)
do.call()会将参数列表中的实际值展开传递给函数,这样函数调用记录里会保存真实的公式结构,而非变量名。代码示例如下:
# 模拟数据(和你的示例一致) dat <- mgcv::gamSim(1, n = 400, scale = 2) dat$fac <- as.factor(sample(1:20, 400, replace = TRUE)) dat$y <- dat$y + model.matrix(~ fac - 1) %*% rnorm(20) * .5 # 定义随机效应公式变量 formula.rand <- as.formula('~(1|fac)') # 使用do.call调用stan_gamm4,展开公式变量 br <- do.call( stan_gamm4, args = list( formula = y ~ s(x0) + x1 + s(x2), data = dat, random = formula.rand, chains = 1, iter = 200 ) ) # 验证结果 br$call$random # 输出:~(1 | fac)
方法二:事后手动修改调用对象
如果你更习惯直接调用函数,也可以在调用完成后手动替换br$call中的random项,把变量指向的公式赋值进去:
# 正常调用函数 br <- stan_gamm4(y ~ s(x0) + x1 + s(x2), data = dat, random = formula.rand, chains = 1, iter = 200) # 手动替换call里的random部分 br$call$random <- formula.rand # 验证结果 br$call$random # 输出:~(1 | fac)
两种方法都能解决问题,其中方法一更优雅,从根源上让函数调用记录保存正确的公式结构,避免后续可能的其他问题。
内容的提问来源于stack exchange,提问作者user321627
相关产品推荐
相关产品推荐

