在函数周围包裹一个循环

时间:2019-07-02 20:53:55

标签: r function loops

我可以使用一些帮助将循环包装在函数周围。

我有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)}

我知道有些软件包的功能与此相似,但是我正在努力学习函数和循环,因此,如果可能的话,我真的很想这样做。谢谢!

1 个答案:

答案 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))之类的来获取(固定)系数。