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) .