R - 循环用户定义模型上的度量列表

时间:2018-04-26 15:47:07

标签: r function statistics lapply

我目前在差异模型方面存在差异,并希望以有效的方式衡量同一模型的不同指标。

例如,我有一个数据框,其中包含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)

任何见解都将受到赞赏。谢谢!

1 个答案:

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