You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:29:46