我正在编写一个可以接受多个参数的回归函数(为简单起见,此处仅包含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个不同的模型),每一行都显示相同的结果例)。我在做什么错了?
答案 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创建