Coronavirus — the non-intuitive properties of R0
By: Falk Langhammer
Tags: Data Science, Flatten The Curve, Coronavirus, Germany, Charts

This chart will be discussed in more detail in a later section, as it triggered a political discussion in Germany. Here we just need the shift in time between the dark blue, and the green line. The two lines do not match exactly, but the closest fit seems to be with 7 days. Which leaves us with Tt=7 days for Germany.

The total delay Td = Ti+Tt+Tc for Germany then is Td=19 days (my method) and 12 days (RKI method).

Let’s do a quick plausibility check here — can it even be?

We see that the true R0 was peaking in Germany as early as February 29, a Saturday with just 79 cases (March 10 minus 12 days). Well before any measures taken by state or country governors (which started March 9). And well before mobility started to reduce. On the other hand, Germans have well noticed the bad news coming that day from France and Italy: “In Italy, five key football matches were postponed this weekend.” That obviously was a shock for quite a few people in other countries in Europe ;) So yes, R0 reacting as early as end of February in Germany is actually plausible: people didn’t cancel their activities right away but they may have started to act more cautiously (no hugging etc.).

That’s the seventh surprising property: in an uncontrolled epidemic, the population may adjust their behaviour quickly to a perceived threat and alters R0 2–3 weeks later for no obvious reason. R0 is sensitive to even small behavioural changes but with a large delay in time. It is like a boiling plate with a water vessel: turning the knob a bit does have an impact — but only if you are patient enough to observe the effect. Trying to act on current values of computed R0 is like making the water boil over, or become cold.

The difference between R0=0.7 and 1.3 is a whopping factor of 19 difference in cases, 19 days later when the measurements come in (a factor 6.4 after 12 days). So, one should not slip R0 by such large margins of error. The (unavoidable) difference between an R0 of 0.9 and 1.1 still is a factor of 2.6 which can’t be avoided. Therefore, trying to control the epidemic with a value of R0 slightly below 1 is a difficult exercise.

§7 Germany and its hostile discussion of R0

The very graph presented above (to be exact, just the dark blue curve from the RKI publication) has triggered an unfriendly reaction from parts of the press, basically argueing like this: “If R0 fell below 1.0 before March 23, the day of the German lockdown (cf. red arrow), then the lockdown wasn’t necessary in the first place! — And the lockdown should be lifted immediately.” That’s a serious implication of R0 arithmetic: the public opinion will fetch the pieces it likes.

But then, what’s wrong with that argument? Esp. as German hospitals actually have been emptier than normal at the peak of the outbreak (due to preemptive measures to increase capacity and a successful containment).

Well, first of all, the method applied by RKI isn’t as accurate as the chart (the dark blue line) suggests: it heavily relies on injection of values for unreported dates of onset of symptoms — a value certainly often missing early on in the reporting of the epidemic. Using my method, we obtain a more fine-granular picture, although with a week more delay. Not a problem for the issue at hand though. Analyzing the green curve, shifted 19 days to the left, we see:

R0 descended to about R0=1.5 after March 9, the day events above 1000 people were cancelled; and stayed there for a week. But people seemingly started to adjust their behaviour to the perceived threat as early as February 29. R0 started to further descend after March 16, where an agreement between the states and federal governemt was achieved. In this week, the mobility started to decrease drastically. It may be said that the population anticipated the lockdown after it became to be expected. But only after about March 23, the day of the actual lockdown, R0 actually descended significantly below 1.

Further down, we’ll look at a few countries. It appears as if R0 can be decreased down to about 1.5 with media campaigns and voluntary rules. And maybe cancelling larger events. But bringing it down to values below 1 seems to be actually difficult. Note that this is not an intrinsic property of R, or the value 1. But just as it happens to be for this particular virus. Also, as we talk about regions so close to 1, a tiny seasonal effect may actually then play a significant role too. Which is bad news for the winter season.

So, in summary, the data for R0 published for Germany do not indicate the lockdown wasn’t effective or necessary. But it shows how important it is that the population develops and maintains a realistic idea about the actual threat posed by the epidemic. As not all rules are followed, and not all rules must be enforced to be followed.

Side note: Fot a limit period of time, RKI used a 3-day sliding window to average daily new cases, but stopped this practice for the numbers presented 2020, April 29 [RKI press conference answer of April 30]. The 3-day window was used to reduce even more the response lag of the measured R0. But was reversed to 4 days because the obtained values started to fluctuate too much, as was observed be the curious public. The public interest in Germany to understand the math of R0 is large and RKI is now offering seminar sessions to interested journalists. I recommend to use my article as a primer :) One hint given by RKI was to increase N of the N-day sliding window if absolute numbers start getting small. However, I don’t recommend to use values other than N=7 for my method.

§8 Risk: the Alert value A

Before jumping to individual countries in a second, I’d like to introduce one more concept which goes beyound the base reproduction number alone: a risk factor or alert value which combines multiple indicators.

E.g., as of 2020, April 30 in the US, the number of new daily cases per 100.000 inhabitants is 8.9 (weekly average). The number of daily new deaths is 0.59 per 100.000 inhabitants (weekly average).

Estimating the dark factor U of unidentified cases

The average day of death is day 19 after infection [source from a published Chinese survey]. We could use the current value of R0 (which has a similiar lag) to guesstimate the current number of infections from current number of deaths D(t): I(t) ~ D(t)/CFR * R^(Td/4); where Td = 13 days =19–5–1 is the delay of death after testing. However, we can do better, we can see by how much an observed peak of both infections and deaths are shifted. I find the best fit for Germany and Austria to be a shift of 13 days indeed — but with an error margin of 1–2 days.

We don’t need to use R0 to guesstimate deaths, we can use prior values of infections: I(t) ~ D(t+Td)/CFR which can be evaluated for t ≤ -Td.

The number of daily new infections 13 days earlier, April 17, was 8.8 per 100.000 inhabitants (weekly average). Almost unchanged due an R0 of about 1.

But with a CFR=1%, we obtain I(t-Td) = 0.59/1% = 59. The factor U = 59/8.8 or 6.7x would measure the factor of unknown cases. Cases which have never been tested, or have been very mild or asymptomatic.

Dark factor U = Deaths(t)/CFR / I(t-Td); with Td=13 days; CFR=1%

Notice: estimate for the infection fatality rate CFR (fatal cases per infected case) range from 0.4% [Heinsberg study] to 1.6% [Guangdong province for a Western demographics, own evaluation]. 1% seems to be a reasonable value for guess work. A plausibility check should check that U decreases with increasing tests per inhabitant performed.

Alert levels

Depending on the country and its capacities, the number of daily new cases must not exceed a threshold. Beyond this threshold, new cases will not be traced and contacts be isolated efficiently anymore, resulting in an immediate increase of R0 once the epidemy passes this threshold.

Of course, this capacity includes testing capacity (all contacts must be tested immediately), tracing capacity (people at health authorities must phone contacts etc.) and app support (tracing app with good acceptance). With efficient tracing, U can be brought down to close to 1. Like in the early Webasto outbeak in Germany, or some Chinese provinces. If all contacts are tested, even cases will be tested which are pre- or asymptomatic. This is why I use U as part of a risk evaluation.

A good threshold for well organized countries for I(t) is 1.0 (daily new cases per 100,000 inhabitants). Call this threshold C, e.g., C = 1.0/day/100,000.

The risk is high if: reproduction factor R0>1, new infections are too many, or U is too large (a society is flying blind); or a combination of all.

Alert value A = 4*log10(R0) + log10(I(t)/C) + 0.5 * log10(U)

With the numbers given above, we obtain A = 1.4 for the US.

Alert levels:

A<-2 means no risk

A<-1 means full control

A<-0.25 means low risk

A<+0.25 means moderate risk

A≥+0.25 means high risk

A≥+1 means very high risk

A≥+2 means out of control

Of course, the above is a handwaving formula and interpretation. But it draws attention to the fact that the focus must not be on R0 alone, but on the number of new cases and test coverage as well.

A value like A may be evaluated on smaller regional boundaries than states or countries and be used to conditionally apply or lift lockdown or other measures without wasting too much time in discussions.

Side note: if a society jumps from zero cases to one death (which then means one infected as well), A jumps to A=-1 (in a population of 10 million). The second death makes it jump to A=0.5 — high risk (assuming R0=2). That’s appropriate as it indicates an undetected start of community spread.

§9 Case studies for a few countries, and advice

9.1 USA

We start with the US as it managed to lead the world in number of cases.

New Cases 29.04.2020: 27084

Weekly average: 29114

R0: 0,97 (0,92–1,04)

Forecast 27.05: 33335 (20808–53402)

Alert value A: 1.4

The blue squares are total confirmed cases (just passing 1 million), the brown line are active cases (computed from date of report), the orange line is the sliding weekly average and the blue circles are daily reported new confirmed cases. The scale is logarithmic. More on the method to forecast in a second. Let’s first look at the evolution of R0:

USA: Evolution of R0 (green), new cases (orange, log10), 4 week forecast

The green curve is the computed R0 as described above. The orange line draws daily new cases (its log10, so 0=1, 1=10, 2=100, 3=1000, 4=10,000, 5=100,000, 6=1,000,000): reported (dots), sliding weekly average, forecast.

In the US, R0 was measured rather large (4.0 at March 22) before it steadily descended to around 1.0 where it sits for the past 3 weeks. The large spikes in the beginning are certainly also due to a varying degree of test coverage. More tests lead to more confirmed cases and result in temporarily increased measurements of R0. However, overall I believe this effect to be small enough to be ignored in the larger picture of things. Nevertheless, let’s look at test coverage.

Test coverage [accumulated #tests/1000 people] Source: ourworldindata.org used under CC BY.

While South Korea initially had the largest number of tests (per inhabitant), it was surpassed by Germany which now leads in tests. Italy ramped up their testing considerably, and now the US. A curved line indicates that testing may have some effect on the measured values of R0. The effect in the US is certainly significant in the 2nd half of March and may explain the spike of R0 to pass 5.

In order to compute a forecast, I use a weighted weekly average of R0 and twice its standard deviation (95% confidence interval). For the weighted weekly average, I use a weight of 7-X for day -X (X=0, … 6). No attempt is made to predict a trend for R0 as it is deemed to be statistically unstable.

NYC: Evolution of R0 (green), new cases (orange, log10), 4 week forecast

LA: Evolution of R0 (green), new cases (orange, log10), 4 week forecast

.

.

.

.

.

.

.

.

As you can see, the evolution in LA is currently hard to predict — but there certainly was a recent spike.

.

.

.

9.2 China, Hubei province

China: Evolution of R0 (green), new cases (orange, log10), 4 week forecast

China is an interesting case because (if we are to believe the figures are only faked by some factor) they show the evolution of R0 with daily cases brought down to 0.

There is an intermediate spike around Ferbruary 16, due a change in reporting as of February 13. Other than that, R0 was reduced all the way from 3.0 to 0.3. And with number of cases around 400, experienced a short spike to R0 around 1, to again reduce it to 0.3 until no cases were left. Since then, R0 just measures single infection events and another recent change in reporting.

The lesson here is that it seems to become increasingly simpler to reduce R0 the fewer the new cases are. This is already reflected in our alert value formula for A. There may be two reasons for this: higher infectious sub populations play a smaller role with fewer cases. And contact tracing is much more efficient.

9.3 Germany

Germany: Evolution of R0 (green), new cases (orange, log10), 4 week forecast

Germany is interesting because it tested a lot.

New Cases 29.04.2020: 1627

Weekly average: 1556

R0: 0,83 (0,74–0,93)

Forecast 27.05: 303 (127–723)

The population is 83 million, the daily cases therefore is

1.9/d/100,000. The number of deaths in the current week is 1188. This results in

U = 4.5x (unknown cases).

The current Alert value (2020, April 29) is A = 0.28, meaning the risk is moderate to high. In order to bring A down to zero, R0 would have to become 0.7. In a situation with only 1 case and no unknown cases, R0 could be as high as 5.4 to keep A at zero. This is what happened during the German Webasto incident in January (R0 became 3) but the outbreak was controlled completely back then, A approached 0, but didn’t become positive. This suggests that the scale for A withstands real world tests.

9.4 Austria

Austria: Evolution of R0 (green), new cases (orange, log10), 4 week forecast

Austria is said “to be ahead of” Germany because it has seen a similiar evolution but was more nearby Italy, had cases sooner.

New Cases 29.04.2020: 45

Weekly average: 68

R0: 1,00 (0,68–1,47)

Forecast 27.05: 26 (1–528)

The population is 8.86 million, weekly deaths are 70. Daily cases are 0.76/d/100,000. U is 8.1x (using the weighted weekly average for R0). Alert value is A = 0.12. Austria generally is on a good track and reduced the number of daily new cases to below 100. But the situations isn’t stable yet, and the alert value does correctly reflect this.

9.5 Switzerland

Switzerland: Evolution of R0 (green), new cases (orange, log10), 4 week forecast

New Cases 29.04.2020: 143

Weekly average: 163

R0: 0,76 (0,70–0,84)

Forecast 27.05: 13 (6–28)

The population is 8.57 million, weekly deaths are 207. Daily cases are 1.9/d/100,000. U is 3.9x (using the weighted weekly average for R0). Alert value is A = 0.02 (moderate risk).

Switzerland currently has more cases and deaths but a more positive evolution of R0 than Austria.

9.6 Italy

Italy: Evolution of R0 (green), new cases (orange, log10), 4 week forecast

Italy seems to do a bit better than Spain reduce the number of new cases, to bring R0 below zero.

New Cases 29.04.2020: 2086

Weekly average: 2323

R0: 0,84 (0,76–0,92)

Forecast 27.05: 750 (348–1617)

.

9.7 Spain

Spain: Evolution of R0 (green), new cases (orange, log10), 4 week forecast

More recently, Spain seems to struggle to keep R0 below 1. Despite a tremenduous lock down effort.

New Cases 29.04.2020: 4771

Weekly average: 4073

R0: 0,89 (0,78–1,01)

Forecast 27.05: 2786 (1035–7499)

This highlights the difficulty to contain the disease as soon as the number of cases spike.

9.8 France

France: Evolution of R0 (green), new cases (orange, log10), 4 week forecast

France has made things difficult with multiple changes to their reporting.

New Cases 29.04.2020: -2512

Weekly average: 1483

R0: 0,78 (0,35–1,69)

Forecast 27.05: 58 (0–24887)

Still it seems, France is slowly reducing the infection rate.

.

9.9 UK

UK: Evolution of R0 (green), new cases (orange, log10), 4 week forecast

The UK has managed to bring down R0 to 1. But not below and that’s not enough.

New Cases 29.04.2020: 4076

Weekly average: 4532

R0: 0,93 (0,88–0,98)

Forecast 27.05: 2730 (1871–3984)

.

9.10 Sweden

Sweden: Evolution of R0 (green), new cases (orange, log10), 4 week forecast

Sweden is under observation by many as it was very late in lockdown measures. They now seem to pay the price as R0 doesn’t come down below 1.

New Cases 29.04.2020: 681

Weekly average: 614

R0: 0,99 (0,87–1,12)

Forecast 27.05: 727 (277–1909)

.

9.11 Australia

Australia NSW: Evolution of R0 (green), new cases (orange, log10), 4 week forecast

Report is for New South Wales. The outbreak seems to be pretty much over within the next 3 weeks.

New Cases 29.04.2020: 0

Weekly average: 6

R0: 0,78 (0,51–1,18)

Forecast 27.05: 0 (0–6)

Good job and values of R0=1 are of no concern anymore.

9.12 Canada

Canada Quebec: Evolution of R0 (green), new cases (orange, log10), 4 week forecast

Report is for Quebec. Similiar situation to the US or UK: R0 at 1 is not good enough.

New Cases 29.04.2020: 849

Weekly average: 806

R0: 0,98 (0,85–1,13)

Forecast 27.05: 713 (239–2126)

.

.

9.13 South Korea

South Korea: Evolution of R0 (green), new cases (orange, log10), 4 week forecast

South Korea seems to continue to remain on top of the disease.

New Cases 29.04.2020: 4

Weekly average: 10

R0: 0,95 (0,65–1,38)

Forecast 27.05: 2 (0–39)

.

.

9.14 Singapore

Singapore: Evolution of R0 (green), new cases (orange, log10), 4 week forecast

Singapore is interesting. As it has seen an outbreak after R0 was already at 1 and cases below 100.

New Cases 29.04.2020: 690

Weekly average: 786

R0: 0,82 (0,49–1,39)

Forecast 27.05: 618 (11–35679)

This shows how important it is to consider all risks: Singapore managed to increase its measures to bring R0 back to, and now below 1. But it does show also how dangerous it is to keep R0 at around 1 with many infections going on.

9.15 Thailand

Thailand: Evolution of R0 (green), new cases (orange, log10), 4 week forecast

If figures are accurate, then Thailand may soon have defeated the current outbreak.

New Cases 29.04.2020: 9

Weekly average: 17

R0: 0,70 (0,51–0,95)

Forecast 27.05: 2 (0–23)

It shows that discipline may matter at least as much as a strong economy.

9.16 Brazil

Brazil: Evolution of R0 (green), new cases (orange, log10), 4 week forecast

Brazil is a tragic counter example to this, an outbreak mostly out of control.

New Cases 29.04.2020: 6450

Weekly average: 4847

R0: 1,50 (1,23–1,82)

Forecast 27.05: 63529 (13834–291735)

Brazil shows that values for R0 between 1 and 1.5 are not good. That just flattening the curve is not good enough. I am really concerned for the people of Brazil.

§10 Conclusion

I have described how R0 can be computed by everybody from publicly available data. Or own data sources for an evaluation of specific situations: a region, care homes, hospital staff, elderly, families with kids in school etc.

Moreover I’ve given a couple of clues to prperly interpret R0 as obtained from such measures: what it means if the value has changed. And where in time to look for a possible cause. Or when the change may be an artefact, due to a statistical fluctuation or a shift in sub populations affected.

Eventually, I’ve given a possible measure for the state of things in a country, taking into account not only the base reproduction rate R0, but also actual infection rates and test coverage. I introduced the Alert value A which heavily depends on R0.

Considering the present situation in a couple of countries, I would summarize it as follows: a group of contries in South East Asia are going to controil the current wave of the epidemic (the only wave for them with travel bans staying in effect). Another group is making good progress, which however is fragile. This is Middle Europe led by Switzerland and Spain trailing a bit behind. The anglo-saxon countries, UK, US, Canada however have successfully flattened the curve but currently fail to contain the disease, to bring R0 down below 1. That is sad as this is the most expensive of all options. Even NYC is not making the progress it could. Sweden seems to now pay a price for not being aggressive enough to reduce R0 early on as new cases are still rising. Unfortunately, a few countries have taking measures which are far from being sufficient, like Brazil. In these countries, the outbreak seems to be out of control.

For countries with good monitoring I propose to compute an Alert value similiar to A as described here, maybe on a more regional level. Like a state for the US or Germany. And to make measures depend on achieved progress on A and make these dependencies public for maximum transparency. And for a better motivation in the population to make their best effort.

Thanks for your time!

Important note: Updates to this story are written as response in the Responses section to this article!

References

[JHU] John Hopkins University dashboard data, available here: github.com/CSSEGISandData/COVID-19/tree/master/csse_covid_19_data

[RKI] Robert Koch Institut, Germany. Epidemiologisches Bulletin 18/2020 (German): www.rki.de/DE/Content/Infekt/EpidBull/Archiv/2020/Ausgaben/18_20.pdf?__blob=publicationFile

[Heinsberg study] unpublished, intermediate result (German): www.land.nrw/sites/default/files/asset/document/zwischenergebnis_covid19_case_study_gangelt_0.pdf

Revisions

v1.0 2020, April 30. Original publication.

v1.1 2020, May 1. Revised section about formula for computing U. An earlier version used R0 to extrapolate U. Now, earlier (time-shifted) infection rates are used. Moved the subsection about the Alert Value A into its own section. Revised the shift in time for my method (green curves) to 19 days.

Also, refer to various responses for updates to the article.