我可以使用一些帮助将循环包装在函数周围。
我有26种针对不同植物物种的模型,它们都具有相同的解释变量和结构。最终,我想将模型系数提取到表格中。
首先,我创建了一个函数来从一个模型中提取系数,并将其放入称为mod.out的空数据帧的行中。通过键入模型名称和唯一的行号,我可以为单个模型运行此功能。
coefs<- function(model, row.num){
mod.out[row.num,1]<-strtrim(deparse(substitute(model)), 4)
mod.out[row.num, 2:4]<-summary(model)$coefficients[1, c(1,2,4)]
mod.out[row.num,5:7]<-summary(model)$coefficients[2, c(1,2,4)]
mod.out[row.num,8:10]<-summary(model)$coefficients[3, c(1,2,4)]
mod.out[row.num,11:13]<-summary(model)$coefficients[4, c(1,2,4)]
mod.out[row.num,14]<-summary(model)$optinfo$val[1]
return(mod.out)
}
我现在想做的是为每个模型编写一个遍历此函数的循环,以将每组系数放入mod.out数据框中的新行中。该模型是glmers。我创建了所有型号名称的列表:
mod.name<-c(abam.mort, abco.mort, abgr.mort, abla.mort, acma.mort, arme.mort, cade.mort, chch.mort, chla.mort, juoc.mort, laoc.mort, lide.mort, pial.mort, piat.mort, pico.mort, pien.mort, pije.mort, pila.mort, pimo.mort, pipo.mort, psme.mort, quch.mort, thpl.mort, tshe.mort, tsme.mort, umca.mort)
我认为我可以很容易地编写一个循环函数来完成它,但是我无法使其正常工作。我已经尝试过多种不同的get()和paste()命令,但是我做错了。我认为问题在于函数在循环内时如何指定模型名称,但我无法弄清楚。任何帮助将不胜感激。现在我有:
for(i in 1:nrow(mod.out)){
coefs(mod.name[i], i)}
我知道有些软件包的功能与此相似,但是我正在努力学习函数和循环,因此,如果可能的话,我真的很想这样做。谢谢!
答案 0 :(得分:1)
作为替代方案,您可以考虑采用这种方法:
library(lme4)
library(broom)
library(purrr)
library(dplyr)
gm1 <- glmer(cbind(incidence, size - incidence) ~ period + (1 | herd),
data = cbpp, family = binomial)
l <- list(mod1 = gm1,mod2 = gm1)
> map_dfr(l,tidy,.id = "model")
# A tibble: 10 x 7
model term estimate std.error statistic p.value group
<chr> <chr> <dbl> <dbl> <dbl> <dbl> <chr>
1 mod1 (Intercept) -1.398 0.2312 -6.048 1.468e-9 fixed
2 mod1 period2 -0.9919 0.3032 -3.272 1.068e-3 fixed
3 mod1 period3 -1.128 0.3228 -3.495 4.745e-4 fixed
4 mod1 period4 -1.580 0.4220 -3.743 1.818e-4 fixed
5 mod1 sd_(Intercept).herd 0.6421 NA NA NA herd
6 mod2 (Intercept) -1.398 0.2312 -6.048 1.468e-9 fixed
7 mod2 period2 -0.9919 0.3032 -3.272 1.068e-3 fixed
8 mod2 period3 -1.128 0.3228 -3.495 4.745e-4 fixed
9 mod2 period4 -1.580 0.4220 -3.743 1.818e-4 fixed
10 mod2 sd_(Intercept).herd 0.6421 NA NA NA herd
(还有一些因子/字符转换警告。)
请注意,这种方法依赖于glmer模型的命名列表。
如果您坚持使用当前的方法,我强烈建议至少不要使用$
直接从模型对象中提取模型系数;软件包作者可以更改这些对象的内部结构,从而使您的代码损坏。在这种情况下,您可以使用coef(summary(abam.mort))
之类的来获取(固定)系数。