循环遍历列以分析不同的因变量
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
这是我的数据框(可重现的例子)
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