【问题标题】:Looping through columns to analyse different dependent variable遍历列以分析不同的因变量
【发布时间】:2021-03-19 16:48:44
【问题描述】:

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

   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_VD1  <- lmer(formula = VD1 ~ group + (1|id)
>                   , data = dat) 

    summary(mlm_VD1)

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

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

谢谢!

【问题讨论】:

    标签: r loops mlm


    【解决方案1】:

    添加到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
    

    【讨论】:

    • 再次感谢您!如果不是手动定义 c("VD1","VD2","VD3","VD4","VD5") ,我只想给出列位置,然后我想要这些标题的字符串列出现在输出的“变量”列中?
    【解决方案2】:

    我们可以使用循环。子集列名,即以“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)))
    

    【讨论】:

    • 谢谢,我怎样才能不按名称而是按 nm1 数据框中的位置来索引列
    • 非常感谢,它有效。如何将不同传销的汇总表保存在 pdf 中
    • @Gianluca 您的意思是汇总表是打印的还是 data.frame 的?
    • 打印的汇总表
    • @Gianluca 看起来您得到了另一个已接受的答案。所以,大概解决了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多