目标:用三个不同的结果变量运行三个回归模型,如下所示,但理想情况下,以比最后三行中的model1、model2和model3版本更有效的方式运行。
具体问题:我如何编写一个函数来迭代dv的集合,并将model+#指示符创建为对象(例如model1、model2等(并切换dv(例如dv1、dv2等(?我认为有一个forloop和函数解决方案,但我没有得到它…
mydf <- data.frame(dv1 = rnorm(100),
dv2 = rnorm(100),
dv3 = rnorm(100),
iv1 = rnorm(100),
iv2 = rnorm(100),
iv3 = rnorm(100))
mymodel <- function(dv, df) {
lm(dv ~ iv1 + iv2 + iv3, data = df)
}
model1 <- mymodel(dv = mydf$dv1, df = mydf)
model2 <- mymodel(dv = mydf$dv2, df = mydf)
model3 <- mymodel(dv = mydf$dv3, df = mydf)
这是使用tidyverse
包的另一种方法,因为dplyr
或多或少已经取代了plyr
。
library(tidyverse)
mydf <- data.frame(dv1 = rnorm(100),
dv2 = rnorm(100),
dv3 = rnorm(100),
iv1 = rnorm(100),
iv2 = rnorm(100),
iv3 = rnorm(100))
mymodel <- function(df) {
lm(value ~ iv1 + iv2 + iv3, data = df)
}
mydf %>%
gather("variable","value", contains("dv")) %>%
split(.$variable) %>%
map(mymodel)
#> $dv1
#>
#> Call:
#> lm(formula = value ~ iv1 + iv2 + iv3, data = df)
#>
#> Coefficients:
#> (Intercept) iv1 iv2 iv3
#> -0.04516 -0.04657 0.08045 0.02518
#>
#>
#> $dv2
#>
#> Call:
#> lm(formula = value ~ iv1 + iv2 + iv3, data = df)
#>
#> Coefficients:
#> (Intercept) iv1 iv2 iv3
#> -0.03906 0.16730 0.10324 0.02500
#>
#>
#> $dv3
#>
#> Call:
#> lm(formula = value ~ iv1 + iv2 + iv3, data = df)
#>
#> Coefficients:
#> (Intercept) iv1 iv2 iv3
#> 0.018492 -0.162563 0.002738 0.179366
创建于2018-11-26由reprex包(v0.2.1(
您可以将data.frame转换为长格式,将所有dv值都放在一列中,然后使用plyr
的dlply
来创建lms。这将拆分指定列("dvN"(上的data.frame,并将函数应用于每个列,并返回lms列表。我稍微更改了函数,使其只接受一个data.frame,而不是单独的列。
希望这能满足你的需求。
library(plyr)
library(tidyr)
mydf_l <- gather(mydf, dvN, Value, 1:3)
mymodel2 <- function(df) {
lm(Value ~ iv1 + iv2 + iv3, data = df)
}
allmodels <- dlply(mydf_l, .(dvN), mymodel2)