在列表的列表上运行lapply和lmer函数

xe55xuns  于 2023-04-27  发布在  其他
关注(0)|答案(1)|浏览(87)

我在一个包含列表列表的数据集上运行lmer函数时遇到了困难。

lapply(list, function(x) lapply(x, function(x) as.data.frame(x)))

lapply(list, function(x) lapply(x, function(x) 
      lmer(x[,4:7] ~ var + (1| id), x)))

model.frame.default(data = x,drop.unused.levels = TRUE,formula = x[,:变量“x”的类型(列表)无效
有没有人能建议通过lapply运行lmer的方法?

复制

library(tidyverse)
library(readxl)
require(writexl)
write_xlsx(mtcars, 'PQ_ele_com.xlsx')
        
dir = c('com', 'set', 'rit')
init = c('PQ', 'MG')
inpst = c('_ele_', '_mel_', '_col_')
           
for (i in dir) {
   for (j in init) {
      for (k in inpst){
        write_xlsx(mtcars, paste0(j, k, i, '.xlsx')) 
      }
   }
}
    
files = list.files(recursive= FALSE, full.names= FALSE)
     
init = c('PQ', 'MG')
dir = c('com', 'set', 'rit')
     
list3 = NULL
for (j in init){
   for (k in dir){
      df=c()
      for (i in files){
           if(str_detect(i, pattern = j) & str_detect(i, pattern = k)) {
             df=rbind(df,read_excel(i))}
         }
         list3[[j]][[k]] = df
      }
 }

让我们假设我想通过每个子列表拟合lmer模型。例如:

lapply(list3, function(x) lapply(x, 
    function(x) lmer(x[,3:7]  ~ vs + (1| cyl), x)))

它返回报告的错误。你认为有可能以某种方式强制它吗?

6mzjoqzu

6mzjoqzu1#

你不能把一个矩阵放在公式的左边,然后期望lmer依次用每一列作为响应来拟合一系列模型(这对lm()有效,但只是因为线性模型的拟合和解释方式有一些特殊的结构)。
所以,你需要在底层使用另一个lapply()或循环来迭代列/响应变量。下面的代码是一种方法。说实话,我可能会在这里使用for循环,它们比嵌套的lapply()函数更容易调试...

res <- 
lapply(list3, 
    function(x) { lapply(x, 
        function(y) { lapply(names(y)[3:7],
            function(n) {
               ## browser()
               form <- reformulate(c("vs", "(1|cyl)"), response = n)
               lmer(form, data = y) 
            })
        })
    })

相关问题