目标:运行具有三个不同结果变量的三个回归模型,如下所示,但理想情况下,它比后三行中的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)
答案 0 :(得分:1)
这是使用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
由reprex package(v0.2.1)于2018-11-26创建
答案 1 :(得分:0)
您可以将data.frame转换为长格式,将所有dv值放在一列中,然后使用plyr
的{{1}}创建lms。这将在指定列(“ dvN”)上拆分data.frame并将该函数应用于每个列,并返回lms列表。我对函数进行了些微更改,使其仅采用data.frame,而不是单独使用列。
希望这能满足您的需求。
dlply