编写一个函数以将其他函数包含在回归模型中

时间:2018-11-26 20:51:40

标签: r function

目标:运行具有三个不同结果变量的三个回归模型,如下所示,但理想情况下,它比后三行中的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)

2 个答案:

答案 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