The forecast evaluation dashboard provides a robust set of tools and methods for evaluating the performance of epidemic forecasts. The project's goal is to help epidemiological researchers gain insights into the performance of their forecasts and lead to more accurate epidemic forecasting.
This app collects and scores COVID-19 forecasts submitted to the CDC. The dashboard was developed by CMU Delphi in collaboration with the Reich Lab and US COVID-19 Forecast Hub from UMass-Amherst, as part of the Forecast Evaluation Research Collaborative.
The Reich Lab created and maintains the COVID-19 Forecast Hub, a collaborative effort with over 80 groups submitting forecasts to be part of the official CDC COVID-19 ensemble forecast. All Forecase Hub forecasters that are designated "primary" or "secondary" are scored and included in the dashboard.
The Delphi Group created and maintains COVIDcast, a platform for epidemiological surveillance data. COVIDcast provides the ground truth data used to score forecasts against.
The public version of the dashboard runs off of the main branch.
The version on the dev branch appears on the staging website. The username and password are included in the meeting notes doc and on Slack.
The dashboard is backed by the forecast evaluation pipeline. The pipeline runs three times a week, on Sunday, Monday, and Tuesday, using the code on the dev branch. It collects and scores forecasts from the Forecast Hub, and posts the resulting files to a publicly-accessible AWS S3 bucket.
See the "About" writeup for more information about the data and processing steps.
main is the production branch and shouldn't be directly modified. Pull requests should be based on and merged into dev. When enough changes have accumulated on dev, a release will be made to sync main with it.
This project requires a recent version of GNU make and docker.
The easiest way to view and develop this project locally is to run the Shiny app from RStudio:
This is the same as running
shiny::runApp("<directory>")in R. However, dashboard behavior can differ running locally versus running in a container (due to package versioning, packages that haven't been properly added to the container environment, etc), so the dashboard should be also tested in a container.
The dashboard can be run in a Docker container using make. See notes in the Makefile for workarounds if you don't have image repository access.
The pipeline can be run locally with the Report/create_reports.R script or in a container. See notes in the Makefile for workarounds if you don't have image repository access.
The scoring pipline use a containerized R environment. See the docker_build directory for more details.
The pipeline can be run locally with the Report/create_reports.R script or in a container via
> make score_forecastSee notes in the Makefile for workarounds if you don't have image repository access.
The dashboard can be run in a Docker container using
> make start_dashboardSee notes in the Makefile for workarounds if you don't have image repository access.
main is the production branch and contains the code that the public dashboard uses. Code changes will accumulate on the dev branch and when we want to make a release, dev will be merged into main via the "Create Release" workflow. Version bump type (major, minor, etc) is specified manually when running the action.
If there's some issue with the workflow-based release process, a release can be done manually with:
git checkout dev
git pull origin dev
git checkout -b release_v<major>.<minor>.<patch> origin/devUpdate version number in the DESCRIPTION file and in the dashboard.
git add .
git commit -m "Version <major>.<minor>.<patch> updates"
git tag -a v<major>.<minor>.<patch> -m "Version <major>.<minor>.<patch>"
git push origin release_v<major>.<minor>.<patch>
git push origin v<major>.<minor>.<patch>Create a PR into main. After the branch is merged to main, perform cleanup by merging main into dev so that dev stays up to date.
The scoring pipeline runs in a docker container built from docker_build/Dockerfile, which is a straight copy of the covidcast-docker image. The dashboard runs in a docker container built from devops/Dockerfile.
When updates are made in the evalcast package the behavior of the scoring script can be affected and the covidcast docker image must be rebuilt. The workflow in the covidcast-docker repository that does this needs to be triggered manually. Before building the new image, ensure that the changes in evalcast will be compatible with the scoring pipeline.
Currently, the scoring pipeline uses the the evalcast package from theevalcast branch of the covidcast repository. However, if we need to make forecast eval-specific changes to the evalcast package that would conflict with other use cases, we have in the past created a dedicated forecast-eval branch of evalcast.
This should only be performed if absolutely necessary.
- Change this
forecastevalline to point to the desired (most recently working) sha256 hash rather than thelatesttag. The hashes can be found in the Delphi ghcr.io image repository -- these require special permissions to view. Ask Brian for permissions, ask Nat for hash info. - Create a PR into
main. Tag Brian as reviewer and let him know over Slack. Changes will automatically propagate to production once merged. - When creating the next normal release, code changes will no longer automatically propagate via the
latestimage to the public dashboard; the tag in theansiblesettings file must be manually changed back tolatest.
- Change the
FROMline in thedocker_buildDockerfile to point to the most recently working sha256 hash rather than thelatesttag. The hashes can be found in the Delphi ghcr.io image repository -- these require special permissions to view. Ask Brian for permissions, ask Nat for hash info. - Create a PR into
dev. Tag Katie or Nat as reviewer and let them know over Slack. Changes will automatically propagate to production once merged. - When building the next
covidcastdocker image, changes will no longer automatically propagate via thelatestcovidcastimage to the local pipeline image; the tag indocker_build/Dockerfilemust be manually changed back tolatest.
.githubworkflowscontains GitHub Actions workflow filesci.ymlruns linting on branch merge. Also builds new Docker images and pushes to the image repo for themainanddevbranchescreate_release.ymltriggered manually to mergedevintomain. Increments app version number, and creates PR intomainand tags reviewer (currently Katie).release_main.ymlruns on merge of release branch. Creates tagged release usingrelease-drafter.ymland merges updatedmainback intodevto keep them in sync.s3_upload_ec2.ymlruns the weekly self-hosted data pipeline workflow action (preceded bys3_upload.ymlthat ran the pipeline on a GitHub-provided VM)
release-drafter.ymlcreates a release
Reportcontains the code for fetching, scoring, and uploading forecasts. Runs 3 times a weekappcontains all the code for the Shiny dashboardRcontains supporting R functionsdata.Rdefines data-fetching functionsdata_manipulation.Rdefines various filter functionsdelphiLayout.Rdefines dashboard main and sub- UIsexportScores.Rcontains tools to support the score CSV download tool included in the dashboard
assetscontains supporting Markdown text.about.mdcontains the code for the "About" tab in the dasboard; other .md files contain explanations of the scores and other text info that appears in the app.wwwcontains CSS stylesheets and the logo imagesui.Rsets up the UI for the dashboard, and defines starting values for selectorsserver.Rdefines dashboard behavior. This is where the logic for the dashboard lives.global.Rdefines constants and helper functions
docker_buidcontains the Docker build configuration for the scoring pipelinedevopscontains the Docker build configuration for the Shiny dashboard- Note: when adding a new package dependency to the app, it must be specified in this Dockerfile
DESCRIPTIONsummarizes package information, such as contributors, version, and dependenciesMakefilecontains commands to build and run the dashboard, and score and upload the data
