循环遍历列以分析不同的因变量

Looping through columns to analyse different dependent variable

这是我的数据框(可重现的例子)

   set.seed(42)  
n <- 6
dat <- data.frame(id=rep(1:n, 2), 
                  group= as.factor(rep(LETTERS[1:2], n/2)),
                  VD1 = rnorm(n),
                  VD2 = runif(n*2, min=0, max=100), 
                  VD3 = runif(n*2, min=0, max=100),
                  VD4 = runif(n*2, min=0, max=100),
                  VD5 = runif(n*2, min=0, max=100)) 

我正在为一个因变量“VD1”拟合以下 MLM

> mlm_VD1  <- lmer(formula = VD1 ~ group + (1|id)
>                   , data = dat) 

    summary(mlm_VD1)

我想通过在我的数据帧的所有列中创建一个循环来自动分析所有其他因变量 VD2、VD3、VD4、VD5 (dat[ 4:ncol(dat)])

然后我想将不同 mlm (mlm_VD1、mlm_VD2、mlm_VD3、mlm_VD4、mlm_VD5) 的所有摘要保存在在 R 环境之外阅读的 pdf 文件

谢谢!

我们可以使用循环。子集列名,即以 'VD' 开头的列名,后跟一些数字,然后遍历那些 'nm1',用 paste 创建一个 formula,应用 lmer并得到 summary

library(lme4)
nm1 <- grep('^VD\d+', names(dat), value = TRUE)
out <- lapply(nm1, function(nm)
     summary(lmer(as.formula(paste(nm, '~ group + (1|id)')), data = dat)))

如果应该按位置。然后使用

i1 <- 3:7
out <- lapply(i1, function(i) 
        summary(lmer(as.formula(paste(names(dat)[i],
           '~ group + (1|id)')), data = dat)))

加入akrun提供的解决方案..

library(broom.mixed)
library(lme4)
library(purrr)

将列索引为 3:7

var_names <- names(dat)[3:7]

output <- map_dfr(var_names,
                  function(x){
                    formula_mlm = as.formula(paste0(x,"~ group + (1|id)"));
                    model_fit = lmer(formula_mlm,data=dat) %>% 
                      tidy(.) %>% 
                      dplyr::mutate(variable = x);
                    return(model_fit)
                    
                  })
output %>% 
+   head(.)


   # A tibble: 6 x 7
  effect   group    term            estimate std.error statistic variable
  <chr>    <chr>    <chr>              <dbl>     <dbl>     <dbl> <chr>   
1 fixed    NA       (Intercept)      7.80e-1     0.223      3.50 VD1     
2 fixed    NA       groupB          -7.59e-1     0.315     -2.41 VD1     
3 ran_pars id       sd__(Intercept)  3.74e-1    NA         NA    VD1     
4 ran_pars Residual sd__Observation  2.10e-8    NA         NA    VD1     
5 fixed    NA       (Intercept)      7.91e+1    13.2        5.98 VD2     
6 fixed    NA       groupB          -2.97e+1    18.7       -1.59 VD2