我目前在差异模型方面存在差异,并希望以有效的方式衡量同一模型的不同指标。
例如,我有一个数据框,其中包含Miles Driven,Work Hoursed,State,Group,Time的列。
目前,我可以使用代码复制并粘贴每个指标的模型:
# Create DID models
model_miles <- lm(df$miles_driven ~ df$Group
+ df$Time
+ df$Group * df$Time, data = df)
model_hours <- lm(df$hours_worked ~ df$Group
+ df$Time
+ df$Group * df$Time, data = df)
# Select results using clustered standard errors. The purpose of this is to
# avoid making distributional assumptions about the errors in the models.
results_miles <- clubSandwich::coef_test(model_miles,
vcov = "CR2",
cluster = df$state,
test = "Satterthwaite")
results_hours <- clubSandwich::coef_test(model_hours,
vcov = "CR2",
cluster = df$state,
test = "Satterthwaite")
results <- data.table::rbindlist(list(results_miles, results_hours))
View(results)
我想以某种方式创建我的度量标准名称列表,并使用用户定义的函数循环遍历此列表,以便使此过程更快,更自动化,但我无法使其工作正确地:
#list of metrics
metrics <- c("miles_driven", "hours_worked")
udf <- function(metric, dataframe){
# Create DID model
model <- lm(dataframe$metric ~ df$Group
+ dataframe$Time
+ dataframe$Group * df$Time, data = dataframe)
# Select results using clustered standard errors. The purpose of this
is to
# avoid making distributional assumptions about the errors in the
models.
results_miles <- clubSandwich::coef_test(model_miles,
vcov = "CR2",
cluster = dataframe$state,
test = "Satterthwaite")[4,]
View(results)
}
lapply(metrics, udf)
任何见解都将受到赞赏。谢谢!
答案 0 :(得分:0)
这听起来像是来自purrr map()
的工作,以及tidyr&#39; unnest()
!
下次,构建reproducible example会很有帮助,但我们可以从这里开始。
library(tidyverse)
train <- data_frame(metric = c("mpg",
"disp"),
formula = list(as.formula("mpg ~ ."),
as.formula("disp ~ ."))) %>%
mutate(model = map(formula, ~lm(.x, data = mtcars)))
train
#> # A tibble: 2 x 3
#> metric formula model
#> <chr> <list> <list>
#> 1 mpg <S3: formula> <S3: lm>
#> 2 disp <S3: formula> <S3: lm>
请注意,我设置了一个列,其中包含我们将用作模型中预测数量的指标的名称,然后是包含建模公式的列。您可以使用paste()
和mutate()
获得更好的信息,而不是重新输入预测数量的名称。然后使用purrr的map()
来拟合每个预测量的模型。您现在有一个包含模型的列。
接下来,是时候测试所有的回归系数了。请注意map()
如何获取其参数:首先,您映射的数量(模型),然后是您应用于每个模型的函数(来自clubSandwich的函数),最后是需要的其他参数被传递给该函数。
tests <- train %>%
mutate(coeffs = map(model, clubSandwich::coef_test, "CR2", "Satterthwaite", "All", mtcars$cyl))
tests
#> # A tibble: 2 x 4
#> metric formula model coeffs
#> <chr> <list> <list> <list>
#> 1 mpg <S3: formula> <S3: lm> <coef_test_clubSandwich [11 × 4]>
#> 2 disp <S3: formula> <S3: lm> <coef_test_clubSandwich [11 × 4]>
我们做到了!最后一步是使用tidyr的unnest()
,这样我们就可以轻松地从回归系数测试中获得所有这些数量。
tests %>%
unnest(coeffs)
#> # A tibble: 22 x 5
#> metric beta SE df p_Satt
#> <chr> <dbl> <dbl> <dbl> <dbl>
#> 1 mpg 12.3 16.3 1.52 0.550
#> 2 mpg -0.111 1.44 2.00 0.945
#> 3 mpg 0.0133 0.0159 1.34 0.526
#> 4 mpg -0.0215 0.0330 1.82 0.588
#> 5 mpg 0.787 0.493 2.05 0.248
#> 6 mpg -3.72 2.05 1.33 0.270
#> 7 mpg 0.821 0.388 1.34 0.228
#> 8 mpg 0.318 1.55 1.74 0.859
#> 9 mpg 2.52 1.25 1.73 0.202
#> 10 mpg 0.655 1.84 1.73 0.761
#> # ... with 12 more rows
由reprex package(v0.2.0)创建于2018-04-26。