diff --git a/README.md b/README.md index 4db6bb2..384903d 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@ -# Calculating the age-stratified infection fatality ratio (IFR) of COVID-19 - -*Updated: 02 Sep 2020* +*Updated: 27 Sep 2020* Author: Marc Bevand +# Calculating the age-stratified infection fatality ratio (IFR) of COVID-19 + The largest serological prevalence survey of COVID-19 was conducted by Spain during the second round of a study that analyzed 63 564 samples between 18 May 2020 and 01 June 2020. We used its [provisional results][sero] published on 03 @@ -71,26 +71,6 @@ So a false negative rate anywhere from 3% to 21% could be possible, and we think it is premature to adjust IFR calculations given the exact sensitivity is not known. -# Applying the age-stratified IFR to other countries - -The script `calc_ifr.py` is also able to apply the age-stratified IFR to -another population pyramid, thus calculating the expected average IFR for other -countries. - -In the second half of the script, edit `pyramid_target` with the demographics data. -As an example, we supply pyramid data for the United States and calculate an IFR of **0.658%**: - -``` -$ ./calc_ifr.py -[...] -IFR on target country assuming disease prevalence equal among ages: 0.658% -``` - -However the average IFR is highly dependent on factors other than age: varying -prevalence among age brackets, underlying health conditions, access to -healthcare, socioeconomic status, ethnicity, etc, so this estimate should be -interpreted with caution. - [sero]: https://www.mscbs.gob.es/ciudadanos/ene-covid/docs/ESTUDIO_ENE-COVID19_SEGUNDA_RONDA_INFORME_PRELIMINAR.pdf [daily]: https://www.mscbs.gob.es/profesionales/saludPublica/ccayes/alertasActual/nCov-China/documentos/Actualizacion_120_COVID-19.pdf [dailyalt]: https://www.mscbs.gob.es/profesionales/saludPublica/ccayes/alertasActual/nCov-China/documentos/Actualizacion_109_COVID-19.pdf diff --git a/calc_ifr.py b/calc_ifr.py index 9ed35a2..5d36190 100755 --- a/calc_ifr.py +++ b/calc_ifr.py @@ -89,63 +89,3 @@ for (bracket, deaths) in deaths_by_age.items(): if bracket != (0,199): ifrs[bracket] = ifr print('True IFR may be higher due to right-censoring and under-reporting of deaths') - -# IFRs estimated by the US CDC as of 10 Sep 2020 -# https://www.cdc.gov/coronavirus/2019-ncov/hcp/planning-scenarios.html -ifrs_cdc = { - (0,19): 0.00003 * 100, - (20,49): 0.0002 * 100, - (50,69): 0.005 * 100, - (70,199): 0.054 * 100, - } -#ifrs = ifrs_cdc - -# Now we apply the age-stratified IFR to a target country with a different -# population pyramid. -pyramid_usa = [ - 3931967,3919500,3919461,3930158,3903010,3955644,4008192,4059364,4107872,4156677, - 4208742,4241520,4245220,4231306,4220681,4208740,4210781,4236404,4278618,4316059, - 4347272,4397310,4474657,4565701,4651027,4737732,4788205,4782769,4739004,4695388, - 4645691,4592419,4541165,4490237,4433909,4375200,4315098,4254149,4194587,4137614, - 4082405,4040406,4017264,4008404,4003094,4002870,4009404,4022256,4040872,4061465, - 4080383,4112964,4165027,4226569,4281521,4332795,4362769,4360922,4333852,4300884, - 4260806,4197638,4106208,3993650,3871350,3735929,3602786,3480392,3361570,3234769, - 3107225,2956039,2770249,2564001,2361344,2156197,1973453,1827535,1707062,1586129, - 1469802,1357365,1245835,1137042,1035221,938832,849231,767290,691462,616131, - 563171,502660,421119,320109,246668,212578,178289,135554,84374,52727, - 89949] -pyramid_brazil = [ - 2912645,2911289,2909842,2908910,2929264,2921025,2917200,2918307,2924864,2934834, - 2946178,2972203,3018543,3078043,3136622,3195540,3251605,3301290,3344786,3388265, - 3433442,3459511,3457671,3437884,3418276,3394450,3380617,3385437,3402065,3412047, - 3415537,3426511,3448932,3475244,3496591,3517930,3510603,3460455,3381348,3303033, - 3221635,3138838,3059150,2982451,2902292,2817780,2749317,2705728,2678099,2647627, - 2616799,2583560,2544575,2500301,2456124,2412892,2355472,2277478,2185839,2093568, - 1997708,1906695,1825931,1751319,1673981,1596439,1515703,1429640,1340707,1254062, - 1169353,1086550,1006379,929300,854003,779494,714465,662710,619954,578882,541861, - 500461,450034,394932,343853,294689,251689,217723,190370,162773,141993, - 122419,98983,71932,52603,43565,35696,26627,16360,10584,18733] -# Iceland data from https://px.hagstofa.is/pxen/pxweb/en/Ibuar/Ibuar__mannfjoldi__1_yfirlit__yfirlit_mannfjolda/MAN00101.px/table/tableViewLayout1/?rxid=9083b9d0-5131-4ab9-9125-ec41a844b3c9 -pyramid_iceland = [ - 4462, 4275, 4156, 4183, 4286, 4473, 4481, 4647, 4663, 4963, - 5025, 4870, 4664, 4601, 4470, 4521, 4350, 4274, 4398, 4700, - 4696, 4947, 5161, 5448, 5518, 5886, 6201, 6123, 6081, 6276, - 5938, 5896, 5341, 5146, 5067, 5168, 5265, 5234, 5126, 5280, - 5168, 4774, 4600, 4746, 4723, 4554, 4871, 4903, 4423, 4214, - 4340, 4266, 4353, 4589, 4479, 4508, 4500, 4408, 4177, 4372, - 4363, 4160, 4133, 3977, 3800, 3641, 3582, 3327, 3249, 3182, - 3015, 2923, 2722, 2499, 2458, 2211, 2044, 1899, 1637, 1482, - 1396, 1275, 1242, 1181, 1044, 971, 881, 829, 752, 721, - 561, 440, 355, 309, 201, 153, 98, 73, 41, 29, - 50] - -pyramid_target = pyramid_usa -sim_total = 0 -sim_deaths = 0 -for (bracket, ifr) in ifrs.items(): - for age in range(bracket[0], bracket[1] + 1): - if age < len(pyramid_target): - sim_total += pyramid_target[age] - sim_deaths += pyramid_target[age] * ifr / 100.0 -assert sim_total == sum(pyramid_target) -print('IFR on target country assuming disease prevalence equal among ages: {:6.3f}%'.format(100.0 * sim_deaths / sim_total))