R - цикл по списку метрик в пользовательской модели - PullRequest
0 голосов
/ 26 апреля 2018

В настоящее время у меня есть модель различий, и я хотел бы эффективно измерить различные показатели для одной и той же модели.

Например, у меня есть фрейм данных со столбцами для количества пройденных миль, отработанных часов, состояния, группы, времени.

В настоящее время есть код, куда я копирую и вставляю модель для каждой метрики:

# 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 голосов
/ 26 апреля 2018

Звучит как работа для map() от мурлыканья вместе с тидиром unnest()!

В следующий раз было бы полезно создать воспроизводимый пример , но вот тот, с которого мы можем начать.

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]>

Мы сделали это! Последний шаг - использование тидира 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

Создано в 2018-04-26 пакетом представ (v0.2.0).

...