|
2 | 2 |
|
3 | 3 | [GitHub Repo](https://github.com/cmu-delphi/explorationt-tooling/)
|
4 | 4 |
|
5 |
| -## Production Reports |
| 5 | +## Overview |
6 | 6 |
|
| 7 | +- The weekly fanplots were used by the team for visual inspections of the forecasts. |
| 8 | +- The season reports provide a general analysis of the season's data and forecasts performance. |
| 9 | +- The backtesting reports provide a detailed analysis of a wide variety of forecasters' performance on the previous season's data. |
| 10 | +- A description of the forecaster families explored is provided at the bottom of the page. |
7 | 11 |
|
8 |
| -### Scoring this season |
| 12 | +## Weekly Fanplots 2024-2025 Season |
9 | 13 |
|
10 | 14 |
|
11 |
| -## Summary Reports |
| 15 | +## 2024-2025 Season Reports |
12 | 16 |
|
13 |
| -### 2025 |
14 |
| - |
15 |
| -- [Season Summary](season_summary_2025.html) The other documents are also linked from here |
| 17 | +- [Season Summary](season_summary_2025.html) (the notebooks below are linked from here) |
| 18 | + - [Covid's Problematic Initial Forecast](first_day_wrong.html) |
| 19 | + - [NHSN Revision Behavior](revision_summary_2025.html) |
16 | 20 | - [An Analysis of Decreasing Behavior in Forecasters](decreasing_forecasters.html)
|
17 |
| -- [Revision Behavior](revision_summary_report_2025.html) |
18 |
| -- [Covid's problematic initial forecast](first_day_wrong.html) |
19 | 21 | - [NHSN 2024-2025 Data Analysis](new_data.html)
|
20 | 22 |
|
21 |
| -### Flu |
22 |
| - |
23 |
| -All forecasters population scale their data, use geo pooling, and train using quantreg. |
24 |
| -These definitions are in the `flu_forecaster_config.R` file. |
25 |
| - |
26 |
| -- [Flu Overall](flu-overall-notebook.html) |
27 |
| -- [Flu AR](flu-notebook-scaled_pop_main.html) |
28 |
| -- [Flu AR with augmented data](flu-notebook-scaled_pop_data_augmented.html) |
29 |
| -- [Flu AR with exogenous features](flu-notebook-scaled_pop_exogenous.html) |
30 |
| -- [Flu AR with different seasonal schemes](flu-notebook-scaled_pop_season.html) |
31 |
| -- [Flu AR with augmented data and with different seasonal window sizes](flu-notebook-season_window_sizes.html) |
32 |
| -- [Flu AR with augmented data, exogenous features, and seasonal windowing](flu-notebook-scaled_pop_season_exogenous.html) |
33 |
| - |
34 |
| -Simplistic/low data methods: |
35 |
| - |
36 |
| -- [Flu no recent](flu-notebook-no_recent_quant.html) |
37 |
| -- [Flu flatline](flu-notebook-flatline.html) |
38 |
| -- [Flu climate](flu-notebook-climate_linear.html) |
39 |
| - |
40 |
| -### Covid |
41 |
| - |
42 |
| -All forecasters population scale their data, use geo pooling, and train using quantreg. |
43 |
| -These definitions are in the `covid_forecaster_config.R` file. |
44 |
| - |
45 |
| -- [Covid AR](covid-notebook-scaled_pop_main.html) |
46 |
| -- [Covid AR with seasonal features](covid-notebook-scaled_pop_season.html) |
47 |
| -- [Covid AR with exogenous features](covid-notebook-scaled_pop_exogenous.html) |
48 |
| -- [Covid Flatline](covid-notebook-flatline_forecaster.html) |
49 |
| - |
50 |
| -Simplistic/low data methods: |
51 |
| - |
52 |
| -- [Covid no recent](covid-notebook-no_recent_quant.html) |
53 |
| -- [Covid flatline](covid-notebook-flatline.html) |
54 |
| -- [Covid climate](covid-notebook-climate_linear.html) |
| 23 | +## Backtesting on 2023-2024 Season |
| 24 | + |
| 25 | +- [Exploration Summary](exploration_summary_2024.html) |
| 26 | +- Flu |
| 27 | + - All forecasters population scale their data, use geo pooling, and train using quantreg. |
| 28 | + - These definitions are in the `flu_forecaster_config.R` file. |
| 29 | + - [Flu Overall](flu-overall-notebook.html) |
| 30 | + - [Flu AR](flu-notebook-scaled_pop_main.html) |
| 31 | + - [Flu AR with augmented data](flu-notebook-scaled_pop_data_augmented.html) |
| 32 | + - [Flu AR with exogenous features](flu-notebook-scaled_pop_exogenous.html) |
| 33 | + - [Flu AR with different seasonal schemes](flu-notebook-scaled_pop_season.html) |
| 34 | + - [Flu AR with augmented data and with different seasonal window sizes](flu-notebook-season_window_sizes.html) |
| 35 | + - [Flu AR with augmented data, exogenous features, and seasonal windowing](flu-notebook-scaled_pop_season_exogenous.html) |
| 36 | + - Simplistic/low data methods: |
| 37 | + - [Flu no recent](flu-notebook-no_recent_quant.html) |
| 38 | + - [Flu no recent](flu-notebook-no_recent_quant.html) |
| 39 | + - [Flu flatline](flu-notebook-flatline.html) |
| 40 | + - [Flu climate](flu-notebook-climate_linear.html) |
| 41 | +- Covid |
| 42 | + - All forecasters population scale their data, use geo pooling, and train using quantreg. |
| 43 | + - These definitions are in the `covid_forecaster_config.R` file. |
| 44 | + - [Covid AR](covid-notebook-scaled_pop_main.html) |
| 45 | + - [Covid AR with seasonal features](covid-notebook-scaled_pop_season.html) |
| 46 | + - [Covid AR with exogenous features](covid-notebook-scaled_pop_exogenous.html) |
| 47 | + - [Covid Flatline](covid-notebook-flatline_forecaster.html) |
| 48 | + - Simplistic/low data methods: |
| 49 | + - [Covid no recent](covid-notebook-no_recent_quant.html) |
| 50 | + - [Covid flatline](covid-notebook-flatline.html) |
| 51 | + - [Covid climate](covid-notebook-climate_linear.html) |
| 52 | + |
| 53 | +## Description of Forecaster Families |
| 54 | + |
| 55 | +The main forecaster families were: |
| 56 | +- Autoregressive models (AR) |
| 57 | + - with seasonal features |
| 58 | + - with exogenous features |
| 59 | + - with augmented data |
| 60 | +- Climatological |
| 61 | +- Linear trend |
| 62 | +- No recent outcome |
| 63 | +- Flatline |
| 64 | + |
| 65 | +All the AR models had the option of population scaling, seasonal features, exogenous features, and augmented data. |
| 66 | +We tried all possible combinations of these features. |
| 67 | +All models had the option of using the `linreg`, `quantreg`, or `grf` engine. |
| 68 | +We found that `quantreg` gave better results than `linreg` and we had computational issues with `grf`, so we used `quantreg` the rest of the time. |
| 69 | + |
| 70 | +### Autoregressive models (AR) |
55 | 71 |
|
56 |
| -## Descriptions of Forecaster Families |
| 72 | +Internal name: `scaled_pop`. |
57 | 73 |
|
58 |
| -### Training Data Information |
| 74 | +A simple autoregressive model, which predicts using |
59 | 75 |
|
60 |
| -(Taken from [David's Org File](https://github.com/cmu-delphi/exploration-tooling/blob/5a6da8d0d0202da6d79a5ee8e702d4654364ce46/forecasters_description.org#flusion).) |
| 76 | +$$x_{t+k} = ar(x)$$ |
61 | 77 |
|
62 |
| -Some use just NHSN, while others use historical data from ILI+ and Flusurv+ as |
63 |
| -additional rows in training. ILI+ and Flusurv+ have been adjusted so that the |
64 |
| -total for the season matches NHSN’s total. Flusurv is taken from epidata, but |
65 |
| -ILI+ was constructed by Evan and given to Richard. The testing date range is |
66 |
| -roughly the 2023 season, so October 2023 through late April 2024. |
| 78 | +where $x$ is the target variable and $ar(x)$ is a linear combination of the target variable's past values, which can be scaled according to each state's population or whitened according to another scheme (or both). In practice, we found that using lags (0, 7) was quite effective (with (0, 7, 14) and (0, 7, 14, 21) providing no discernible advantage), so we focused on those, so in practice our model was |
67 | 79 |
|
68 |
| -### Flu exogenous features |
| 80 | +$$x_{t+k} = x_t + x_{t-7}$$ |
69 | 81 |
|
70 |
| -- NSSP |
71 |
| - Note that this data set is possibly cheating, as we don't have revisions before April of this year, so it is using the latest data. |
72 |
| - If we narrow down to `time_value`s after that, the revision behavior is |
| 82 | +where $k \in \{0, 7, 14, 21, 28\}$ is the forecast horizon. |
73 | 83 |
|
74 |
| - ``` |
75 |
| - Min lag (time to first version): |
76 |
| - min median mean max |
77 |
| - 7 days 7 days 7.7 days 14 days |
78 |
| - Fraction of epi_key+time_values with |
79 |
| - No revisions: |
80 |
| - • 362 out of 954 (37.95%) |
81 |
| - Quick revisions (last revision within 3 days of the `time_value`): |
82 |
| - • 0 out of 954 (0%) |
83 |
| - Few revisions (At most 3 revisions for that `time_value`): |
84 |
| - • 946 out of 954 (99.16%) |
| 84 | +### Autoregressive models with seasonal features |
85 | 85 |
|
86 |
| - Fraction of revised epi_key+time_values which have: |
87 |
| - Less than 0.1 spread in relative value: |
88 |
| - • 329 out of 592 (55.57%) |
89 |
| - Spread of more than 0.1015 in actual value (when revised): |
90 |
| - • 18 out of 592 (3.04%) |
91 |
| - days until within 20% of the latest value: |
92 |
| - min median mean max |
93 |
| - 7 days 7 days 9 days 70 days |
94 |
| - ``` |
| 86 | +Internal name: `scaled_pop_seasonal`. |
95 | 87 |
|
96 |
| - So most days have some revisioning, but with fairly small total changes, with the vast majority of days being within 20% of their eventual value within a week (with some much longer exceptions, apparently). |
97 |
| - So the impact of the cheating is likely small but of course hard to know. |
| 88 | +We tried a few different attempts at incorporating seasonal features: |
98 | 89 |
|
99 |
| -- Google-Symptoms |
100 |
| - This dataset doesn't have revisions, but has a history of suddenly disappearing. |
101 |
| - The latest value was used to simulate actually having the data; at worst, it breaks down to being the underlying forecaster. |
102 |
| -- NWSS and NWSS_regional |
103 |
| - The originating dataset has minimal revisions, but as this is a dataset with quite a lot of processing from the underlying that involves some amount of time travel, it is unclear how much revision behavior it effectively has. |
| 90 | +- The approach that performed the best was using a training window that grabbed a window of data (about 4 weeks before and ahead) around the forecast epiweek from the current and previous seasons. |
| 91 | +- Two indicator variables that roughly correspond to before, during, and after the typical peak (roughly, `before = season_week < 16`, `during = 16 <= season_week <= 20`, and `after = season_week > 20`). |
| 92 | +- Taking the first two principal components of the full whitened augmented data reshaped as `(epiweek, state_source_season_value)`. |
| 93 | +(We found that this was not particularly effective, so we did not use it. |
| 94 | +Despite spending a week debugging this, we could not rule out the possibility that it was a bug. |
| 95 | +However, we also had mixed results from tests of this feature in very simple synthetic data cases.) |
| 96 | +- We also tried using the climatological median of the target variable as a feature (see below for definition of "climatological"). |
| 97 | +- Note that unusually, the last two features are actually led rather than lagged, since we should be predicting using the target's coefficient, rather than the present one. |
104 | 98 |
|
105 |
| -### Data Whitening |
| 99 | +### Autoregressive models with seasonal and exogenous features |
106 | 100 |
|
107 |
| -The data augmented models using ILI+ and FluSurv+ take a few different approaches to data whitening, depending on the `scale_method, center_method, nonlin_method` parameters. |
| 101 | +Internal name: `scaled_pop_seasonal` (with `filter_source = "nhsn"`). |
108 | 102 |
|
109 |
| -TODO: Add descriptions. |
| 103 | +These models could opt into the same seasonal features as the `scaled_pop_seasonal` forecaster, but also included exogenous features. |
110 | 104 |
|
111 |
| -This is more closely in line with the [RobustScaler](https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.RobustScaler.html#sklearn.preprocessing.RobustScaler) from scikit-learn (using a much wider quantile than the default settings there). |
| 105 | +#### Flu exogenous features |
112 | 106 |
|
113 |
| -## Forecaster Families |
| 107 | +- NSSP - we don't have revisions before Spring 2024 for this data, so we used a revision analysis from the data collected after that date to estimate the lag (roughly 7 days) and used that lag to simulate delays. |
| 108 | +- Google-Symptoms - this dataset doesn't have revisions, but has a history of suddenly disappearing, resulting in intermittent long update lags. |
| 109 | +We did not simulate a lag and just used to latest value for a best case scenario. |
| 110 | +The symptom set used was s01, s03, and s04 from [here](https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/google-symptoms.html). |
| 111 | +- NWSS - the originating dataset has minimal revisions, but as this is a dataset with quite a lot of processing from the underlying that involves some amount of time travel, so it is unclear how much revision behavior is present. |
| 112 | +- NWSS_regional - same as NWSS, just aggregated to the HHS region level. |
114 | 113 |
|
115 |
| -### AR with population scaling |
| 114 | +#### Covid exogenous features |
116 | 115 |
|
117 |
| -Internal name: `scaled_pop`. |
| 116 | +- NSSP - same as flu. |
| 117 | +- Google-Symptoms - same as flu, though we used a slightly different symtom set (just s04 and s05 from [here](https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/google-symptoms.html)). |
118 | 118 |
|
119 |
| -A simple model, which predicts using |
| 119 | +### Augmented Data Forecaster |
120 | 120 |
|
121 |
| -$$x_{t+k} = ar(x)$$ |
| 121 | +Internal name: `scaled_pop` (with `filter_source = ""`). |
122 | 122 |
|
123 |
| -where $x$ is scaled according to each state’s population. |
| 123 | +This forecaster is still the standard autoregressive model, but with additional training data. |
| 124 | +Inspired by UMass-flusion, the additional training data consisted of historical data from ILI+ and Flusurv+, which was brought to a comprable level with NHSN and treated as additional observations of the target variable (hence the name "augmented data"). |
| 125 | +Flusurv was taken from epidata, but ILI+ was constructed by Evan Ray and given to Richard (Berkeley Summer 2024 intern). |
| 126 | +Naturally, this forecaster was only used for flu, as the same data was not available for covid. |
124 | 127 |
|
125 |
| -Three versions, two with different engines `quantreg` and `grf`, and the final one with augmented data. |
| 128 | +#### Scaling Parameters (Data Whitening) |
126 | 129 |
|
127 |
| -### AR with population scaling and seasonal features |
| 130 | +The augmented data forecasters took a few different approaches to data whitening (akin to [RobustScaler](https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.RobustScaler.html#sklearn.preprocessing.RobustScaler) from scikit-learn). |
128 | 131 |
|
129 |
| -Internal name: `scaled_pop_seasonal`. |
130 |
| - |
131 |
| -There are 2 seasonal features that we're trying here: |
| 132 | +- `scale_method` |
| 133 | + - `quantile` - scales the data so that the difference between the 5th and 95th quantiles is 1 |
| 134 | + - `quantile_upper` - scales the data so that the 95th quantile is 1 (this was used by UMass-flusion) |
| 135 | + - `std` - scales the data so that one standard deviation is 1 |
| 136 | + - `none` - no scaling |
| 137 | + - We did not see a significant difference in changing the above parameter, so we used the default `quantile` the rest of the time. |
| 138 | +- `center_method` |
| 139 | + - `median` - centers the data so that the median is 0 |
| 140 | + - `mean` - centers the data so that the mean is 0 |
| 141 | + - `none` - no centering |
| 142 | + - We did not see a significant difference in changing the above parameter, so we used the default `median` the rest of the time. |
| 143 | +- `nonlin_method` |
| 144 | + - `quart_root` - takes the 4th root of the data (and adds 0.01 to avoid negative values) |
| 145 | + - `none` - no non-linear transformation |
| 146 | + - Of these, `quart_root` gave us the best results, so we used that the rest of the time. There were occasional issues with the epsilon offset causing a positive value to become the floor as the inversion was taken. |
132 | 147 |
|
133 |
| -1. taking the first 3 PC components from the whitened fused data (so nhsn, ILI+, and Flusurv). (Note that it's 2 for covid). |
134 |
| -2. 2 indicators that roughly correspond to before, during and after the typical peak (first is true when `season_week < 16`, the second is true when `season_week > 20`, and the peak is captured by the overall constant). |
135 |
| - Note that unusually, these features are actually led rather than lagged, since we should be predicting using the target's coefficient, rather than the present one. |
| 148 | +### Climatological |
136 | 149 |
|
137 |
| -### Flusion-like |
138 |
| - |
139 |
| -Roughly designed in line with the flusion model. |
| 150 | +This was our term for a forecaster that directly forecast a distribution built from similar weeks from previous seasons (in analogy with baseline weather forecasting). |
| 151 | +We found that in some cases it made a reasonable baseline, though when the current season's peak time was significatly different from the seasons in the training data, it was not particularly effective. |
140 | 152 |
|
141 | 153 | ### No Recent Outcome
|
142 | 154 |
|
143 |
| -This is the fall-back forecaster, in case we have no data, but are forced to make a prediction. |
| 155 | +This was a fall-back forecaster built for the scenario where NHSN data was not going to reported in time for the start of the forecasting challenge. |
144 | 156 |
|
145 | 157 | A flusion-adjacent model pared down to handle the case of not having the target as a predictor.
|
146 | 158 |
|
147 |
| -$$\bar{x}_{t+k} = f(t_{season}) + p + d + \big\langle y_{t-k}\big\rangle_{k=0:1} + \big\langle y_{t-k}\big\rangle_{t=0:3}$$ |
148 |
| - |
149 |
| -where $y$ here is any exogenous variables; initially this will be empty, as nssp is missing some states, so we will have to rewrite these models to handle missing geos (most likely by having a separate model for the case when an exogenous variable is missing). |
| 159 | +$$\bar{x}_{t+k} = \big\langle y_{t-k}\big\rangle_{k=0:1} + \big\langle y_{t-k}\big\rangle_{t=0:3}$$ |
150 | 160 |
|
151 |
| -$f$ is either the identity or 2 sine terms, defined so that the first has half a period during the season, and is zero after it, while the second is one period over the season, with zero after |
| 161 | +where $y$ here is any set of exogenous variables. |
152 | 162 |
|
153 | 163 | ### Flatline
|
154 | 164 |
|
155 |
| -This is what the FluSight-baseline is based on, so they should be identical. However, at the moment, this has scaling issues. |
| 165 | +A simple "LOCF" forecaster that simply forecasts the last observed value and uses residuals to create a distributional forecast. This is what the FluSight-baseline is based on, so they should be identical. |
0 commit comments