USA fatalities estimates based on curve fit and SIR model
Resource is various official places, it now becomes clear that the death rate is under reported by as much as 50%
In[]:=
ResourceObject["Epidemic Data for Novel Coronavirus COVID-19"]
Out[]=
ResourceObject
Name: Epidemic Data for Novel Coronavirus COVID-19
»
Type: DataResource
Description:
Estimated cases of novel coronavirus (COVID-19, formerly known as 2019-nCoV) inf

In[]:=
usdeaths=ResourceData["Epidemic Data for Novel Coronavirus COVID-19","WorldCountries"]SelectMatchQ
United States
COUNTRY
,#Country&[All,"Deaths"];
In[]:=
usd=TimeSeriesWindow[First[usdeaths],{{2020,3,2},{2020,12,30}}]
Out[]=
TimeSeries
Time: 02 Mar 2020 to 28 Apr 2020
Data points: 58

In[]:=
usdl=Values[usd];
Number of days data is taken from
In[]:=
ndim=First[Dimensions[usdl]];
In[]:=
58
Out[]=
58
In[]:=
usdlr=Table[usdl[[i]]-usdl[[i-1]],{i,2,ndim,1}];
First date of capture
In[]:=
usd["FirstDate"]
Out[]=
Mon 2 Mar 2020 00:00:00GMT-4.
In[]:=
logusd=N[Log[usdl]];
Fatality curve fit model.
Curve fit is made on logarithmic scale - Exponential growth becomes straight line (linear fit)
denominator chosen so total fatalities approach constant value as t-> infinity
In[]:=
model=(a0+a1t+a2t^2+a3t^3+a4t^4)/(1.+a6t^4);
In[]:=
fit=FindFit[logusd,model,{a0,a1,a2,a3,a4,a5,a6},t,MaxIterations200]
Out[]=
{a01.55653,a10.252616,a2-0.00560352,a3-0.000350556,a40.0000458998,a51.,a63.50242×
-6
10
}
Total fatalities as t-> infinity:
In[]:=
Exp[a4/a6/.fit]
Out[]=
491472.
In[]:=
p2=DateListLogPlot[usd,PlotStyleRed,JoinedFalse,PlotLegends{"data"}];
In[]:=
p1=DateListLogPlot[TimeSeries[Table[Exp[Evaluate[model/.fit]],{t,1,ndim}],{"March 2,2020"}]];
In[]:=
Show[p1,p2,FrameTrue,GridLinesAutomatic,FrameLabel"fatalities curve fit log"]
Out[]=
data
In[]:=
p3=ListPlot[usdl,PlotStyleRed,JoinedFalse,PlotLegends{"data"}];
In[]:=
p4=Plot[Evaluate[Exp[model]/.fit],{t,1,ndim}];
In[]:=
Show[p3,p4,FrameTrue,GridLinesAutomatic,FrameLabel"fatalities curve linear (days)"]
Out[]=
data
In[]:=
g[t_]:=Exp[(a0+a1t+a2t^2+a3t^3+a4t^4)/(1.+a6t^4)]/.fit
In[]:=
Table[g'[i],{i,ndim}]'
Out[]=
′
{1.45974,1.74254,2.0417,2.35518,2.68632,3.04677,3.45953,3.96184,4.60865,5.477,6.67252,8.33936,10.6745,13.9476,18.5267,24.9077,33.7457,45.8803,62.3459,84.3571,113.256,150.42,197.133,254.436,322.985,402.94,493.908,594.953,704.664,821.274,942.795,1067.16,1192.37,1316.54,1438.05,1555.52,1667.83,1774.16,1873.91,1966.72,2052.42,2130.96,2202.45,2267.07,2325.09,2376.81,2422.57,2462.72,2497.62,2527.64,2553.11,2574.39,2591.8,2605.63,2616.2,2623.75,2628.55,2630.84}
Guessing two important parameters gamma= expected infectious duration ( days) and alpha=case fatality rate (not used)
In[]:=
gamma=1/10.5​​alpha=.01
Out[]=
0.0952381
Out[]=
0.01
Estimate fatalities into future months
In[]:=
idata=Table[g[i],{i,2.6*ndim}];
In[]:=
infected=TimeSeries[idata,{"March 2,2020"}]
Out[]=
TimeSeries
Time: 02 Mar 2020 to 29 Jul 2020
Data points: 150

In[]:=
DateListPlot[infected,FrameTrue,GridLinesAutomatic,FrameLabel"Estimated fatalities by date"]
Out[]=
Estimate daily fatalities (derivative of total fatalities) and compare to data taken.
In[]:=
drate=TimeSeries[Table[g'[i],{i,1.9*ndim}],{"March 2,2020"}]
Out[]=
TimeSeries
Time: 02 Mar 2020 to 19 Jun 2020
Data points: 110

In[]:=
d1=DateListPlot[drate,PlotRange{0,5000}];
In[]:=
d2=DateListPlot[TimeSeries[usdlr,{"March 3,2020",Automatic,1}],PlotStyleRed,JoinedFalse,PlotLegends{"data"},GridLinesAutomatic];
In[]:=
Show[d1,d2,FrameTrue,GridLinesAutomatic,FrameLabel"Estimated daily fatalities"]
Out[]=
data
As can be seen from other countries, the daily fatalities do not drop rapidly as one would expect from a standard SIR model when herd immunity has been reached, but rather reach a plateau. The plateau happens because we are not near herd immunity yet but we managed to control spread with social distancing. If we assume that the reproduction rate R is not a constant but dependent on behaviour (and perhaps weather) in an SIR model and assume we are still far from her immunity then we can estimate R(t) from the model and curve fit:
In[]:=
bmg=TimeSeries[Table[g''[i]/g'[i]/gamma+1.,{i,1.9*ndim}],{"March 2,2020"}];
In[]:=
DateListPlot[bmg,FrameTrue,GridLinesAutomatic,FrameLabel"Reproduction rate R based on SIR model"]
Out[]=

Conclusion

We started out with a reproduction rate of about 3. Initial attempts of contact tracing reduced R down to about 2.3 but failed and the reproduction rate rose to about 4.2 mid March. Social distancing then gradually reduced R down to about 1 today. Keeping the current social distancing in place, R fill fall slightly below 1 by the end of June.
Assume data and model are correct, we will have 200,000 fatalities by independence day. Recent news suggest that the data under reports - this would raise the estimated outcome.