MEME fits to Covid-19 Case and Death Records up to 2020-Dec-14

Keith Horne, SUPA Physics & Astronomy, University of St.Andrews
MEME = Maximum Entropy Modeling of Epidemics
MEME measures the time delay distribution P(tau) between the reported daily cases and deaths. This models the daily record of reported deaths, D(t), as a convolution of the reported cases C(t) with a delay distribution, P(tau):
-------------- D(t) = Int P(tau) C(t-tau) dtau --------------
The data analysed are downloaded daily from the the European Centre for Disease Prevention and Control .
MEMEcho was developed to map black hole accretion flows by fitting the time delay distribution P(tau) between recorded time variations in ionising continuum radiation, C(t), and corresponding responses in photo-ionised emission lines, L(t). The line lightcurve is a convolution of the continuum lightcurve with the delay distribution, P(tau):
-------------- L(t) = Int P(tau) C(t-tau) dtau ---------------
MEMEcho fits lightcurve data, Li and Ci at different times t_i, to determine the delay distribution P(tau). The time delayed responses arise from light travel time within the system, so that P(tau) probes the region around the black hole.
MEME fits use MEMEcho to estimate the time delay distribution P(tau) between reported cases C(t) and deaths D(t).
Several other statistics of interest are derived from P(tau):
The Case Fatality Rate (CFR) is the number of reported deaths per case. This is the sum of P(tau) over all delays:
------------- CFR = Int P(tau) dtau ------------------------
The Mean Delay is the first moment of P(tau):
----- Mean Delay = ( Int tau P(tau) dtau ) / CFR -----------

The Cumulative Reported Cases and Deaths sums the Daily Reported Cases and Deaths up to time t:
------------- SumC(t) = Int C(t) dt ------------------------
------------- SumD(t) = Int D(t) dt ------------------------
Drizzle corrections are made to "correct" for the (sometimes large) down-up-down patterns in the reported C(t) and D(t) curves. These are assumed to arise because the reports of cases and deaths are sometimes delayed by a day or two, for example on weekends and holidays. Our drizzle algorithm moves reported counts back in time, to reduce high counts and increase low counts, until the day-to-day changes are compatible with the expected sqrt(N) Poisson statistics (no outliers larger than 2.5 sigma). The plots show the original C(t) and D(t) curves as grey histograms, and the corrected C(t) and D(t) histograms decorated with blue and red stars, respectively. The drizzle correction works well in most cases. The 1209 deaths reported in China on 17 Apr could not be adequately corrected, so we have edited out that spike by hand.
Weekly Cycle: Sundays are marked with vertical dashed green lines. There is an evident weekly cycle. The drizzle-corrected counts typically undulate with more cases and deaths reported in the second half of the week. This is likely a real modulation. The amplitude is different in different nations, and can be large.
Stiff vs Flexible P(tau): The effect on P(tau), when the model attempts to fit the weekly cycle, is to sometimes shift peaks toward a multiple of 7 days, or to introduce multiple peaks separated by 7 days. The CFR (area under P(tau)) then also becomes too large. We can reduce this tendency by making the P(tau) distribution "stiffer" relative to C(t). We find also that when counts are low, the entropy tends to flatten out P(tau) so much that the fit under-predicts D(t). We then need a more flexible P(tau) to control this low-count bias. We currently tune the stiffness of P(tau) by hand, while we investigate a more automatic way of doing this.
10-day Forecasts: The MEME fit extrapolates reported cases to predict future deaths, taking account of the delay distribution. This may usefully anticipate pressure on the health care system. Specifically, we forecast the daily and cumulative cases and deaths 10 days ahead. The MEME fit usually tends to a constant future case rate C(t). Four other scenarios are considered:
Model 0: the (unrealistic) best-case scenario assumes no future cases.
Model 1: extrapolate C(t) with a constant.
Model 2: extrapolate logC(t) with a linear fit to previous 14 days (exponential rise or fall).
Model 3: extrapolate logC(t) with a quadratic fit to previous 21 days (gaussian peak).
The best forecast likely falls between Models 2 and 3. Even with this wide range of possibile future daily cases C(t), the forecasts of future deaths D(t) diverge only after the time delay. All 5 scenarios are presented on the plots to give some indication of where the MEME forecast becomes uncertain. Forecasts for the 5 scenarios are shown with small circles for the MEME fit, and with dots, plus signs, squares and triangles for Models 0-3, respectively.
Nation by Nation Results: Comparing results for different nations reveals different delays. Many peak around 7-10 days, but some have multiple delay peaks. These differences may reflect a variety in the strength and timing of mitigation strategies such as testing, contact tracing, social distancing, lockdown, etc. For instance, delays near 0 indicate deaths and cases rising with little delay - which may occur when testing is only being done on very seriously ill people. Negative delays can arise if daily reports are not up to date.
Asia
CHN. IND. IDN. PAK. RUS. JPN. PHL. VNM. TUR. IRN. THA. KOR. SAU. MYS. ISR. TWN.
Europe
DEU. FRA. GBR. ITA. POL. ESP. NLD. BEL. GRC. PRT. SWE. AUT. DEN. FIN. NOR. IRL. ISL.
North America
US. MEX. CAN.
South America
BRA. ARG. PER. VEN. CHL.
Africa
NGA. EGY. ZAF.
Oceiana
AUS. NZL.
Maximum Entropy Regularisation : The maximum entropy method seeks the "simplest positive" functions that fit the data. In this context C(t) and P(tau) are adjusted to fit the daily record of reported cases Ci and deaths Di at times t_i. A series of fits is constructed, adjusting C(t) and P(tau) until the "Badness of Fit" statistic Chi^2/N is at a specified value, and the "entropy" is maximised. The "entropy" is our measure of the "simplicity" of the model, giving preference to smooth positive functions C(t) and P(tau), where each value is "close" to its neighbors.
Gaussian uncertainties on Ci and Di are used to evaluate Chi^2. These are based on Poisson statistics, but boosted to reflect larger fluctuations that arise from irregularities in daily reports of cases and deaths. We fit at several Chi^2/N levels descending from 10 to 0.6. At high Chi^2/N the model is "simple" but fails to fit the data. The "simplest positive" P(tau), on the delay range -50 to +50 days, has a broad peak centred at tau=0. As we reduce Chi^2/N, the model develops more structure to fit the data more closely. If Chi^2/N is too low, the model becomes noisy, with P(tau) developing multiple sharp peaks in an effort to fit noise in the data.
The MEME plots highlight the Chi^2/N=1 model but show the others as well to give an idea of the range of this noise/resolution trade-off.
Plots showing the MEMEcho fit results and the models for cases C(t), deaths D(t), and delays P(tau) are linked below for different Chi^2/N levels:
China Drizzle. MEME.
Chi^2/N=3: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=2: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.5: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.2: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.1: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.0: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.9: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.8: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.7: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.6: Fit . Iter . C(t) . D(t) . P(tau) .

South Korea Drizzle. MEME.
Chi^2/N=3: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=2: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.5: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.2: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.1: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.0: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.9: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.8: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.7: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.6: Fit . Iter . C(t) . D(t) . P(tau) .

Italy Drizzle. MEME.
Chi^2/N=3: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=2: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.5: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.2: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.1: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.0: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.9: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.8: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.7: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.6: Fit . Iter . C(t) . D(t) . P(tau) .

Spain Drizzle. MEME.
Chi^2/N=3: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=2: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.5: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.2: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.1: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.0: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.9: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.8: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.7: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.6: Fit . Iter . C(t) . D(t) . P(tau) .

France Drizzle. MEME.
Chi^2/N=3: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=2: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.5: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.2: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.1: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.0: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.9: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.8: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.7: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.6: Fit . Iter . C(t) . D(t) . P(tau) .

Germany Drizzle. MEME.
Chi^2/N=3: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=2: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.5: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.2: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.1: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.0: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.9: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.8: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.7: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.6: Fit . Iter . C(t) . D(t) . P(tau) .

United Kingdom Drizzle. MEME. Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=2: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.5: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.2: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.1: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.0: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.9: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.8: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.7: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.6: Fit . Iter . C(t) . D(t) . P(tau) .

United States Drizzle. MEME. Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=2: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.5: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.2: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.1: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.0: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.9: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.8: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.7: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.6: Fit . Iter . C(t) . D(t) . P(tau) .

Israel Drizzle. MEME.
Chi^2/N=3: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=2: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.5: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.2: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.1: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.0: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.9: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.8: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.7: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.6: Fit . Iter . C(t) . D(t) . P(tau) .

India Drizzle. MEME.
Chi^2/N=3: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=2: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.5: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.2: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.1: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.0: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.9: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.8: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.7: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.6: Fit . Iter . C(t) . D(t) . P(tau) .

Iran Drizzle. MEME.
Chi^2/N=3: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=2: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.5: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.2: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.1: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.0: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.9: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.8: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.7: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.6: Fit . Iter . C(t) . D(t) . P(tau) .

Sweden Drizzle. MEME.
Chi^2/N=3: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=2: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.5: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.2: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.1: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.0: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.9: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.8: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.7: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.6: Fit . Iter . C(t) . D(t) . P(tau) .

Japan Drizzle. MEME.
Chi^2/N=3: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=2: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.5: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.2: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.1: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.0: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.9: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.8: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.7: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.6: Fit . Iter . C(t) . D(t) . P(tau) .

Iceland Drizzle. MEME.
Chi^2/N=3: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=2: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.5: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.2: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.1: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.0: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.9: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.8: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.7: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.6: Fit . Iter . C(t) . D(t) . P(tau) .

Russia Drizzle. MEME.
Chi^2/N=3: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=2: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.5: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.2: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.1: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.0: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.9: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.8: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.7: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.6: Fit . Iter . C(t) . D(t) . P(tau) .

Denmark Drizzle. MEME.
Chi^2/N=3: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=2: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.5: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.2: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.1: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.0: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.9: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.8: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.7: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.6: Fit . Iter . C(t) . D(t) . P(tau) .

Netherlands Drizzle. MEME.
Chi^2/N=3: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=2: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.5: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.2: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.1: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=1.0: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.9: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.8: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.7: Fit . Iter . C(t) . D(t) . P(tau) .
Chi^2/N=0.6: Fit . Iter . C(t) . D(t) . P(tau) .