Pandemiden sadece insanlar değil, YZ modelleri de zarar gördü. Pandemi paradigmasını yakalayabilmek için artık pek çok tahmin modelinin içerisine pandemi değişkenleri de giriyor. Ama bu değişkenler neler olmalı, ve bunlara ne kadar güvenebiliriz sorularına cevap bulmak pek kolay değil. Bugün vaka sayıları üzerine biraz çalıştım, gelin anlatayım.
Günde ortalama $\lambda$ kere görülen bir olayın bugün tam olarak $k$ defa gerçekleşmesi ihtimalini açık seçik hesaplayabiliriz. Poisson dağılımı, bu ihtimallerin dağılımıdır. Pandemide vaka sayılarını modellemek için Poisson pek iyi bir model değildir çünkü vakaların görülme sıklığı sabit kalmaz, her bir vaka üreme katsayısına bağlı olarak yeni vakalara yol açar, alınan ya da alınmayan önlemlerden dolayı görülme sıklığı sürekli değişir. Bunları gözardı eder, süreci Poisson dağılımıyla modellemeye çalışırsanız, gerçek vaka sayılarının varyansı sizin tahmin ettiğiniz varyanstan çok uzakta olur. Pandemilerde vaka sayıları Poisson’a göre fazla dağınık (overdispersed) olma eğilimindedir.
Aşağıda paylaşacağım kodda, global pandemi verilerinden çeşitli ülkelerin vaka sayılarının Poisson modeline göre ne kadar “overdispersed” olduğunu inceledim. 7 günlük hareketli ortalamaları kullanarak, her bir 7 günlük zaman dilimini Poisson dağılımıyla modellersek gerçek varyansın Poisson dağılımından gelen bir varyanstan %99 ihtimalle daha büyük olduğu günleri saydım. Aşağıda ülkeler bazında toplam günlerin yüzde kaçında vaka sayılarının “overdispersed” olduğunu görüyorsunuz.
== Overdispersion Percentage == Turkey 83.05555555555556 Spain 96.4735516372796 Italy 96.5 Germany 94.32098765432099 United Kingdom 93.26683291770573 France 94.23558897243107 Denmark 94.91978609625669 Sweden 97.75 Norway 90.93333333333334 Greece 91.46666666666667 Bulgaria 91.48351648351648 Russia 85.03740648379052 Albania 59.50413223140496 Azerbaijan 80.3234501347709 Iran 92.93193717277487 Iraq 95.75596816976127 Egypt 61.49870801033591 China 68.87254901960785 Japan 88.26405867970661
Beklediğimiz gibi, gerçek vaka sayıları çok büyük oranda dağınık (overdispersed). Fakat kimi ülkeler diğerlerinden daha dağınık, bizim vaka sayıları bir yanda İspanya, İtalya, Almanya bir yanda. Bu sayıları alıp olduğu gibi YZ modellerine beslemek pek makul görünmüyor.
import numpy as np
import pandas as pd
def poissonsamplevar(mu, n, perc=99, nrep=100):
v = np.zeros(nrep)
if np.isnan(mu):
return np.nan
else:
for i in range(nrep):
x = np.random.poisson(mu, size=n)
v[i] = np.var(x)
return np.percentile(v, perc)
df = pd.read_csv('https://covid.ourworldindata.org/data/owid-covid-data.csv?raw=true')
countries = ['Turkey', 'Spain', 'Italy',
'Germany', 'United Kingdom', 'France', 'Denmark', 'Sweden', 'Norway',
'Greece', 'Bulgaria', 'Russia', 'Albania', 'Azerbaijan', 'Iran', 'Iraq', 'Egypt', 'China', 'Japan']
win = 7
nrep = 100
np.random.seed(42)
print('== Overdispersion Percentage ==')
for country in countries:
t = df[df['location']==country][['date', 'new_cases']]
t = t[t['new_cases']>=0].copy()
t['Roll_Mean'] = t['new_cases'].rolling(win).mean()
t['Roll_Var'] = t['new_cases'].rolling(win).var(ddof=0)
t['Poisson_99'] = t['Roll_Mean'].apply(poissonsamplevar, args=(win, 99, nrep))
t['Overdispersed'] = 0
t.loc[t['Roll_Var'] > t['Poisson_99'],'Overdispersed'] = 1
print(f'{country[:20]:20}', end='')
print(t['Overdispersed'].sum()/len(t)*100)
** Bu yazıyı ve kodu, https://github.com/dkobak/excess-mortality adresinde bulabileceğiniz bir çalışmadan esinlenerek yazdım.
