Я пишу регрессионную функцию, которая может принимать несколько аргументов (я привожу здесь только 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 различных вэтот пример).Что я делаю не так?