R:防止“~”。在来自 运行 的线性混合效应模型中,自变量既是固定效应又是随机效应

R: Prevent "~." in a linear mixed effect model from running an independent variable as both a fixed and random effect

当我 运行 下面的代码时,我似乎 运行 遇到了一些问题:

library(lme4)

columns <- c("disp", "hp", "wt", "qsec", "vs")


X <- mtcars[,c(columns, 'cyl', 'carb', 'gear')] # data


rf <- lmer(cyl~ (carb | gear) +., data = X)

rf

### The output that I don't want (lists 'carb' and 'gear' as fixed variables):

Linear mixed model fit by REML ['lmerMod']
Formula: cyl ~ (carb | gear) + .
   Data: X
REML criterion at convergence: 76.9662
Random effects:
 Groups   Name        Std.Dev. Corr 
 gear     (Intercept) 0.2887        
          carb        0.2039   -1.00
 Residual             0.5202        
Number of obs: 32, groups:  gear, 3
Fixed Effects:
(Intercept)         carb         gear         disp           hp           wt  
  10.179140     0.025990    -0.873174     0.003883     0.008190     0.089656  
       qsec           vs  
  -0.159582    -0.779400  

如您所见,当我只需要将它们用于我的随机效应变量时,它将 'carb' 和 'gear' 计为固定变量。

我的目标是让代码保持类似的格式,并且能够 运行 没有变量 'carb' 和 'gear' 的模型被作为固定效应(仅作为随机效应)。

如何防止“~”。在第一个模型中选择 'carb' 和 'gear' 作为固定变量,以便它可以产生与下面第二个模型相同的输出?

我需要的输出:(仅 'carb' 和 'gear' 列为随机效果):

> el <- lmer(cyl~ disp + hp + wt + qsec + vs + (carb | gear), data = mtcars)

> el

Linear mixed model fit by REML ['lmerMod']
Formula: cyl ~ disp + hp + wt + qsec + vs + (carb | gear)
   Data: mtcars
REML criterion at convergence: 79.7548
Random effects:
 Groups   Name        Std.Dev. Corr 
 gear     (Intercept) 0.9932        
          carb        0.1688   -0.82
 Residual             0.5263        
Number of obs: 32, groups:  gear, 3
Fixed Effects:
(Intercept)         disp           hp           wt         qsec           vs  
   6.848103     0.004024     0.006929     0.172789    -0.169145    -0.785878  

非常感谢任何帮助!

R 公式符号中的 . 快捷方式表示“data 中的每个变量,但公式 left-hand 一侧的变量除外。”这只是一个方便的 shorthand,最初是为了与 lm() 功能一起使用。它不是很灵活,因为您在尝试将它应用到与预期不同的上下文中时发现了这一点。 lmer() 公式包括因变量、固定效应和随机效应。所以在这种情况下 . 快捷方式将不起作用。为避免 hard-coding 变量名称,您可以通过粘贴字符串将公式放在一起,如下所示:

columns <- c("disp", "hp", "wt", "qsec", "vs")
fixed_effects <- paste(columns, collapse = '+')
model_formula <- as.formula(paste('cyl ~ (carb|gear) +', fixed_effects))
model_formula

# cyl ~ (carb | gear) + disp + hp + wt + qsec + vs

rf <- lmer(model_formula, data = mtcars)

这里我们使用 paste()collapse 参数来连接 columns 的所有元素,每个元素之间有一个 +。然后我们再次 paste() 将公式中带有 left-hand 的部分和随机效应与固定效应结合起来。这为我们提供了作为字符串的完整模型公式,我们可以使用 as.formula().

将其转换为公式