cmu-delphi / cmu-delphi/epipredict

Inconsistent behavior in predictor selection with vs. without population scaling

Open
#164 2 comments 0 reactions 0 assignees View on GitHub
P1
Dominant language
R
Stars
18
Forks
13
Avg merge
21d 58m
Merged PRs (30d)
1

Description

See how the predictor selection varies when we use "analogous" workflows with vs. without population scaling (based on the example for `step_population_scaling`):

``` r
library(epiprocess)
#>
#> Attaching package: 'epiprocess'
#> The following object is masked from 'package:stats':
#>
#> filter
library(epipredict)
#> Loading required package: parsnip
jhu <- epiprocess::jhu_csse_daily_subset %>%
dplyr::filter(time_value > "2021-11-01", geo_value %in% c("ca", "ny")) %>%
dplyr::select(geo_value, time_value, cases)

pop_data = data.frame(states = c("ca", "ny"), value = c(20000, 30000))

r <- epi_recipe(jhu) %>%
step_population_scaling(df = pop_data,
df_pop_col = "value",
by = c("geo_value" = "states"),
cases, suffix = "_scaled") %>%
step_epi_lag(cases_scaled, lag = c(7, 14)) %>%
step_epi_ahead(cases_scaled, ahead = 7, role = "outcome") %>%
step_epi_naomit()

f <- frosting() %>%
layer_predict() %>%
layer_threshold(.pred) %>%
layer_naomit(.pred) %>%
layer_population_scaling(.pred, df = pop_data,
by = c("geo_value" = "states"),
df_pop_col = "value")

wf <- epi_workflow(r, parsnip::linear_reg()) %>%
fit(jhu) %>%
add_frosting(f)

names(coef(extract_fit_engine(wf)))
#> [1] "(Intercept)" "cases_scaled" "lag_7_cases_scaled"
#> [4] "lag_14_cases_scaled"

r2 <- epi_recipe(jhu) %>%
step_epi_lag(cases, lag = c(7, 14)) %>%
step_epi_ahead(cases, ahead = 7, role = "outcome") %>%
step_epi_naomit()

f2 <- frosting() %>%
layer_predict() %>%
layer_threshold(.pred) %>%
layer_naomit(.pred)

wf2 <- epi_workflow(r2, parsnip::linear_reg()) %>%
fit(jhu) %>%
add_frosting(f2)

names(coef(extract_fit_engine(wf2)))
#> [1] "(Intercept)" "lag_7_cases" "lag_14_cases"
```

Created on 2023-04-07 by the [reprex package](https://reprex.tidyverse.org) (v2.0.1)

In this case, the workflow with scaling has a lag-0 predictor, while the one without does not. If, instead, we were to use `lag = c(0, 7, 14)`, then both versions would have a lag-0 predictor, but the one with scaling would have two copies of it, and might cause issues for some engines.

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.