使用dplyr / purrr将数据框中的行作为参数传递给自定义回归函数

时间:2019-06-21 23:55:40

标签: r dplyr purrr

我正在编写一个可以接受多个参数的回归函数(为简单起见,此处仅包含3个参数,但会有数十个)。最终,我想将所有可能的参数组合传递给回归函数,并编译来自模型的估计值。因此,我将首先使用cross_df进行全套组合,然后遍历结果数据帧的每一行,每一行都包含要传递给自定义回归函数的参数集(每列一个参数)。然后,在数据框中,我要创建两个新列:一列具有独立变量的估计系数,另一列具有关联的p值。

这是我尝试过的:

rm(list = ls())
library(DeclareDesign)
library(tidyverse)

set.seed(12345)

df <- fabricate(N = 100,
                oneDV = rnorm(N),
                anotherDV = draw_binary(prob = 0.5, N),
                X = draw_binary(prob = 0.5, N),
                M = rnorm(N))


myreg <- function(DV = NULL,
                  control = FALSE,
                  subset = FALSE) {

  dat <- df

  # declare dv
    dv <- DV

 if(subset) {
  dat %>% filter(M < median(M))} else {
  dat <- dat
  }  

  # controls
    if(control) {
      cntr <- "+ M"} else {
      cntr <- ""
      }

  # decalare formula
    frm <- paste0(dv, "~ X", cntr)
    out <- lm_robust(as.formula(frm), data = df)
    out$coef <- as.vector(out$coefficients[2])
    out$pval <- as.vector(out$p.value[2])

    return(out)
}

args <- list(
  DV = c("oneDV", "anotherDV"),
  control = c(T,F),
  double = c(T,F))

args %>% 
  purrr::cross_df() %>% 
  mutate(coef = myreg(DV, control, subset)$coef,
         pval = myreg(DV, control, subset)$pval)

正如您所看到的,这并没有像我希望的那样遍历每行-即使每一行都应该代表一个单独的模型(在此行中有8个不同的模型),每一行都显示相同的结果例)。我在做什么错了?

1 个答案:

答案 0 :(得分:1)

使用map2_dbl

library(tidyverse)

args %>% 
    purrr::cross_df() %>% 
    mutate(coef = map2_dbl(DV, control, ~myreg(.x, .y)$coef), 
           pval = map2_dbl(DV, control, ~myreg(.x, .y)$pval))

#> # A tibble: 4 x 4
#>   DV        control   coef  pval
#>   <chr>     <lgl>    <dbl> <dbl>
#> 1 oneDV     TRUE    0.120  0.569
#> 2 anotherDV TRUE    0.0957 0.354
#> 3 oneDV     FALSE   0.163  0.437
#> 4 anotherDV FALSE   0.0833 0.408

reprex package(v0.3.0)于2019-06-21创建

pmap与两个以上的参数一起使用:

args %>% 
    purrr::cross_df() %>% 
    mutate(mod = pmap(., myreg), 
           coef = map_dbl(mod, ~.x$coef), 
           pval = map_dbl(mod, ~.x$pval))

#> # A tibble: 8 x 6
#>   DV        control subset mod           coef  pval
#>   <chr>     <lgl>   <lgl>  <list>       <dbl> <dbl>
#> 1 oneDV     TRUE    TRUE   <lm_robst> -0.0917 0.678
#> 2 anotherDV TRUE    TRUE   <lm_robst> -0.0404 0.693
#> 3 oneDV     FALSE   TRUE   <lm_robst> -0.0825 0.706
#> 4 anotherDV FALSE   TRUE   <lm_robst> -0.0369 0.717
#> 5 oneDV     TRUE    FALSE  <lm_robst> -0.0917 0.678
#> 6 anotherDV TRUE    FALSE  <lm_robst> -0.0404 0.693
#> 7 oneDV     FALSE   FALSE  <lm_robst> -0.0825 0.706
#> 8 anotherDV FALSE   FALSE  <lm_robst> -0.0369 0.717

reprex package(v0.3.0)于2019-06-22创建