The Epidata API records not just each signal’s estimate for a given location on a given day, but also when that estimate was made, and all updates to that estimate. This is particularly relevant for data sources that have updates or additional information coming in, due to reporting and data flow processes.
For example, let’s look at the emergency
department visits signal from the nssp
source, which estimates the percentage of emergency department visits
that are influenza-related. Consider a result row with
reference_time 2024-12-07 for
geo_values = "pa". This is an estimate for Pennsylvania on
December 7, 2024. That estimate was first reported (published)
on December 13, 2024, the delay being due to the aggregation of data by
our source and the time taken by the Epidata API to ingest the data
provided. Later, the estimate for December 7th was updated, as
additional visit data from December 7th arrived at our source and was
reported to us. This constitutes a new version of the data.
Let’s walk through how to look at that below.
Data known “as of” a specific date
By default, endpoint functions fetch the most recent data available.
This is the best option for users who simply want to graph the latest
data or construct dashboards. But if we are interested in knowing
when data was reported, we can request specific data versions
using snapshot_date in epidata_snapshot().
First, we can request the data that was available as of a
specific date, using the snapshot_date argument with
epidata_snapshot():
# The percent of ED visits due to influenza from the NSSP source, for
# 2024-12-07, as of 2024-12-14
past_snapshot <- epidata_snapshot(
source = "nssp",
signals = "pct_ed_visits_influenza",
geo_type = "state",
geo_values = "pa",
reference_time = "2024-12-07",
snapshot_date = "2024-12-14"
)
knitr::kable(past_snapshot)| signal | report_time | geo_type | geo_value | fill_method | reference_time | value |
|---|---|---|---|---|---|---|
| pct_ed_visits_influenza | 2024-12-13 | state | pa | source | 2024-12-07 | 0.55 |
This shows that an estimate of about 0.55% was known as of December
14. If we don’t specify snapshot_date, we get the most
recent estimate available:
latest_snapshot <- epidata_snapshot(
source = "nssp",
signals = "pct_ed_visits_influenza",
geo_type = "state",
geo_values = "pa",
reference_time = "2024-12-07"
)
knitr::kable(latest_snapshot)| signal | report_time | geo_type | geo_value | fill_method | reference_time | value |
|---|---|---|---|---|---|---|
| pct_ed_visits_influenza | 2026-06-26 | state | pa | source | 2024-12-07 | 0.57 |
Note the change in the estimate, from 0.55% to 0.57%, reflecting new data that became available after December 14 about visits occurring on December 7. This illustrates the importance of version tracking, particularly for forecasting tasks. To backtest a forecasting model on past data, it is important to use the data that would have been available at the time the model was or would have been fit, not data that arrived much later.
Multiple versions and revision histories
Unlike epidata_snapshot(),
epidata_archive() does not default to the latest data: by
using it with the report_time argument, we can request all
versions reported in a certain time period, and if
report_time is omitted entirely, we get every version ever
reported.
# All versions of the percent of ED visits due to influenza from the NSSP
# source, for 2024-12-07, reported between 2024-12-01 and 2025-01-15
archive_data <- epidata_archive(
source = "nssp",
signals = "pct_ed_visits_influenza",
geo_type = "state",
geo_values = "pa",
reference_time = "2024-12-07",
report_time = epirange("2024-12-01", "2025-01-15")
)
knitr::kable(archive_data)| signal | report_time | geo_type | geo_value | fill_method | reference_time | value |
|---|---|---|---|---|---|---|
| pct_ed_visits_influenza | 2024-12-13 | state | pa | source | 2024-12-07 | 0.55 |
| pct_ed_visits_influenza | 2024-12-20 | state | pa | source | 2024-12-07 | 0.56 |
| pct_ed_visits_influenza | 2024-12-27 | state | pa | source | 2024-12-07 | 0.56 |
| pct_ed_visits_influenza | 2025-01-03 | state | pa | source | 2024-12-07 | 0.56 |
| pct_ed_visits_influenza | 2025-01-10 | state | pa | source | 2024-12-07 | 0.56 |
This estimate was updated several times as new data for December 7th arrived.
Note that these results include only data reported between (inclusive) 2024-12-01 and 2025-01-15. If a value was first reported outside this range, a query for reports between 2024-12-01 and 2025-01-15 will not include that value among its results.
The report_time parameter also accepts comparison
operators (< and >, each strictly
exclusive of the given date) or a range with epirange().
(Note: exact dates are not supported on epidata_archive();
use epidata_snapshot(snapshot_date = ...) if you need data
as of a single date.)
# Versions reported strictly before 2025-01-01
epidata_archive(
source = "nssp",
signals = "pct_ed_visits_influenza",
geo_type = "state",
geo_values = "pa",
reference_time = "2024-12-07",
report_time = "<2025-01-01"
)
#> # A tibble: 3 × 7
#> signal report_time geo_type geo_value fill_method reference_time value
#> <chr> <date> <chr> <chr> <chr> <date> <dbl>
#> 1 pct_ed_visits… 2024-12-13 state pa source 2024-12-07 0.550
#> 2 pct_ed_visits… 2024-12-20 state pa source 2024-12-07 0.560
#> 3 pct_ed_visits… 2024-12-27 state pa source 2024-12-07 0.560
# Versions reported strictly after 2024-12-13
epidata_archive(
source = "nssp",
signals = "pct_ed_visits_influenza",
geo_type = "state",
geo_values = "pa",
reference_time = "2024-12-07",
report_time = ">2024-12-13"
)
#> # A tibble: 116 × 7
#> signal report_time geo_type geo_value fill_method reference_time value
#> <chr> <date> <chr> <chr> <chr> <date> <dbl>
#> 1 pct_ed_visits… 2024-12-20 state pa source 2024-12-07 0.560
#> 2 pct_ed_visits… 2024-12-27 state pa source 2024-12-07 0.560
#> 3 pct_ed_visits… 2025-01-03 state pa source 2024-12-07 0.560
#> 4 pct_ed_visits… 2025-01-10 state pa source 2024-12-07 0.560
#> # ℹ 112 more rowsCalculating reporting lag
In the V5 API, reporting lag is computed directly as the difference
between report_time (the publication date) and
reference_time (the observation date):
archive_with_lag <- archive_data %>%
mutate(lag_days = as.integer(report_time - reference_time)) %>%
select(signal, reference_time, report_time, lag_days, value)
knitr::kable(archive_with_lag)| signal | reference_time | report_time | lag_days | value |
|---|---|---|---|---|
| pct_ed_visits_influenza | 2024-12-07 | 2024-12-13 | 6 | 0.55 |
| pct_ed_visits_influenza | 2024-12-07 | 2024-12-20 | 13 | 0.56 |
| pct_ed_visits_influenza | 2024-12-07 | 2024-12-27 | 20 | 0.56 |
| pct_ed_visits_influenza | 2024-12-07 | 2025-01-03 | 27 | 0.56 |
| pct_ed_visits_influenza | 2024-12-07 | 2025-01-10 | 34 | 0.56 |
If your analysis requires filtering data to a specific maximum
reporting lag (for example, simulating data available with at most a
14-day delay), filter by lag_days:
archive_with_lag %>%
filter(lag_days <= 14)
#> # A tibble: 2 × 5
#> signal reference_time report_time lag_days value
#> <chr> <date> <date> <int> <dbl>
#> 1 pct_ed_visits_influenza 2024-12-07 2024-12-13 6 0.550
#> 2 pct_ed_visits_influenza 2024-12-07 2024-12-20 13 0.560For sources that have not yet transitioned from the legacy V4 API,
versioning is specified differently; see
vignette("migration-guide") for the argument and column
mappings between V4 and V5, including worked before-and-after examples
of revision history queries.