r-编写一个函数,用回归模型封装另一个函数



目标:用三个不同的结果变量运行三个回归模型,如下所示,但理想情况下,以比最后三行中的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值都放在一列中,然后使用plyrdlply来创建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)

最新更新