diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index cd3864356..885295665 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -46,14 +46,22 @@ jobs: with: path: | ./blogdown - key: ${{ runner.os }}-blogdown2-${{ hashFiles('content/blog/**.Rmd') }} + key: ${{ runner.os }}-blogdown2-${{ hashFiles('environment.yml') }}-${{ hashFiles('content/blog/**.Rmd') }} restore-keys: | + ${{ runner.os }}-blogdown2-${{ hashFiles('environment.yml') }}- ${{ runner.os }}-blogdown2- - name: Build site shell: bash -l {0} run: | npm run build:blog + - uses: actions/upload-artifact@v2 + with: + name: blog + path: | + ./content/blog + ./static/blog + - uses: actions/setup-node@v1 with: node-version: "12" diff --git a/.gitpod.yml b/.gitpod.yml new file mode 100644 index 000000000..8add1bf12 --- /dev/null +++ b/.gitpod.yml @@ -0,0 +1,10 @@ +image: + file: ./devops/gitpod.dockerfile +tasks: + - init: npm install && RScript -e "blogdown::install_hugo()" + - command: "echo 'run: \"npm start\" or \"npm run start:blog\"'" +ports: + - port: 1313 +vscode: + extensions: + - ikuyadeu.r@1.6.3:SrD06skfmg05hLAerl2aKQ== diff --git a/.prettierignore b/.prettierignore index 74222a5af..d78dc8f58 100644 --- a/.prettierignore +++ b/.prettierignore @@ -29,4 +29,6 @@ *.md *.jpeg *.ico -/themes/delphi/layouts/partials/webp-image.html \ No newline at end of file +/themes/delphi/layouts/partials/webp-image.html +/themes/delphi/layouts/shortcodes/apireflink.html +/themes/delphi/layouts/shortcodes/reflink.html \ No newline at end of file diff --git a/README.md b/README.md index 0bf390001..cda600316 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,8 @@ # Delphi Website +[](https://gitpod.io/#https://github.com/cmu-delpih/www-main) + + Delphi's homepage at https://cmu-delphi-main.netlify.app/ This site is based on [Hugo](https://gohugo.io) and uses [Prettier](https://prettier.io) for formatting. @@ -38,9 +41,9 @@ In RMarkdown things are slightly more different since the R Markdown parser is u **Examples** ``` -[Facebook](`r blogdown::shortcode_html("ref", "2020-08-26-fb-survey")`) -[previous exploratory investigations](`r blogdown::shortcode_html("ref", "2020-08-26-fb-survey#some-interesting-examples")`) -[public API](`r blogdown::shortcode_html("apiref", "api/covidcast.html")`) +`r blogdown::shortcode_html("reflink", "2020-08-26-fb-survey", "Facebook")` +`r blogdown::shortcode_html("reflink", "2020-08-26-fb-survey#some-interesting-examples", "previous exploratory investigations")` +`r blogdown::shortcode_html("apireflink", "api/covidcast.html", "public API")` ``` @@ -53,6 +56,8 @@ In addition, there in the `/data` directory there are the following listings in ## Development Environment +One click: [](https://gitpod.io/#https://github.com/cmu-delpih/www-main) + ### Web Editor Only 1. Install Node: https://nodejs.org/en/download/ diff --git a/content/blog/2015-07-23-template-post.Rmd b/content/blog/2015-07-23-template-post.Rmd index c44aa5852..1cfff0c74 100644 --- a/content/blog/2015-07-23-template-post.Rmd +++ b/content/blog/2015-07-23-template-post.Rmd @@ -110,12 +110,12 @@ suggest we consider the following tags as base tags: ### Linking to other pages and blog posts: -using the file name and the Hugo shortcodes, e.g.: [Facebook Post](`r blogdown::shortcode_html("relref", "2020-08-26-fb-survey")`). +using the file name and the Hugo shortcodes, e.g.: `r blogdown::shortcode_html("reflink", "2020-08-26-fb-survey", "Facebook Post")`. Jumping to a specific section/anchor is supported too: -[previous exploratory investigations](`r blogdown::shortcode_html("relref", "2020-08-26-fb-survey#some-interesting-examples")`) +`r blogdown::shortcode_html("reflink", "2020-08-26-fb-survey#some-interesting-examples", "previous exploratory investigations")` ### Linking to the API doc: there is another shortcode for creating an api link, e.g. -[public API](`r blogdown::shortcode_html("apiref", "/")`) or -[Doctor's Visits signal](`r blogdown::shortcode_html("apiref", "api/covidcast-signals/doctor-visits.html")`) +`r blogdown::shortcode_html("apireflink", "/", "public API")` or +`r blogdown::shortcode_html("apireflink", "api/covidcast-signals/doctor-visits.html", "Doctor's Visits signal")` diff --git a/content/blog/2015-07-23-template-post.html b/content/blog/2015-07-23-template-post.html index 19cc04435..1ff2f3f81 100644 --- a/content/blog/2015-07-23-template-post.html +++ b/content/blog/2015-07-23-template-post.html @@ -23,8 +23,6 @@ --- - -
You can embed an R code chunk like this:
summary(cars)
-## speed dist
-## Min. : 4.0 Min. : 2.00
-## 1st Qu.:12.0 1st Qu.: 26.00
-## Median :15.0 Median : 36.00
-## Mean :15.4 Mean : 42.98
-## 3rd Qu.:19.0 3rd Qu.: 56.00
+## speed dist
+## Min. : 4.0 Min. : 2.00
+## 1st Qu.:12.0 1st Qu.: 26.00
+## Median :15.0 Median : 36.00
+## Mean :15.4 Mean : 42.98
+## 3rd Qu.:19.0 3rd Qu.: 56.00
## Max. :25.0 Max. :120.00
fit <- lm(dist ~ speed, data = cars)
fit
-##
+##
## Call:
## lm(formula = dist ~ speed, data = cars)
-##
+##
## Coefficients:
-## (Intercept) speed
+## (Intercept) speed
## -17.579 3.932
using the file name and the Hugo shortcodes, e.g.: }}">Facebook Post. +
using the file name and the Hugo shortcodes, e.g.: {{< reflink "2020-08-26-fb-survey" "Facebook Post" >}}. Jumping to a specific section/anchor is supported too: -}}">previous exploratory investigations
+{{< reflink "2020-08-26-fb-survey#some-interesting-examples" "previous exploratory investigations" >}}there is another shortcode for creating an api link, e.g. -}}">public API or -}}">Doctor’s Visits signal
+{{< apireflink "/" "public API" >}} or +{{< apireflink "api/covidcast-signals/doctor-visits.html" "Doctor's Visits signal" >}}When the COVID-19 pandemic arrived, we focused all our attention on it. Our Delphi team quickly grew to 30+ members, and is still growing. @@ -79,7 +77,7 @@
With new members comes a new breadth of expertise: our expertise now covers statistical modeling, computation, @@ -146,13 +144,11 @@
We’ve built a }}">public -API, -and }}">R and Python -packages, +
We’ve built a {{< apireflink "api/covidcast.html" "public API" >}}, +and {{< apireflink "api/covidcast_clients.html" "R and Python packages" >}}, to serve our indicators to researchers and the public. This API provides new data daily.
We’ve built interactive maps and graphics to +
We’ve built {{< reflink "covidcast" "interactive maps and graphics" >}} to display our indicators, and better inform the public and decision-makers.
We’ve developed forecasts of the future spread of the pandemic, validated them prospectively, and started submitting them to CDC.
We make aggregated data publicly available daily through our -}}">COVIDcast API, -and visualize it on our }}">COVIDcast interactive map. +{{< apireflink "api/covidcast.html" "COVIDcast API" >}}, +and visualize it on our {{< reflink "covidcast" "COVIDcast interactive map" >}}. We also make (fully de-identified) individual survey responses available to researchers who agree to data use terms.
@@ -178,8 +178,7 @@Our symptom data is entirely self-reported, in contrast to data reported by medical professionals. Some fraction of the responses could be @@ -248,8 +246,7 @@
Details on how we compute the % CLI and % CLI-in-community estimates can be -found in our }}">COVIDcast signals -documentation.
+found in our {{< apireflink "api/covidcast-signals/fb-survey.html" "COVIDcast signals documentation" >}}.The % CLI-in-community indicator has an interesting backstory: it was sort of a “happy accident” from an experiment we tried with surveys we were running in partnership with Google. (We’ll cover our Google survey in a future blog post.) @@ -268,10 +265,8 @@
Our }}">survey documentation -site includes more -details about the survey, including the }}">full text of every survey -version. +
Our {{< apireflink "symptom-survey/" "survey documentation site" >}} includes more +details about the survey, including the {{< apireflink "symptom-survey/coding.html" "full text of every survey version" >}}. And yes, researchers can request access to (fully de-identified) individual survey responses for research purposes, @@ -579,7 +574,6 @@
One of our primary initiatives at the Delphi COVIDcast project -(}}">learn more about our organization here) +({{< reflink "2020-08-10-hello-world" "learn more about our organization here" >}}) has been to curate a diverse set of COVID-related data streams, and to make them freely available through our -}}">COVIDcast Epidata API. +{{< apireflink "api/covidcast.html" "COVIDcast Epidata API" >}}. These include both novel signals that we have collected and analyzed ourselves, -such as our symptom survey }}">distributed by Facebook -to its users, }}">Google’s symptom survey whose results are delivered to us, +such as our symptom survey {{< reflink "2020-09-18-google-survey" "distributed by Facebook" >}} +to its users, {{< reflink "2020-09-18-google-survey" "Google's symptom survey" >}} whose results are delivered to us, the percentage of doctor’s visits due to COVID-like illness, and results from Quidel’s antigen tests; and also existing signals, such as the confirmed case counts @@ -83,8 +81,7 @@ Python and R packages.
We have always made our code, data and estimates freely and publicly available, from the very beginning of our work on flu back in 2013, well before the COVID pandemic. -Back in 2016, Delphi member David Farrow designed and implemented the }}">Epidata -API to share data from our numerous surveillance +Back in 2016, Delphi member David Farrow designed and implemented the {{< apireflink "/" "Epidata API" >}} to share data from our numerous surveillance streams for influenza and other diseases, and pioneered many of the API concepts discussed below. Now that COVID-19 is here, our collaborations with partner organizations in technology and healthcare enable us to include a @@ -107,8 +104,7 @@
The data streams that we work with can be roughly mapped onto the epidemic severity pyramid, @@ -174,19 +170,18 @@
Additionally, we host the following more widely-available signals in our API for the convenience of the research community, and to provide revision tracking:
@@ -232,8 +226,7 @@A massive database of COVID-19 data is, of course, of no use if nobody can access it. We provide several ways to access COVIDcast data.
-First, the }}">public COVIDcast map +
First, the {{< reflink "covidcast" "public COVIDcast map" >}} provides a selection of our signals, and includes an “Export Data” tab that can pull a selected signal and download it as a CSV. @@ -513,11 +506,9 @@
The first step of using the packages to acquire the data is to identify the
source and signal name for the data you want to analyze. Suppose, for example,
-that you browse the }}">COVIDcast signal
-documentation
+that you browse the {{< apireflink "api/covidcast_signals.html" "COVIDcast signal documentation" >}}
and decide you would like to conduct an analysis of a hospital admissions
-signal. According to }}">its documentation
-page,
+signal. According to {{< apireflink "api/covidcast-signals/hospital-admissions.html" "its documentation page" >}},
this source is called hospital-admissions, and there are several available
signals to choose from. Reviewing the technical details, you decide
smoothed_adj_covid19 fits your needs best, because it removes day-of-week
@@ -558,10 +549,8 @@
fb-survey data source’s smoothed_hh_cmnty_cli signal.
(Click the “Code” button to see the Python code used to produce this example.)
import covidcast
@@ -590,18 +579,17 @@ Accessing the API
estimated percent of people with COVID-Like Illness based on our symptom
surveys—for one county in the United States between April 6 and April
10, 2020. That county is Alameda County, CA, which has the FIPS code 06001.
-Query syntax is defined on our }}">API documentation
-site, and you
+
Query syntax is defined on our {{< apireflink "api/covidcast.html" "API documentation site" >}}, and you
can use any programming language that supports making HTTP requests—which is
most programming languages—to fetch up-to-date data.
The }}">COVIDcast API +
The {{< apireflink "api/covidcast.html" "COVIDcast API" >}} provides unified access to numerous COVID data streams, -which can be browsed through our }}">interactive map +which can be browsed through our {{< reflink "covidcast" "interactive map" >}} and easily accessed through our -}}">R and Python packages. +{{< apireflink "api/covidcast_clients.html" "R and Python packages" >}}. Unlike most other sources of COVID data, it tracks the complete revision history of every signal, allowing historical reconstructions of diff --git a/content/blog/2020-09-18-google-survey.Rmd b/content/blog/2020-09-18-google-survey.Rmd index ea565b0ca..722080bd1 100644 --- a/content/blog/2020-09-18-google-survey.Rmd +++ b/content/blog/2020-09-18-google-survey.Rmd @@ -40,14 +40,12 @@ output: toc: true --- -Since April 2020, in addition to our [massive daily survey advertised on -Facebook](`r blogdown::shortcode_html("ref", "2020-08-26-fb-survey")`), +Since April 2020, in addition to our `r blogdown::shortcode_html("reflink", "2020-08-26-fb-survey", "massive daily survey advertised on Facebook")`, we've been running (even-more-massive) surveys through Google to track the spread of COVID-19 in the United States. At its peak, our Google survey was taken by over 1.2 million people in a single day, and over its first month in operation, averaged about 600,000 daily respondents. As usual, we make -aggregated data from this survey available through our [COVIDcast -API](`r blogdown::shortcode_html("apiref", "api/covidcast.html")`). +aggregated data from this survey available through our `r blogdown::shortcode_html("apireflink", "api/covidcast.html", "COVIDcast API")`. In mid-May, we decided to pause daily dissemination of this survey in order to focus on our (longer, more complex) survey through Facebook, @@ -62,8 +60,7 @@ and shares some of our thinking about next steps for the Google survey. Back in March 2020, around the time we began discussions with Facebook about COVID-19 symptom surveys, we pitched the same idea to Google. -Our motivation, [as we explained in our last -post](`r blogdown::shortcode_html("ref", "2020-08-26-fb-survey#why-run-these-surveys")`), +Our motivation, `r blogdown::shortcode_html("reflink", "2020-08-26-fb-survey#why-run-these-surveys", "as we explained in our last post")`, has been to produce real-time, county-level data streams of self-reported COVID symptoms that can potentially serve as **early indicators** of COVID activity in the US. As we noted in that post, we weren't the only data scientists @@ -127,8 +124,7 @@ this CLI-in-community question to our survey through Facebook. the subject is asked to report on someone else. The traditional view seems to be that proxy questions can undermine survey data quality, but in our setting it's critical: not only does it provide a safeguard against revealing personal - health information, it turned out to deliver [much higher - correlations](`r blogdown::shortcode_html("ref", "2020-08-26-fb-survey#basic-correlation-analysis")`) + health information, it turned out to deliver `r blogdown::shortcode_html("reflink", "2020-08-26-fb-survey#basic-correlation-analysis", "much higher correlations")` with case rates than the direct (non-proxy) question. To give you a feel for the data, below we plot @@ -224,8 +220,7 @@ about 74,000 responses per day.) The actual sampling scheme behind our Google survey is more complicated, and involves two-level stratification, across both counties and states. For details, including those on statistical estimation, -visit our [COVIDcast signals -documentation](`r blogdown::shortcode_html("apiref", "api/covidcast-signals/google-survey.html")`). +visit our `r blogdown::shortcode_html("apireflink", "api/covidcast-signals/google-survey.html", "COVIDcast signals documentation")`. On May 15, we paused our Google survey to focus on our Facebook survey, which is both longer and more complex. Importantly, the latter is _not_ a replacement for the former, @@ -262,8 +257,7 @@ which for the most part holds a substantial gap over the correlations between the Facebook signal and case rates. This is no doubt encouraging, especially because we'd hope that the Google correlations would have only improved later in -the year (as did the Facebook correlations, which we [previously -suggested](`r blogdown::shortcode_html("ref", "2020-08-26-fb-survey#basic-correlation-analysis")`) +the year (as did the Facebook correlations, which we `r blogdown::shortcode_html("reflink", "2020-08-26-fb-survey#basic-correlation-analysis", "previously suggested")` could have been due to the increase in the diversity of county-level case rates around mid-June). @@ -281,8 +275,7 @@ case rates around mid-June). analysis for when we work on deploying these two surveys in tandem; for now, we emphasize that this observation reiterates the importance of focusing on _time-varying trends_ in the survey signals, not the signal values themselves - (a point we [made in our last - post](`r blogdown::shortcode_html("ref", "2020-08-26-fb-survey#why-run-these-surveys")`)). + (a point we `r blogdown::shortcode_html("reflink", "2020-08-26-fb-survey#why-run-these-surveys", "made in our last post")`). Here, the self-reporting aspect must somehow be creating greatly different levels of bias in the two surveys; in an absolute sense, the subsequent estimates of % CLI-in-community strongly disagree, so both can't be right, and @@ -359,8 +352,7 @@ As we can see from the above summary, the two survey schemes are complementary, and could be used synergistically. Our Facebook survey is a continuously-running, wide-reaching instrument -that provides answers to a [rich set of -questions](`r blogdown::shortcode_html("apiref", "symptom-survey/coding.html")`) +that provides answers to a `r blogdown::shortcode_html("apireflink", "symptom-survey/coding.html", "rich set of questions")` (beyond COVID-related symptoms, it asks about contacts, risk factors, behavior, and demographics). When we find something interesting that warrants follow-up diff --git a/content/blog/2020-09-18-google-survey.html b/content/blog/2020-09-18-google-survey.html index a58fca1bc..be2e63b82 100644 --- a/content/blog/2020-09-18-google-survey.html +++ b/content/blog/2020-09-18-google-survey.html @@ -11,27 +11,27 @@ heroImage: /blog/images/blog-lg-img_google-survey-post.jpg heroImageThumb: /blog/images/blog-thumb-img_google-survey-post.jpg summary: | - Since April 2020, in addition to our massive daily survey advertised on - Facebook, we've been running (even-more-massive) surveys through Google to - track the spread of COVID-19 in the United States. - At its peak, our Google survey was taken by over 1.2 million people in a single - day, and over its first month in operation, averaged over 600,000 daily - respondents. In mid-May, we paused daily dissemination of this survey in order + Since April 2020, in addition to our massive daily survey advertised on + Facebook, we've been running (even-more-massive) surveys through Google to + track the spread of COVID-19 in the United States. + At its peak, our Google survey was taken by over 1.2 million people in a single + day, and over its first month in operation, averaged over 600,000 daily + respondents. In mid-May, we paused daily dissemination of this survey in order to focus on our (longer, more complex) survey through Facebook, - but we plan to bring back the Google survey this fall. - This short post covers some key differences between our Google and Facebook + but we plan to bring back the Google survey this fall. + This short post covers some key differences between our Google and Facebook surveys, explains the backstory behind the "CLI-in-community" question - as it arose through our collaboration with Google, + as it arose through our collaboration with Google, and shares some of our thinking about next steps for the Google survey. acknowledgements: | - Ryan Tibshirani wrote the initial code for producing - estimates from the aggregated survey data. Sangwon Hyun, Natalia Lombardi de + Ryan Tibshirani wrote the initial code for producing + estimates from the aggregated survey data. Sangwon Hyun, Natalia Lombardi de Oliveira, and Lester Mackey greatly extended and improved this codebase, and - they developed, along with Ryan, the underlying statistical methodology. Ryan - came up with the idea of running the surveys, and worked with Google to make - this a reality. On the Google side, Brett Slatkin and Hal Varian have been key - collaborators; Brett wrote the code to get daily survey data over to Delphi's - estimation pipeline; and both contributed numerous important ideas at various + they developed, along with Ryan, the underlying statistical methodology. Ryan + came up with the idea of running the surveys, and worked with Google to make + this a reality. On the Google side, Brett Slatkin and Hal Varian have been key + collaborators; Brett wrote the code to get daily survey data over to Delphi's + estimation pipeline; and both contributed numerous important ideas at various stages of the project. output: html_document: @@ -41,8 +41,6 @@ --- - -
Since April 2020, in addition to our }}">massive daily survey advertised on -Facebook, +
Since April 2020, in addition to our {{< reflink "2020-08-26-fb-survey" "massive daily survey advertised on Facebook" >}}, we’ve been running (even-more-massive) surveys through Google to track the spread of COVID-19 in the United States. At its peak, our Google survey was taken by over 1.2 million people in a single day, and over its first month in operation, averaged about 600,000 daily respondents. As usual, we make -aggregated data from this survey available through our }}">COVIDcast -API.
+aggregated data from this survey available through our {{< apireflink "api/covidcast.html" "COVIDcast API" >}}.In mid-May, we decided to pause daily dissemination of this survey in order to focus on our (longer, more complex) survey through Facebook, but we plan to bring back the Google survey this fall. @@ -73,8 +69,7 @@
Back in March 2020, around the time we began discussions with Facebook about COVID-19 symptom surveys, we pitched the same idea to Google. -Our motivation, }}">as we explained in our last -post, +Our motivation, {{< reflink "2020-08-26-fb-survey#why-run-these-surveys" "as we explained in our last post" >}}, has been to produce real-time, county-level data streams of self-reported COVID symptoms that can potentially serve as early indicators of COVID activity in the US. As we noted in that post, we weren’t the only data scientists @@ -216,8 +211,7 @@
# Fetch county-level Google and Facebook % CLI-in-community signals, and JHU
@@ -324,8 +317,7 @@ Google Survey Redux
the two survey schemes are complementary,
and could be used synergistically.
Our Facebook survey is a continuously-running, wide-reaching instrument
-that provides answers to a }}">rich set of
-questions
+that provides answers to a {{< apireflink "symptom-survey/coding.html" "rich set of questions" >}}
(beyond COVID-related symptoms, it asks about
contacts, risk factors, behavior, and demographics).
When we find something interesting that warrants follow-up
@@ -345,8 +337,7 @@ Google Survey Redux
the subject is asked to report on someone else. The traditional view seems to
be that proxy questions can undermine survey data quality, but in our setting
it’s critical: not only does it provide a safeguard against revealing personal
-health information, it turned out to deliver }}">much higher
-correlations
+health information, it turned out to deliver {{< reflink "2020-08-26-fb-survey#basic-correlation-analysis" "much higher correlations" >}}
with case rates than the direct (non-proxy) question.↩︎
A closer look reveals that the relationship between the Google
% CLI-in-community and Facebook % CLI-in-community signals is not 1:1. For
@@ -361,8 +352,7 @@
Google Survey Redux
analysis for when we work on deploying these two surveys in tandem; for now, we
emphasize that this observation reiterates the importance of focusing on
time-varying trends in the survey signals, not the signal values themselves
-(a point we }}">made in our last
-post).
+(a point we {{< reflink "2020-08-26-fb-survey#why-run-these-surveys" "made in our last post" >}}).
Here, the self-reporting aspect must somehow be creating greatly different
levels of bias in the two surveys; in an absolute sense, the subsequent
estimates of % CLI-in-community strongly disagree, so both can’t be right, and
diff --git a/content/blog/2020-09-21-forecast-demo.Rmd b/content/blog/2020-09-21-forecast-demo.Rmd
index b26c4315a..a50beaebc 100644
--- a/content/blog/2020-09-21-forecast-demo.Rmd
+++ b/content/blog/2020-09-21-forecast-demo.Rmd
@@ -35,9 +35,9 @@ output:
In our past two posts, we wrote about the COVID-19 symptom surveys that Delphi
runs through
-[Facebook](`r blogdown::shortcode_html("ref", "2020-08-26-fb-survey")`)
+`r blogdown::shortcode_html("reflink", "2020-08-26-fb-survey", "Facebook")`
and
-[Google](`r blogdown::shortcode_html("ref", "2020-09-18-google-survey")`).
+`r blogdown::shortcode_html("reflink", "2020-09-18-google-survey", "Google")`.
These surveys have asked millions of people in the United States whether they
(or people they know) are experiencing COVID-like symptoms, allowing us to
calculate a "% CLI-in-community" signal for counties across the United States:
@@ -73,8 +73,7 @@ where the goal is to predict whether case rates will rise significantly,
rather than to predict the future case rates directly, as in forecasting.
To motivate why we might be optimistic about the utility of incorporating
our survey signals into forecasting or hotspot detection models, you can
-check out our [previous exploratory
-investigations](`r blogdown::shortcode_html("ref", "2020-08-26-fb-survey#some-interesting-examples")`),
+check out our `r blogdown::shortcode_html("reflink", "2020-08-26-fb-survey#some-interesting-examples", "previous exploratory investigations")`,
which suggested that they can serve as **early indicators** of COVID-19
activity. Stay tuned to the Delphi blog for a post on hotspot detection
soon.
@@ -217,8 +216,7 @@ which ends up being May 6 through May 14 for 7-day-ahead forecasts,
and only May 13 through May 14 for 14-day-ahead forecasts.
(The reason for this shortened period:
we paused running the Google survey on May 14 so its data ends there,
-but as we explained in our last post, we [plan to bring it
-back](`r blogdown::shortcode("ref", "2020-09-18-google-survey#google-survey-redux")`)
+but as we explained in our last post, we `r blogdown::shortcode_html("reflink", "2020-09-18-google-survey#google-survey-redux", "plan to bring it back")`
later this fall.) Hence we skip studying the 14-day-ahead forecasts results
in this four-way model discussion, as they're only based on 2 days of test data.
@@ -607,9 +605,8 @@ so that data gets pulled "as of" the forecast date
Hopefully these preliminary findings have gotten you excited
about the possible uses of our symptom survey data.
To get started playing with our data yourself,
-take a look at our [interactive COVIDcast map](`r blogdown::shortcode_html("ref", "covidcast")`),
-or our [COVIDcast
-API](`r blogdown::shortcode_html("apiref", "api/covidcast.html")`),
+take a look at our `r blogdown::shortcode_html("reflink", "covidcast", "interactive COVIDcast map")`,
+or our `r blogdown::shortcode_html("apireflink", "api/covidcast.html", "COVIDcast API")`,
through our [R client](https://cmu-delphi.github.io/covidcast/covidcastR/)
or [Python client](https://cmu-delphi.github.io/covidcast/covidcast-py/html/).
And if you're feeling adventurous, consider competing in the
diff --git a/content/blog/2020-09-21-forecast-demo.html b/content/blog/2020-09-21-forecast-demo.html
index 265b19e13..cc20314fc 100644
--- a/content/blog/2020-09-21-forecast-demo.html
+++ b/content/blog/2020-09-21-forecast-demo.html
@@ -34,8 +34,6 @@
---
-
-
@@ -51,9 +49,9 @@
In our past two posts, we wrote about the COVID-19 symptom surveys that Delphi
runs through
-}}">Facebook
+{{< reflink "2020-08-26-fb-survey" "Facebook" >}}
and
-}}">Google.
+{{< reflink "2020-09-18-google-survey" "Google" >}}.
These surveys have asked millions of people in the United States whether they
(or people they know) are experiencing COVID-like symptoms, allowing us to
calculate a “% CLI-in-community” signal for counties across the United States:
@@ -86,8 +84,7 @@
rather than to predict the future case rates directly, as in forecasting.
To motivate why we might be optimistic about the utility of incorporating
our survey signals into forecasting or hotspot detection models, you can
-check out our }}">previous exploratory
-investigations,
+check out our {{< reflink "2020-08-26-fb-survey#some-interesting-examples" "previous exploratory investigations" >}},
which suggested that they can serve as early indicators of COVID-19
activity. Stay tuned to the Delphi blog for a post on hotspot detection
soon.
@@ -411,8 +408,7 @@ Results: All Four Models
and only May 13 through May 14 for 14-day-ahead forecasts.
(The reason for this shortened period:
we paused running the Google survey on May 14 so its data ends there,
-but as we explained in our last post, we plan to bring it
-back
+but as we explained in our last post, we {{< reflink "2020-09-18-google-survey#google-survey-redux" "plan to bring it back" >}}
later this fall.) Hence we skip studying the 14-day-ahead forecasts results
in this four-way model discussion, as they’re only based on 2 days of test data.
Below we compute and print the median scaled errors for each of the four models
@@ -1005,9 +1001,8 @@
Wrap-Up
Hopefully these preliminary findings have gotten you excited
about the possible uses of our symptom survey data.
To get started playing with our data yourself,
-take a look at our }}">interactive COVIDcast map,
-or our }}">COVIDcast
-API,
+take a look at our {{< reflink "covidcast" "interactive COVIDcast map" >}},
+or our {{< apireflink "api/covidcast.html" "COVIDcast API" >}},
through our R client
or Python client.
And if you’re feeling adventurous, consider competing in the
diff --git a/content/blog/2020-10-06-survey-wave-4.Rmd b/content/blog/2020-10-06-survey-wave-4.Rmd
index ad8ea7d5f..44b6414bc 100644
--- a/content/blog/2020-10-06-survey-wave-4.Rmd
+++ b/content/blog/2020-10-06-survey-wave-4.Rmd
@@ -31,7 +31,7 @@ output:
toc: true
---
-Beginning in early April 2020, the [Delphi group](`r blogdown::shortcode("ref", "/")`) has
+Beginning in early April 2020, the `r blogdown::shortcode_html("reflink", "/", "Delphi group")` has
conducted a major survey to track COVID-19 across the United States. With the
support of Facebook Data for Good, we have been able to recruit tens of
thousands of active Facebook users _every day_ to take our voluntary survey.
@@ -39,18 +39,13 @@ Concurrently, a University of Maryland team has conducted a [parallel
international effort](https://covidmap.umd.edu/) covering over 100 countries
worldwide. Every day, we aggregate our survey results to produce estimates of
symptoms for counties and states across the United States, making these
-estimates available through our [COVIDcast map](`r blogdown::shortcode("ref", "covidcast")`) and
-our [public
-API](`r blogdown::shortcode_html("apiref", "api/covidcast.html")`). This
-augments the [numerous other data sources available in our COVIDcast
-API](`r blogdown::shortcode("ref", "2020-08-28-api")`)
+estimates available through our `r blogdown::shortcode_html("reflink", "covidcast", "COVIDcast map")` and
+our `r blogdown::shortcode_html("apireflink", "api/covidcast.html", "public API")`. This
+augments the `r blogdown::shortcode_html("reflink", "2020-08-28-api", "numerous other data sources available in our COVIDcast API")`
to form a more complete picture of the pandemic.
-In previous posts, we demonstrated how [self-reported symptoms on our survey can
-correlate strongly with COVID
-cases](`r blogdown::shortcode("ref", "2020-08-26-fb-survey")`)
-and how [symptom survey data could improve forecasts of COVID
-cases](`r blogdown::shortcode("ref", "2020-09-21-forecast-demo")`).
+In previous posts, we demonstrated how `r blogdown::shortcode_html("reflink", "2020-08-26-fb-survey", "self-reported symptoms on our survey can correlate strongly with COVID cases")`
+and how `r blogdown::shortcode_html("reflink", "2020-09-21-forecast-demo", "symptom survey data could improve forecasts of COVID cases")`.
Our data is also powering the [COVID-19 Symptom Data
Challenge](https://www.symptomchallenge.org/), which asked participants to use our
symptom survey data to enable earlier detection of outbreaks and help public
@@ -93,8 +88,7 @@ Facebook to recruit respondents.)
## Insights from the New Survey Instrument
-The full text of the survey can be found [on our documentation
-site](`r blogdown::shortcode_html("apiref", "symptom-survey/coding.html")`)---this
+The full text of the survey can be found `r blogdown::shortcode_html("apireflink", "symptom-survey/coding.html", "on our documentation site")`---this
version is Wave 4.
```{r sample-size, message=FALSE, include=FALSE}
@@ -113,8 +107,7 @@ States. Each response includes questions about symptoms, mask wearing, testing,
and the other important topics described above, along with demographic details
about the respondent. These demographics include age, gender, race, occupation,
and education, allowing us to understand how different groups have been affected
-and which groups are currently most vulnerable to COVID-19. (As we [described
-before](`r blogdown::shortcode_html("ref", "2020-08-26-fb-survey")`),
+and which groups are currently most vulnerable to COVID-19. (As we `r blogdown::shortcode_html("reflink", "2020-08-26-fb-survey", "described before")`,
Facebook does not receive any individual survey responses; we at Carnegie Mellon
collect this data and prepare aggregate data, which does not identify any
individual respondent, for public release.)
@@ -122,8 +115,7 @@ individual respondent, for public release.)
Let's explore just a few of the questions on the survey to see what they can
tell us. All of the plots below were made using our [covidcast R
package](https://cmu-delphi.github.io/covidcast/covidcastR/) using data we make
-publicly available in the [COVIDcast
-API](`r blogdown::shortcode_html("apiref", "api/covidcast.html")`)---click the
+publicly available in the `r blogdown::shortcode_html("apireflink", "api/covidcast.html", "COVIDcast API")`---click the
Code button to see the full code for each example.
### Mask Wearing
@@ -132,8 +124,7 @@ First, a simple question: What percentage of respondents say that they wear a
mask most or all of the time when they're in public? For comparison, we'll map
this next to map of the percentage of respondents who personally know someone in
their local community who is sick (with a fever and at least one other symptom,
-such as cough or difficulty breathing). This percentage [correlates very
-well](`r blogdown::shortcode_html("ref", "2020-08-26-fb-survey#some-interesting-examples")`)
+such as cough or difficulty breathing). This percentage `r blogdown::shortcode_html("reflink", "2020-08-26-fb-survey#some-interesting-examples", "correlates very well")`
with COVID case rates as reported by state agencies.
```{r mask-wearing, message=FALSE, fig.width=9, out.extra = 'class="wide-figure"'}
@@ -272,7 +263,7 @@ staff must be tested regularly to ensure residents aren't exposed.
Testing data is published by state health authorities and aggregated by
organizations such as the [COVID Tracking Project](https://covidtracking.com/);
-our own [COVIDcast map](`r blogdown::shortcode_html("ref", "covidcast")`) also includes results from
+our own `r blogdown::shortcode_html("reflink", "covidcast", "COVIDcast map")` also includes results from
antigen tests produced by Quidel, a major test product manufacturer. But
publicly reported data can be [inconsistent between states, may not include all
tests](https://www.theatlantic.com/health/archive/2020/09/how-many-people-america-testing-coronavirus/616249/),
@@ -308,8 +299,7 @@ survey is subject to sampling biases, both because it samples from Facebook's
active user population (which does not include all adults in the United States)
and because it is voluntary, and some people may be more likely to volunteer
than others. It's plausible these biases could affect rural states more strongly
-than others. [As we've explained
-before](`r blogdown::shortcode_html("ref", "2020-08-26-fb-survey#why-run-these-surveys")`),
+than others. `r blogdown::shortcode_html("reflink", "2020-08-26-fb-survey#why-run-these-surveys", "As we've explained before")`,
we try to adjust for these biases using demographic and other data, but without
reliable ground-truth testing data, it's impossible to tell if these adjustments
successfully remove all bias.
@@ -370,13 +360,10 @@ to form a more complete picture of the pandemic.
All of the maps and graphs above were built using data we make publicly
available through our COVIDcast API, and the exact technical details are
-described in our [signal
-documentation](`r blogdown::shortcode_html("apiref", "api/covidcast-signals/fb-survey.html")`).
-The symptom and mask data is already featured on our [COVIDcast interactive
-map](`r blogdown::shortcode_html("ref", "covidcast?sensor=fb-survey-smoothed_wearing_mask&level=county&signalType=value&encoding=color&mode=overview®ion=42003")`),
+described in our `r blogdown::shortcode_html("apireflink", "api/covidcast-signals/fb-survey.html", "signal documentation")`.
+The symptom and mask data is already featured on our `r blogdown::shortcode_html("reflink", "covidcast?sensor=fb-survey-smoothed_wearing_mask&level=county&signalType=value&encoding=color&mode=overview®ion=42003", "COVIDcast interactive map")`,
and other survey signals will soon be added as well. More information about the
-surveys, including preliminary results, is given on our [survey
-site](`r blogdown::shortcode_html("ref", "surveys")`).
+surveys, including preliminary results, is given on our `r blogdown::shortcode_html("reflink", "surveys", "survey site")`.
But we also know that many researchers will have questions that can't be
answered from these simple county- and state-level averages. What occupations
@@ -405,7 +392,7 @@ data, we can make decisions needed to protect public health and permit safe
reopening.
_For more information about Delphi's symptom surveys, and for media contact
-details, see [our surveys page](`r blogdown::shortcode_html("ref", "surveys")`). For
+details, see `r blogdown::shortcode_html("reflink", "surveys", "our surveys page")`. For
updates, you can follow [CmuDelphi on Twitter](https://twitter.com/cmudelphi)._
**Note.** _This post was updated on October 17, 2020 to correct an error in the
diff --git a/content/blog/2020-10-06-survey-wave-4.html b/content/blog/2020-10-06-survey-wave-4.html
index bea390eb1..8e9782dd8 100644
--- a/content/blog/2020-10-06-survey-wave-4.html
+++ b/content/blog/2020-10-06-survey-wave-4.html
@@ -7,8 +7,8 @@
- COVIDcast
- R
summary: |
- Beginning on September 8, 2020, we deployed a new version of our symptom survey.
- Facebook helps us recruit tens of thousands of respondents daily, and the new survey gives us unprecedented insights into the effects of COVID-19 across the United States.
+ Beginning on September 8, 2020, we deployed a new version of our symptom survey.
+ Facebook helps us recruit tens of thousands of respondents daily, and the new survey gives us unprecedented insights into the effects of COVID-19 across the United States.
Today we release new public datasets and share maps revealing access to COVID testing, test results, and public use of masks.
authors:
- alex
@@ -32,8 +32,6 @@
---
-
-
@@ -54,7 +52,7 @@
-Beginning in early April 2020, the Delphi group has
+
Beginning in early April 2020, the {{< reflink "/" "Delphi group" >}} has
conducted a major survey to track COVID-19 across the United States. With the
support of Facebook Data for Good, we have been able to recruit tens of
thousands of active Facebook users every day to take our voluntary survey.
@@ -62,17 +60,12 @@
international effort covering over 100 countries
worldwide. Every day, we aggregate our survey results to produce estimates of
symptoms for counties and states across the United States, making these
-estimates available through our COVIDcast map and
-our }}">public
-API. This
-augments the numerous other data sources available in our COVIDcast
-API
+estimates available through our {{< reflink "covidcast" "COVIDcast map" >}} and
+our {{< apireflink "api/covidcast.html" "public API" >}}. This
+augments the {{< reflink "2020-08-28-api" "numerous other data sources available in our COVIDcast API" >}}
to form a more complete picture of the pandemic.
-In previous posts, we demonstrated how self-reported symptoms on our survey can
-correlate strongly with COVID
-cases
-and how symptom survey data could improve forecasts of COVID
-cases.
+
In previous posts, we demonstrated how {{< reflink "2020-08-26-fb-survey" "self-reported symptoms on our survey can correlate strongly with COVID cases" >}}
+and how {{< reflink "2020-09-21-forecast-demo" "symptom survey data could improve forecasts of COVID cases" >}}.
Our data is also powering the COVID-19 Symptom Data
Challenge, which asked participants to use our
symptom survey data to enable earlier detection of outbreaks and help public
@@ -107,8 +100,7 @@
Facebook to recruit respondents.)
Insights from the New Survey Instrument
-The full text of the survey can be found }}">on our documentation
-site—this
+
The full text of the survey can be found {{< apireflink "symptom-survey/coding.html" "on our documentation site" >}}—this
version is Wave 4.
Between the new survey’s deployment on September 8, 2020, and October 7th, we
collected 1,220,000 valid responses from respondents across the United
@@ -116,16 +108,14 @@
Insights from the New Survey Instrument
and the other important topics described above, along with demographic details
about the respondent. These demographics include age, gender, race, occupation,
and education, allowing us to understand how different groups have been affected
-and which groups are currently most vulnerable to COVID-19. (As we }}">described
-before,
+and which groups are currently most vulnerable to COVID-19. (As we {{< reflink "2020-08-26-fb-survey" "described before" >}},
Facebook does not receive any individual survey responses; we at Carnegie Mellon
collect this data and prepare aggregate data, which does not identify any
individual respondent, for public release.)
Let’s explore just a few of the questions on the survey to see what they can
tell us. All of the plots below were made using our covidcast R
package using data we make
-publicly available in the }}">COVIDcast
-API—click the
+publicly available in the {{< apireflink "api/covidcast.html" "COVIDcast API" >}}—click the
Code button to see the full code for each example.
Mask Wearing
@@ -133,8 +123,7 @@ Mask Wearing
mask most or all of the time when they’re in public? For comparison, we’ll map
this next to map of the percentage of respondents who personally know someone in
their local community who is sick (with a fever and at least one other symptom,
-such as cough or difficulty breathing). This percentage }}">correlates very
-well
+such as cough or difficulty breathing). This percentage {{< reflink "2020-08-26-fb-survey#some-interesting-examples" "correlates very well" >}}
with COVID case rates as reported by state agencies.
library(covidcast)
library(ggplot2)
@@ -236,7 +225,7 @@ Mask Wearing
"hoverCompareCartesian",
"hoverClosestCartesian"))
-
+
The relationship is striking. (Hover over or click each point to see which state
it is.) Of course, correlation is not causation, and there are many differences
between these states beyond their use of masks. For example, people in more
@@ -266,7 +255,7 @@
Testing
staff must be tested regularly to ensure residents aren’t exposed.
Testing data is published by state health authorities and aggregated by
organizations such as the COVID Tracking Project;
-our own }}">COVIDcast map also includes results from
+our own {{< reflink "covidcast" "COVIDcast map" >}} also includes results from
antigen tests produced by Quidel, a major test product manufacturer. But
publicly reported data can be inconsistent between states, may not include all
tests,
@@ -297,8 +286,7 @@
Testing
active user population (which does not include all adults in the United States)
and because it is voluntary, and some people may be more likely to volunteer
than others. It’s plausible these biases could affect rural states more strongly
-than others. }}">As we’ve explained
-before,
+than others. {{< reflink "2020-08-26-fb-survey#why-run-these-surveys" "As we've explained before" >}},
we try to adjust for these biases using demographic and other data, but without
reliable ground-truth testing data, it’s impossible to tell if these adjustments
successfully remove all bias.
@@ -351,13 +339,10 @@ Testing
You Can Help Analyze This Data
All of the maps and graphs above were built using data we make publicly
available through our COVIDcast API, and the exact technical details are
-described in our }}">signal
-documentation.
-The symptom and mask data is already featured on our }}">COVIDcast interactive
-map,
+described in our {{< apireflink "api/covidcast-signals/fb-survey.html" "signal documentation" >}}.
+The symptom and mask data is already featured on our {{< reflink "covidcast?sensor=fb-survey-smoothed_wearing_mask&level=county&signalType=value&encoding=color&mode=overview®ion=42003" "COVIDcast interactive map" >}},
and other survey signals will soon be added as well. More information about the
-surveys, including preliminary results, is given on our }}">survey
-site.
+surveys, including preliminary results, is given on our {{< reflink "surveys" "survey site" >}}.
But we also know that many researchers will have questions that can’t be
answered from these simple county- and state-level averages. What occupations
have the highest rate of COVID-19? What age groups engage in the most behavior
@@ -382,7 +367,7 @@
You Can Help Analyze This Data
data, we can make decisions needed to protect public health and permit safe
reopening.
For more information about Delphi’s symptom surveys, and for media contact
-details, see }}">our surveys page. For
+details, see {{< reflink "surveys" "our surveys page" >}}. For
updates, you can follow CmuDelphi on Twitter.
Note. This post was updated on October 17, 2020 to correct an error in the
scatterplot of mask usage and reported case rates. An error in our data
diff --git a/content/blog/2020-10-14-dv-signal.Rmd b/content/blog/2020-10-14-dv-signal.Rmd
index a4e69112c..b71e51a77 100644
--- a/content/blog/2020-10-14-dv-signal.Rmd
+++ b/content/blog/2020-10-14-dv-signal.Rmd
@@ -28,7 +28,7 @@ output:
toc: true
---
-Our COVIDcast [map](`r blogdown::shortcode_html("ref", "covidcast")`) and [API](`r blogdown::shortcode_html("apiref", "api/covidcast.html")`) feature several novel early indicators of COVID-19 activity. In past posts, we discussed our large-scale daily surveys that, as of October 2020, have reached over 12 million people throughout the US, in partnership with [Facebook](`r blogdown::shortcode_html("ref", "2020-08-26-fb-survey")`) and [Google](`r blogdown::shortcode_html("ref", "2020-09-18-google-survey")`). In another ongoing data initiative, health system partners grant us access to various aggregate statistics from hospital records and insurance claims covering 10-15% of the United States population. From these data, we can extract informative indicators that can be early indicators of COVID activity. Early indicators are important because they help policymakers make more informed decisions and can also improve epidemiological forecasts.
+Our COVIDcast `r blogdown::shortcode_html("reflink", "covidcast", "map")` and `r blogdown::shortcode_html("apireflink", "api/covidcast.html", "API")` feature several novel early indicators of COVID-19 activity. In past posts, we discussed our large-scale daily surveys that, as of October 2020, have reached over 12 million people throughout the US, in partnership with `r blogdown::shortcode_html("reflink", "2020-08-26-fb-survey", "Facebook")` and `r blogdown::shortcode_html("reflink", "2020-09-18-google-survey", "Google")`. In another ongoing data initiative, health system partners grant us access to various aggregate statistics from hospital records and insurance claims covering 10-15% of the United States population. From these data, we can extract informative indicators that can be early indicators of COVID activity. Early indicators are important because they help policymakers make more informed decisions and can also improve epidemiological forecasts.
One indicator that we created from the outpatient insurance claims portion of this data is what we call the **Doctor Visits** or **DV** indicator, which estimates the percentage of outpatient visits (including telemedicine, urgent care, and emergency department visits) that are due to COVID-Like Illness or CLI. We will use % CLI-in-DV to abbreviate the percentage of outpatient visits due to CLI, the units of our DV indicator. Below, we explain how we calculate the DV indicator and discuss its relation to confirmed COVID-19 cases. We also discuss our observation that the DV indicator possesses significant spatial heterogeneity (it displays systematic county-to-county differences), and we describe a simple dynamic adjustment to address this issue.
@@ -60,7 +60,7 @@ The Doctor Visits indicator is based solely on insurance claims. We count the ou
5. Mixed: ICD-10 primary code of Z20.828 (suspected exposure to COVID-19) or J12.9 (viral pneumonia).
-We estimate the percent of COVID-like illness in doctor visits (% CLI-in-DV) as 100 \* (COVID-like + Flu-like + Mixed - Flu) / Total. We subtract the "Flu" count because the higher the presence of confirmed flu, the larger the fraction of flu-like cases that are due to flu rather than to COVID. See [our signal documentation site](`r blogdown::shortcode_html("apiref", "api/covidcast-signals/doctor-visits.html")`) for more details.
+We estimate the percent of COVID-like illness in doctor visits (% CLI-in-DV) as 100 \* (COVID-like + Flu-like + Mixed - Flu) / Total. We subtract the "Flu" count because the higher the presence of confirmed flu, the larger the fraction of flu-like cases that are due to flu rather than to COVID. See `r blogdown::shortcode_html("apireflink", "api/covidcast-signals/doctor-visits.html", "our signal documentation site")` for more details.
The indicator is available daily starting February 1, 2020 (although understandably, it is nearly zero in all locations until mid-March). To preserve privacy and data integrity, we do not report the indicator for a given location and date if there are fewer than 500 total visits in the seven days ending on that date. Following these restrictions, each day, we are able to produce estimates for about 2000 counties (roughly two-thirds of the counties in the US), accounting for over 90% of the country's population.
@@ -116,7 +116,7 @@ Interestingly, certain types of claims have longer latency than others. We found
## Weekday Effects
-Another challenge is the influence of the day of the week on the DV indicator. On weekends, both total counts and COVID-like counts decrease, but proportionally, total counts decrease more. This is because doctor visits during the weekend tend to focus on acute care. The total counts include many visits related to non-acute issues, but almost all COVID-like counts are due to acute issues. Without adjusting for this weekday effect, the DV indicator has a "sawtooth" pattern, spiking on weekends. We derived a method to create an adjusted indicator that accounts for this weekday effect (for a precise description, see our [signal documentation](`r blogdown::shortcode_html("apiref", "api/covidcast-signals/doctor-visits.html#day-of-week-adjustment")`)). Below, we visualize the effect of making these adjustments. When we do not adjust for the weekday effect, we see a sawtooth pattern that clearly does not represent true changes in COVID-like illness within a location. However, after making the weekday adjustment, we get a smooth curve that looks reasonable. It is important to note that this adjustment is _not_ temporal smoothing! Rather, we are making an adjustment each day based on historical patterns of weekday-to-weekend differences.
+Another challenge is the influence of the day of the week on the DV indicator. On weekends, both total counts and COVID-like counts decrease, but proportionally, total counts decrease more. This is because doctor visits during the weekend tend to focus on acute care. The total counts include many visits related to non-acute issues, but almost all COVID-like counts are due to acute issues. Without adjusting for this weekday effect, the DV indicator has a "sawtooth" pattern, spiking on weekends. We derived a method to create an adjusted indicator that accounts for this weekday effect (for a precise description, see our `r blogdown::shortcode_html("apireflink", "api/covidcast-signals/doctor-visits.html#day-of-week-adjustment", "signal documentation")`). Below, we visualize the effect of making these adjustments. When we do not adjust for the weekday effect, we see a sawtooth pattern that clearly does not represent true changes in COVID-like illness within a location. However, after making the weekday adjustment, we get a smooth curve that looks reasonable. It is important to note that this adjustment is _not_ temporal smoothing! Rather, we are making an adjustment each day based on historical patterns of weekday-to-weekend differences.
```{r, message = FALSE, warning = FALSE, fig.width = 8, fig.height = 8, out.extra = 'class="wide-figure"'}
start_day = "2020-05-01"
diff --git a/content/blog/2020-10-14-dv-signal.html b/content/blog/2020-10-14-dv-signal.html
index 27b5da3dd..49c27c912 100644
--- a/content/blog/2020-10-14-dv-signal.html
+++ b/content/blog/2020-10-14-dv-signal.html
@@ -28,8 +28,7 @@
toc: true
---
-
-
+
@@ -43,7 +42,7 @@
-Our COVIDcast }}">map and }}">API feature several novel early indicators of COVID-19 activity. In past posts, we discussed our large-scale daily surveys that, as of October 2020, have reached over 12 million people throughout the US, in partnership with }}">Facebook and }}">Google. In another ongoing data initiative, health system partners grant us access to various aggregate statistics from hospital records and insurance claims covering 10-15% of the United States population. From these data, we can extract informative indicators that can be early indicators of COVID activity. Early indicators are important because they help policymakers make more informed decisions and can also improve epidemiological forecasts.
+Our COVIDcast {{< reflink "covidcast" "map" >}} and {{< apireflink "api/covidcast.html" "API" >}} feature several novel early indicators of COVID-19 activity. In past posts, we discussed our large-scale daily surveys that, as of October 2020, have reached over 12 million people throughout the US, in partnership with {{< reflink "2020-08-26-fb-survey" "Facebook" >}} and {{< reflink "2020-09-18-google-survey" "Google" >}}. In another ongoing data initiative, health system partners grant us access to various aggregate statistics from hospital records and insurance claims covering 10-15% of the United States population. From these data, we can extract informative indicators that can be early indicators of COVID activity. Early indicators are important because they help policymakers make more informed decisions and can also improve epidemiological forecasts.
One indicator that we created from the outpatient insurance claims portion of this data is what we call the Doctor Visits or DV indicator, which estimates the percentage of outpatient visits (including telemedicine, urgent care, and emergency department visits) that are due to COVID-Like Illness or CLI. We will use % CLI-in-DV to abbreviate the percentage of outpatient visits due to CLI, the units of our DV indicator. Below, we explain how we calculate the DV indicator and discuss its relation to confirmed COVID-19 cases. We also discuss our observation that the DV indicator possesses significant spatial heterogeneity (it displays systematic county-to-county differences), and we describe a simple dynamic adjustment to address this issue.
Motivation
@@ -66,7 +65,7 @@ The Doctor Visits Indicator
Flu-like: ICD-10 primary code of J22 (acute lower respiratory infection) or B34.9 (viral infection, unspecified).
Mixed: ICD-10 primary code of Z20.828 (suspected exposure to COVID-19) or J12.9 (viral pneumonia).
-We estimate the percent of COVID-like illness in doctor visits (% CLI-in-DV) as 100 * (COVID-like + Flu-like + Mixed - Flu) / Total. We subtract the “Flu” count because the higher the presence of confirmed flu, the larger the fraction of flu-like cases that are due to flu rather than to COVID. See }}">our signal documentation site for more details.
+We estimate the percent of COVID-like illness in doctor visits (% CLI-in-DV) as 100 * (COVID-like + Flu-like + Mixed - Flu) / Total. We subtract the “Flu” count because the higher the presence of confirmed flu, the larger the fraction of flu-like cases that are due to flu rather than to COVID. See {{< apireflink "api/covidcast-signals/doctor-visits.html" "our signal documentation site" >}} for more details.
The indicator is available daily starting February 1, 2020 (although understandably, it is nearly zero in all locations until mid-March). To preserve privacy and data integrity, we do not report the indicator for a given location and date if there are fewer than 500 total visits in the seven days ending on that date. Following these restrictions, each day, we are able to produce estimates for about 2000 counties (roughly two-thirds of the counties in the US), accounting for over 90% of the country’s population.
Below, we plot two maps to explore the indicator. On the left is a heatmap representing the DV indicator for each state, averaged over April 15 to May 15. On the right is a heatmap of daily confirmed COVID-19 cases per 100,000 people using data from USAFacts, averaged over the same time span. We can see that the states with many cases per capita tend to have high % CLI-in-DV, and states with fewer cases tend to have lower % CLI-in-DV, providing a good sanity check.
library(covidcast)
@@ -113,7 +112,7 @@ Backfill
Weekday Effects
-Another challenge is the influence of the day of the week on the DV indicator. On weekends, both total counts and COVID-like counts decrease, but proportionally, total counts decrease more. This is because doctor visits during the weekend tend to focus on acute care. The total counts include many visits related to non-acute issues, but almost all COVID-like counts are due to acute issues. Without adjusting for this weekday effect, the DV indicator has a “sawtooth” pattern, spiking on weekends. We derived a method to create an adjusted indicator that accounts for this weekday effect (for a precise description, see our }}">signal documentation). Below, we visualize the effect of making these adjustments. When we do not adjust for the weekday effect, we see a sawtooth pattern that clearly does not represent true changes in COVID-like illness within a location. However, after making the weekday adjustment, we get a smooth curve that looks reasonable. It is important to note that this adjustment is not temporal smoothing! Rather, we are making an adjustment each day based on historical patterns of weekday-to-weekend differences.
+Another challenge is the influence of the day of the week on the DV indicator. On weekends, both total counts and COVID-like counts decrease, but proportionally, total counts decrease more. This is because doctor visits during the weekend tend to focus on acute care. The total counts include many visits related to non-acute issues, but almost all COVID-like counts are due to acute issues. Without adjusting for this weekday effect, the DV indicator has a “sawtooth” pattern, spiking on weekends. We derived a method to create an adjusted indicator that accounts for this weekday effect (for a precise description, see our {{< apireflink "api/covidcast-signals/doctor-visits.html#day-of-week-adjustment" "signal documentation" >}}). Below, we visualize the effect of making these adjustments. When we do not adjust for the weekday effect, we see a sawtooth pattern that clearly does not represent true changes in COVID-like illness within a location. However, after making the weekday adjustment, we get a smooth curve that looks reasonable. It is important to note that this adjustment is not temporal smoothing! Rather, we are making an adjustment each day based on historical patterns of weekday-to-weekend differences.
start_day = "2020-05-01"
end_day = "2020-08-01"
diff --git a/content/blog/2020-12-10-masks-public.Rmd b/content/blog/2020-12-10-masks-public.Rmd
index 6c24838bf..4ba18cfd8 100644
--- a/content/blog/2020-12-10-masks-public.Rmd
+++ b/content/blog/2020-12-10-masks-public.Rmd
@@ -45,8 +45,7 @@ knitr::opts_chunk$set(collapse = TRUE)
## Studying Mask Use with Surveys
Since April, and in partnership with Facebook Data for Good and the [University
-of Maryland](https://covidmap.umd.edu/), Delphi has [conducted daily surveys of
-Facebook users](`r blogdown::shortcode_html("ref", "2020-08-26-fb-survey")`)
+of Maryland](https://covidmap.umd.edu/), Delphi has `r blogdown::shortcode_html("reflink", "2020-08-26-fb-survey", "conducted daily surveys of Facebook users")`
throughout the United States. These surveys ask respondents about their
experiences during the pandemic, and ask whether they're experiencing symptoms,
whether they are isolating or following precautions, and how they have been
@@ -54,8 +53,7 @@ affected by the pandemic. The survey has been completed over 14 million times
since April, allowing us an unprecedented level of insight into COVID and
people's experiences, down to individual counties around the country.
-[Since early
-September](`r blogdown::shortcode_html("ref", "2020-10-06-survey-wave-4")`)
+`r blogdown::shortcode_html("reflink", "2020-10-06-survey-wave-4", "Since early September")`
we have asked all respondents a question about mask use:
> In the past 5 days, how often did you wear a mask when in public?
@@ -108,8 +106,7 @@ has been on the rise in states whose mask use started low. This is quite
encouraging.
(Note that, as with most of Delphi's blog posts, all the code and data used to
-make these plots is available---simply click the Code button to see how our [API
-clients](`r blogdown::shortcode_html("apiref", "api/covidcast_clients.html")`)
+make these plots is available---simply click the Code button to see how our `r blogdown::shortcode_html("apireflink", "api/covidcast_clients.html", "API clients")`
make it easy to access aggregated data.)
Seeing these numbers---particularly the very high reported mask usage in many
@@ -383,8 +380,7 @@ These plots suggest that lower mask use is correlated with other risky
behaviors, which combine to produce more opportunities to spread the virus.
While these graphs only show two possible activities, our survey asks about
others---including working outside the home and attending large events---and our
-API allows researchers to quickly combine this data with [SafeGraph's other
-mobility data](`r blogdown::shortcode_html("apiref", "api/covidcast-signals/safegraph.html")`)
+API allows researchers to quickly combine this data with `r blogdown::shortcode_html("apireflink", "api/covidcast-signals/safegraph.html", "SafeGraph's other mobility data")`
and other data sources that give a clearer picture of how people react to the
pandemic. By studying this aggregate data and the individual survey
responses, it will be possible to examine how mask use is associated with other
@@ -409,10 +405,8 @@ If you're one of those researchers, or you think this data could be useful for
your reporting or decision-making, see our [COVIDcast Epidata
API](https://cmu-delphi.github.io/delphi-epidata/api/covidcast.html) for details
on how to get it. Numerous aggregates from the survey data, including more
-measures of public activity, are [available through the
-API](`r blogdown::shortcode_html("apiref", "api/covidcast-signals/fb-survey.html")`),
-and can be easily downloaded using [our R and Python
-packages](`r blogdown::shortcode_html("apiref", "api/covidcast_clients.html")`).
+measures of public activity, are `r blogdown::shortcode_html("apireflink", "api/covidcast-signals/fb-survey.html", "available through the API")`,
+and can be easily downloaded using `r blogdown::shortcode_html("apireflink", "api/covidcast_clients.html", "our R and Python packages")`.
All aggregates are de-identified to protect the privacy of survey respondents.
We also make the raw response data available to academic and nonprofit
diff --git a/content/blog/2020-12-10-masks-public.html b/content/blog/2020-12-10-masks-public.html
index 8867b97a8..9657675a2 100644
--- a/content/blog/2020-12-10-masks-public.html
+++ b/content/blog/2020-12-10-masks-public.html
@@ -22,8 +22,6 @@
---
-
-
@@ -52,16 +50,14 @@
Studying Mask Use with Surveys
Since April, and in partnership with Facebook Data for Good and the University
-of Maryland, Delphi has }}">conducted daily surveys of
-Facebook users
+of Maryland, Delphi has {{< reflink "2020-08-26-fb-survey" "conducted daily surveys of Facebook users" >}}
throughout the United States. These surveys ask respondents about their
experiences during the pandemic, and ask whether they’re experiencing symptoms,
whether they are isolating or following precautions, and how they have been
affected by the pandemic. The survey has been completed over 14 million times
since April, allowing us an unprecedented level of insight into COVID and
people’s experiences, down to individual counties around the country.
-{{< reflink "2020-10-06-survey-wave-4" "Since early September" >}}
we have asked all respondents a question about mask use:
In the past 5 days, how often did you wear a mask when in public?
@@ -111,8 +107,7 @@ Studying Mask Use with Surveys
has been on the rise in states whose mask use started low. This is quite
encouraging.
(Note that, as with most of Delphi’s blog posts, all the code and data used to
-make these plots is available—simply click the Code button to see how our }}">API
-clients
+make these plots is available—simply click the Code button to see how our {{< apireflink "api/covidcast_clients.html" "API clients" >}}
make it easy to access aggregated data.)
Seeing these numbers—particularly the very high reported mask usage in many
states—might make you wonder: If mask usage is over 80% in most states and
@@ -412,8 +407,7 @@
Public Activities, Social Distancing, and Masks
behaviors, which combine to produce more opportunities to spread the virus.
While these graphs only show two possible activities, our survey asks about
others—including working outside the home and attending large events—and our
-API allows researchers to quickly combine this data with }}">SafeGraph’s other
-mobility data
+API allows researchers to quickly combine this data with {{< apireflink "api/covidcast-signals/safegraph.html" "SafeGraph's other mobility data" >}}
and other data sources that give a clearer picture of how people react to the
pandemic. By studying this aggregate data and the individual survey
responses, it will be possible to examine how mask use is associated with other
@@ -436,10 +430,8 @@ More Opportunities in Survey Data
your reporting or decision-making, see our COVIDcast Epidata
API for details
on how to get it. Numerous aggregates from the survey data, including more
-measures of public activity, are }}">available through the
-API,
-and can be easily downloaded using }}">our R and Python
-packages.
+measures of public activity, are {{< apireflink "api/covidcast-signals/fb-survey.html" "available through the API" >}},
+and can be easily downloaded using {{< apireflink "api/covidcast_clients.html" "our R and Python packages" >}}.
All aggregates are de-identified to protect the privacy of survey respondents.
We also make the raw response data available to academic and nonprofit
researchers, and we look forward to seeing more detailed analyses of this data.
diff --git a/content/blog/2021-01-15-causal-effect-mobility.Rmd b/content/blog/2021-01-15-causal-effect-mobility.Rmd
index 2dfb03b89..d960963d4 100644
--- a/content/blog/2021-01-15-causal-effect-mobility.Rmd
+++ b/content/blog/2021-01-15-causal-effect-mobility.Rmd
@@ -159,7 +159,7 @@ age, increasing $A$ would *decrease* $Y$. In this case, age is a
confounder and the $g$-formula would correctly recover the negative
relationship. For causal inference, this is the correct conclusion.
-
+
Things get trickier
when there are time varying variables.
@@ -386,9 +386,8 @@ we'll consider here is the
proportion of people of who stay home,
which is kindly provided to Delphi by
SafeGraph.
-(We [publish this
-data](`r blogdown::shortcode_html("apiref", "api/covidcast-signals/safegraph.html")`)
-in our [COVIDcast Epidata API](`r blogdown::shortcode_html("apiref", "api/covidcast.html")`),
+(We `r blogdown::shortcode_html("apireflink", "api/covidcast-signals/safegraph.html", "publish this data")`
+in our `r blogdown::shortcode_html("apireflink", "api/covidcast.html", "COVIDcast Epidata API")`,
so it is available to anyone interested in studying mobility during the pandemic.)
We use data at the state level.
Note that this is actually a sort of anti-mobility measure:
@@ -506,7 +505,7 @@ stay-at-home decreases deaths, as we would expect.
that these results are preliminary.)
-
+
## What's Next?
diff --git a/content/blog/2021-01-15-causal-effect-mobility.html b/content/blog/2021-01-15-causal-effect-mobility.html
index 17e9f640b..3ae20f4c8 100644
--- a/content/blog/2021-01-15-causal-effect-mobility.html
+++ b/content/blog/2021-01-15-causal-effect-mobility.html
@@ -27,8 +27,7 @@
toc: true
---
-
-
+
@@ -151,7 +150,7 @@ Causal Inference
age, increasing \(A\) would decrease \(Y\). In this case, age is a
confounder and the \(g\)-formula would correctly recover the negative
relationship. For causal inference, this is the correct conclusion.
-
+
Things get trickier
when there are time varying variables.
Consider weekly mobility and death data
@@ -354,9 +353,8 @@
The Data and the Results
proportion of people of who stay home,
which is kindly provided to Delphi by
SafeGraph.
-(We }}">publish this
-data
-in our }}">COVIDcast Epidata API,
+(We {{< apireflink "api/covidcast-signals/safegraph.html" "publish this data" >}}
+in our {{< apireflink "api/covidcast.html" "COVIDcast Epidata API" >}},
so it is available to anyone interested in studying mobility during the pandemic.)
We use data at the state level.
Note that this is actually a sort of anti-mobility measure:
@@ -465,7 +463,7 @@ The Data and the Results
stay-at-home decreases deaths, as we would expect.
(We remind the reader
that these results are preliminary.)
-
+
What’s Next?
diff --git a/devops/gitpod.dockerfile b/devops/gitpod.dockerfile
new file mode 100644
index 000000000..f66107836
--- /dev/null
+++ b/devops/gitpod.dockerfile
@@ -0,0 +1,27 @@
+# docker image for setting up an R environment
+FROM gitpod/workspace-full
+
+# install miniconda
+ENV PATH /opt/conda/bin:$PATH
+RUN wget --quiet https://repo.anaconda.com/miniconda/Miniconda2-4.7.12-Linux-x86_64.sh -O ~/miniconda.sh && \
+ sudo /bin/bash ~/miniconda.sh -b -p /opt/conda && \
+ rm ~/miniconda.sh && \
+ sudo ln -s /opt/conda/etc/profile.d/conda.sh /etc/profile.d/conda.sh && \
+ echo ". /opt/conda/etc/profile.d/conda.sh" >> ~/.bashrc && \
+ echo "conda activate base" >> ~/.bashrc && \
+ sudo /opt/conda/bin/conda install --name base --channel conda-forge mamba=* && \
+ sudo find /opt/conda/ -follow -type f -name '*.a' -delete && \
+ sudo find /opt/conda/ -follow -type f -name '*.js.map' -delete && \
+ sudo /opt/conda/bin/conda clean -afy && \
+ conda config --prepend envs_dirs $HOME/.conda/envs && \
+ conda config --prepend pkgs_dirs $HOME/.conda/pkgs
+
+ADD ./environment.yml .
+RUN mamba env create -f environment.yml
+
+ADD ./dependencies.R .
+
+RUN conda run -n www-main Rscript ./dependencies.R
+
+RUN echo "conda activate www-main" >> ~/.bashrc
+ENV PATH /home/gitpod/.conda/envs/www-main/bin:$PATH
\ No newline at end of file
diff --git a/environment.yml b/environment.yml
index 011a34efd..c9b28cce9 100644
--- a/environment.yml
+++ b/environment.yml
@@ -34,6 +34,7 @@ dependencies:
- r-plotly
- r-sf
- r-lubridate
+ - r-plyr
- pandoc
- fiona
- geopandas
diff --git a/package.json b/package.json
index 54f5cf88c..3664f86d1 100644
--- a/package.json
+++ b/package.json
@@ -21,10 +21,10 @@
"copy_fonts": "shx cp -r \"node_modules/katex/dist/fonts/*\" themes/delphi/static/css/fonts/",
"copy_covidcast": "shx rm -rf \"static/covidcast/*\" && shx cp \"node_modules/www-covidcast/public/**/*.{js,txt,css,map}\" static/covidcast/",
"postinstall": "npm run copy_fonts && npm run copy_covidcast",
- "build:blog": "Rscript -e \"blogdown::build_site(local=FALSE, run_hugo=FALSE, build_rmd=TRUE)\"",
+ "build:blog": "Rscript -e \"blogdown::build_site(local=FALSE, run_hugo=FALSE, build_rmd='md5sum')\"",
"build": "hugo --gc --minify",
"start": "hugo server -D",
- "start:blog": "Rscript -e \"blogdown::serve_site()\"",
+ "start:blog": "Rscript -e \"blogdown::serve_site(port=1313, browser=FALSE)\"",
"format": "prettier *.* \"(.vscode|content|data|themes)/**\" --write",
"lint": "prettier *.* \"(.vscode|content|data|themes)/**\" --check",
"image": "docker build -t www-main:latest --file ./devops/Dockerfile ."
diff --git a/static/blog/images/causal-effect-mobility-bigstates.svg b/static/blog/2021-01-15-causal-effect-mobility_files/causal-effect-mobility-bigstates.svg
similarity index 99%
rename from static/blog/images/causal-effect-mobility-bigstates.svg
rename to static/blog/2021-01-15-causal-effect-mobility_files/causal-effect-mobility-bigstates.svg
index da8f42919..076486c93 100644
--- a/static/blog/images/causal-effect-mobility-bigstates.svg
+++ b/static/blog/2021-01-15-causal-effect-mobility_files/causal-effect-mobility-bigstates.svg
@@ -10,7 +10,7 @@
xml:space="preserve"
width="672"
height="672"
- viewBox="0 0 672 672">image/svg+xml image/svg+xml
Richard D. Worth
Scott González
Ariel Flesler
+Cheah Chu Yeow
+Andrew Chalkley
+Fabio Buffoni
+Stefan Bauckmeier
Jon Evans
TJ Holowaychuk
+Riccardo De Agostini
Michael Bensoussan
-Robert Katić
Louis-Rémi Babé
-Earle Castledine
+Robert Katić
Damian Janowski
+Anton Kovalyov
+Dušan B. Jovanovic
+Earle Castledine
Rich Dougherty
Kim Dalsgaard
Andrea Giammarchi
+Fabian Jakobs
Mark Gibson
Karl Swedberg
Justin Meyer
@@ -37,9 +45,10 @@ Ben Alman
James Padolsey
David Petersen
Batiste Bieler
+Jake Archibald
Alexander Farkas
-Rick Waldron
Filipe Fortes
+Rick Waldron
Neeraj Singh
Paul Irish
Iraê Carvalho
@@ -47,23 +56,24 @@ Matt Curry
Michael Monteleone
Noah Sloan
Tom Viner
+J. Ryan Stinnett
Douglas Neiner
Adam J. Sontag
+Heungsub Lee
Dave Reed
-Ralph Whitbeck
Carl Fürstenberg
Jacob Wright
-J. Ryan Stinnett
+Ralph Whitbeck
unknown
temp01
-Heungsub Lee
Colin Snover
+Jared Grippe
Ryan W Tenney
+Alex Sexton
Pinhook
Ron Otten
Jephte Clain
Anton Matzneller
-Alex Sexton
Dan Heberden
Henri Wiechers
Russell Holbrook
@@ -73,21 +83,19 @@ Scott Jehl
James Burke
Jonas Pfenniger
Xavi Ramirez
-Jared Grippe
Sylvester Keil
Brandon Sterne
Mathias Bynens
+Lee Carpenter
Timmy Willison <4timmywil@gmail.com>
Corey Frang
Digitalxero
-Anton Kovalyov
David Murdoch
Josh Varner
Charles McNulty
Jordan Boesch
Jess Thrysoee
Michael Murray
-Lee Carpenter
Alexis Abril
Rob Morgan
John Firebaugh
@@ -107,12 +115,13 @@ Timo Tijhof
Steen Nielsen
Anton Ryzhov
Shi Chuan
+Matt Mueller
Berker Peksag
Toby Brain
-Matt Mueller
Justin
Daniel Herman
Oleg Gaidarenko
+Rock Hymas
Richard Gibson
Rafaël Blais Masson
cmc3cn <59194618@qq.com>
@@ -124,6 +133,7 @@ Andrew E Monat
Oskari
Joao Henrique de Andrade Bruni
tsinha
+Dominik D. Geyer
Matt Farmer
Trey Hunner
Jason Moon
@@ -132,164 +142,180 @@ Kris Borchers
Vladimir Zhuravlev
Jacob Thornton
Chad Killingsworth
+Vitya Muhachev
Nowres Rafid
David Benjamin
+Alan Plum
Uri Gilad
Chris Faulkner
+Marcel Greter
Elijah Manor
Daniel Chatfield
+Daniel Gálvez
Nikita Govorov
Wesley Walser
Mike Pennisi
+Matthias Jäggli
+Devin Cooper
Markus Staab
Dave Riddle
Callum Macrae
+Jonathan Sampson
Benjamin Truyman
+Jay Merrifield
James Huston
+Sai Lung Wong
Erick Ruiz de Chávez
David Bonner
+Allen J Schmidt Jr
Akintayo Akinwunmi
MORGAN
Ismail Khair
Carl Danley
Mike Petrovich
Greg Lavallee
-Daniel Gálvez
-Sai Lung Wong
Tom H Fuertes
Roland Eckl
-Jay Merrifield
-Allen J Schmidt Jr
-Jonathan Sampson
-Marcel Greter
-Matthias Jäggli
-David Fox
Yiming He
-Devin Cooper
+David Fox
+Bennett Sorbo
Paul Ramos
Rod Vagg
-Bennett Sorbo
Sebastian Burkhard
Zachary Adam Kaplan
+Adam Coulombe
nanto_vi
nanto
Danil Somsikov
Ryunosuke SATO
+Diego Tres
Jean Boussier
-Adam Coulombe
Andrew Plummer
Mark Raddatz
+Pascal Borreli
Isaac Z. Schlueter
Karl Sieburg
-Pascal Borreli
Nguyen Phuc Lam
Dmitry Gusev
-Michał Gołębiowski-Owczarek
-Li Xudong
Steven Benner
-Tom H Fuertes
+Li Xudong
+Michał Gołębiowski-Owczarek
Renato Oliveira dos Santos
+Frederic Junod
+Tom H Fuertes
+Mitch Foley
ros3cin
-Jason Bedard
Kyle Robinson Young
+John Paul
+Jason Bedard
Chris Talkington
Eddie Monge
Terry Jones
Jason Merino
+Dan Burzo
Jeremy Dunck
Chris Price
Guy Bedford
+njhamann
+Goare Mao
Amey Sakhadeo
Mike Sidorov
Anthony Ryan
-Dominik D. Geyer
-George Kats
Lihan Li
+George Kats
+Dongseok Paeng
Ronny Springer
-Chris Antaki
-Marian Sollmann
-njhamann
Ilya Kantor
+Marian Sollmann
+Chris Antaki
David Hong
-John Paul
Jakob Stoeck
Christopher Jones
Forbes Lindesay
S. Andrew Sheppard
Leonardo Balter
-Roman Reiß
-Benjy Cui
Rodrigo Rosenfeld Rosas
-John Hoven
+Daniel Husar
Philip Jägenstedt