Временски зависно \(\alpha\)¶
Болнички ресурси¶
Слично како \(R_0\), стапката на смртност е доста нереалистично да се моделира како сценаријата до сега, бидејќи не е реално смртноста да е иста кај население кое е повозрасно и кај помлади тинејџери. Оваа стапка (параметар) зависи од повеќе работи меѓутоа во оваа тетратка се фокусираме на возраста на популацијата и на ресурсите.
Прво, да го разгледаме параметарот како зависен од ресурси. Сакаме стапката да биде поголема кога повеќе луѓе се заразени (инфицирани). Појдуваме од точка, како ова може да се формулира фо функција? Ни треба оптимална (некоја средна) стапка на смртност за случајот каде само неколкумина се заразени (и во исто време тие да се стекнат со оптимално лекување) и некој фактор што го зима во предвид која порција од популацијата е моментално заразена.
Ова е еден пример за таква функција која ги имплементира овие идеи:
Во формулата, $f$ е некој произволен фактор за скалирање кој е откако ќе го поставиме на почетокот од моделот, останува константен низ целото моделирање; $alpha_{base}$ е оптималната стапка на смртност.
Пример сценарио
Доколку факторот \(s=\frac{1}{2}=0.5\) и нека половина од популацијата е заразена на \(t\) ден, тогаш \(s\cdot \frac{I(t)}{N} = \frac{1}{2} \cdot \frac{1}{2} = \frac{1}{4}=25\%\), што посочува дека \(\alpha(t)\) на тој ден е всушност \(25 \% + \alpha_{base}\). Или можеби повеќето луѓе едвај имаат некакви симптоми и поради тоа големиот број на заразени не ги преполовува болниците. Сепак ова моделирање е попримитивно бидејќи не го зима во предвид бројот на кревети, респиратори и сл. Незаивсно, доколку го разгледаме истото сценарио но со фактор од \(s=0.1\), ратата ќе ни биде попристојна и \(\alpha(t)\) би било само \(5 \% + \alpha_{base}\).
Старост на население; SEIRD за различни популации¶
Да се моделира возраста на населението можеби беше еден од поголемите предвизици. За да се имплементира целосно би требало да има помали возрасни групи и повеќе на број што многу ни ги направи равенките тријвијални. Поедноставен пристап ни беше да го поделиме наслението во 4 групи каде секоја група има соодведен дел (изразен во %) од вкупната популација и за секоја група да дефинираме стапка на смртност \(\alpha\):
1 Група: 0-29
2 Група: 30-59
3 Група: 60-89
4 Група: 90+
Пример би можеле да го поделиме населението на следниот начин:
import plotly.graph_objects as go
import plotly.tools as tls
from plotly.offline import plot, iplot, init_notebook_mode
from IPython.core.display import display, HTML
from plotly.subplots import make_subplots
init_notebook_mode(connected = True)
config={'showLink': False, 'displayModeBar': False}
colors1 = ['lightslategray',] * 5
colors1[3] = '#0066CC'
colors2 = ['lightslategray',] * 5
colors2[2] = 'crimson'
alpha_by_agegroup = {"0-29": 0.01, "30-59": 0.05, "60-89": 0.2, "89+": 0.3}
proportion_of_agegroup = {"0-29": 10, "30-59": 30, "60-89": 40, "89+": 20}
fig = make_subplots(rows=1,
cols=2,
horizontal_spacing = 0.15,
subplot_titles=("𝛼 по ворзасни групи","Распределба на население"))
fig.add_trace(
go.Bar(
x=["0-29",
"30-59",
"60-89",
"89+"],
y=[alpha_by_agegroup["0-29"],
alpha_by_agegroup["30-59"],
alpha_by_agegroup["60-89"],
alpha_by_agegroup["89+"]],
marker_color=colors1,
hovertemplate = '%{x} група, 𝛼: %{y} ',
name = '',
showlegend = False,
hoverlabel = dict(bgcolor='white',
bordercolor='black')),
row=1, col=1
)
fig.add_trace(
go.Bar(
x=["0-29",
"30-59",
"60-89",
"89+"],
y=[proportion_of_agegroup["0-29"],
proportion_of_agegroup["30-59"],
proportion_of_agegroup["60-89"],
proportion_of_agegroup["89+"]],
marker_color=colors2,
hovertemplate = '%{x} група, %{y} %',
name = '',
showlegend = False,
hoverlabel = dict(bgcolor='white',
bordercolor='black')),
row=1, col=2
)
fig.update_layout(title_text = "SIERD",
title_x = 0.5,
xaxis_title = 'Возрасна група',
xaxis=dict(mirror=False,
showline=True,
linecolor='#000',
tickfont = dict(size=11)),
yaxis_title = '𝛼',
yaxis=dict(mirror=False,
showline=True,
linecolor='#000',
tickfont = dict(size=11)),
xaxis2_title = 'Возрасна група',
xaxis2=dict(mirror=False,
showline=True,
linecolor='#000',
tickfont = dict(size=11)),
yaxis2_title = '%',
yaxis2=dict(mirror=False,
showline=True,
linecolor='#000',
tickfont = dict(size=11)),
plot_bgcolor='#fff',
hovermode = 'closest',
width = 700,
height = 350,
font = dict(size = 10),
margin=go.layout.Margin(l=50,
r=50,
b=60,
t=55))
plot(fig, filename = 'fig9_1_alpha_age.html', config = config)
display(HTML('fig9_1_alpha_age.html'))
Оваа поделба резултира со доста повозрасно население со 60% од населението да е постаро од 60 години. Пример, доколку за ова население би ја пресметале просечната стапка на смртност би добиле:
Имајќи во предвид сите дополнителни параметри, не менуваме ништо во главните равенки. Го дефинираме само \(\alpha\) внатре во равенките бидејќи ни е потребна моменталната вредност од \(I(t)\) за ден \(t\), фактор \(s = 0.01\);
# Python3 imports
from scipy.integrate import odeint
import numpy as np
import math
import plotly.graph_objects as go
import plotly.tools as tls
from plotly.offline import plot, iplot, init_notebook_mode
from IPython.core.display import display, HTML
init_notebook_mode(connected = True)
config={'showLink': False, 'displayModeBar': False}
def deriv(y, t, N, beta, gamma, delta, alpha_opt, rho):
S, E, I, R, D = y
def alpha(t):
return s * I/N + alpha_opt
dSdt = -beta(t) * S * I / N
dEdt = beta(t) * S * I / N - delta * E
dIdt = delta * E - (1 - alpha(t)) * gamma * I - alpha(t) * rho * I
dRdt = (1 - alpha(t)) * gamma * I
dDdt = alpha(t) * rho * I
return dSdt, dEdt, dIdt, dRdt, dDdt
N = 1_000_000
D = 4.0 # infections lasts four days
gamma = 1.0 / D
delta = 1.0 / 5.0 # incubation period of five days
R_0_start, k, x0, R_0_end = 5.0, 0.5, 50, 0.5
def logistic_R_0(t):
return (R_0_start-R_0_end) / (1 + np.exp(-k*(-t+x0))) + R_0_end
def beta(t):
return logistic_R_0(t) * gamma
alpha_by_agegroup = {"0-29": 0.01, "30-59": 0.05, "60-89": 0.2, "89+": 0.3}
proportion_of_agegroup = {"0-29": 0.1, "30-59": 0.3, "60-89": 0.4, "89+": 0.2}
s = 0.01
alpha_opt = sum(alpha_by_agegroup[i] * proportion_of_agegroup[i] for i in list(alpha_by_agegroup.keys()))
rho = 1/9 # 9 days from infection until death
S0, E0, I0, R0, D0 = N-1, 1, 0, 0, 0 # initial conditions: one exposed
t = np.linspace(0, 99, 100) # Grid of time points (in days)
y0 = S0, E0, I0, R0, D0 # Initial conditions vector
# Integrate the SIR equations over the time grid, t.
ret = odeint(deriv, y0, t, args=(N, beta, gamma, delta, alpha_opt, rho))
S, E, I, R, D = ret.T
R0 = [logistic_R_0(i) for i in range(len(t))] # to plot R_0 over time: get function values
Alpha = [s * I[i]/N + alpha_opt for i in range(len(t))] # to plot alpha over time
colors1 = ['lightslategray',] * 5
colors1[3] = '#0066CC'
colors2 = ['lightslategray',] * 5
colors2[2] = 'crimson'
alpha_by_agegroup = {"0-29": 0.01, "30-59": 0.05, "60-89": 0.2, "89+": 0.3}
proportion_of_agegroup = {"0-29": 10, "30-59": 30, "60-89": 40, "89+": 20}
data_com = []
data_1 = go.Scatter(x = t,
y = S,
mode = 'lines',
visible = True,
line=dict(color="blue",
width=2),
name = "Подлежни; <i>S(t)</i>",
hovertemplate = '<i> %{y:.0f} </i> луѓе')
data_2 = go.Scatter(x = t,
y = E,
mode = 'lines',
visible = True,
line=dict(color="#CCCC00",
width=2),
name = "Изложени; <i>E(t)</i>",
hovertemplate = '<i> %{y:.0f} </i> луѓе')
data_3 = go.Scatter(x = t,
y = I,
mode = 'lines',
visible = True,
line=dict(color="red",
width=2),
name = "Заразени; <i>I(t)</i>",
hovertemplate = '<i> %{y:.0f} </i> луѓе')
data_4 = go.Scatter(x = t,
y = R,
mode = 'lines',
visible = True,
line=dict(color="green",
width=2),
name = "Оздравени; <i>R(t)</i>",
hovertemplate = '<i> %{y:.0f} </i> луѓе')
data_5 = go.Scatter(x = t,
y = D,
visible = True,
mode = 'lines',
line=dict(color="#696969",
width=2),
name = "Починати; <i>D(t)</i>",
hovertemplate = '<i> %{y:.0f} </i> луѓе')
data_6 = go.Scatter(x = t,
y = list(S+E+I+R+D),
mode = 'lines',
visible = True,
line=dict(color="#ade6e6",
width=2,
dash="dash"),
name = "Вкупно",
hovertemplate = '<i> %{y:.0f} </i> луѓе')
data_com.append(data_1)
data_com.append(data_2)
data_com.append(data_3)
data_com.append(data_4)
data_com.append(data_5)
data_com.append(data_6)
data_R0 = [dict(visible = False,
x = t,
y = R0,
name = 'R<sub>0</sub>',
hoverinfo = "all",
hovertemplate = "%{y: .3f}",
line=dict(width=1.5,
dash = 'dash',
color = 'rgb(0, 204, 150)'),
xaxis='x2',
yaxis='y2',
showlegend = False
)]
data_alpha = [dict(visible = True,
x = t,
y = Alpha,
name = '𝛼',
hoverinfo = "all",
hovertemplate = "%{y: .4f}",
line=dict(width=1.5,
dash = 'dash',
color = 'rgb(238,144,238)'),
xaxis='x2',
yaxis='y2',
showlegend = False,
)]
data_bar_alpha = [go.Bar(
x=["0-29",
"30-59",
"60-89",
"89+"],
y=[alpha_by_agegroup["0-29"],
alpha_by_agegroup["30-59"],
alpha_by_agegroup["60-89"],
alpha_by_agegroup["89+"]],
marker_color=colors1,
hovertemplate = '%{x} група, 𝛼: %{y} ',
name = '',
xaxis='x2',
yaxis='y2',
showlegend = False,
hoverlabel = dict(bgcolor='white',
bordercolor='black'))]
data_bar_population = [go.Bar(
x=["0-29",
"30-59",
"60-89",
"89+"],
y=[proportion_of_agegroup["0-29"],
proportion_of_agegroup["30-59"],
proportion_of_agegroup["60-89"],
proportion_of_agegroup["89+"]],
marker_color=colors2,
hovertemplate = '%{x} група, %{y} %',
name = '',
xaxis='x2',
yaxis='y2',
showlegend = False,
visible = False,
hoverlabel = dict(bgcolor='white',
bordercolor='black'))]
data = data_com + data_alpha + data_R0 + data_bar_alpha + data_bar_population
# Setup the layout of the figure
layout = go.Layout(
updatemenus=[
dict(
active = 0,
x=0.2,
y=1.09,
yanchor="top",
buttons=list([
dict(label="(1) 𝛼 преку време",
method="update",
args=[{"visible": [True, True, True, True, True, True, True, False, False, False]},
{'annotations':[
dict(text="Прикажи: ",
showarrow=False,
x=0.25,
y=1.15,
yref="paper",
align="left"),
dict(x=0.15,
y=0.82,
showarrow=False,
text='𝛼 преку време',
font=dict(size=10),
xref='paper',
yref='paper'),
dict(x=0.228,
y=0.13,
showarrow=False,
text='t',
font=dict(size=10),
xref='paper',
yref='paper')],
'xaxis2': dict(range = [0,100],
tickvals = [0, 20, 40, 60, 80, 100],
linecolor='#000',
domain=[0.09, 0.38],
anchor='y2',
mirror = True,
side='bottom',
ticks='',
showline=True),
'yaxis2': dict(autorange=False,
range=[0.1558, 0.1578],
tickvals = [0.1560, 0.1562, 0.1564, 0.1566, 0.1568, 0.1570, 0.1572, 0.1574, 0.1576],
linecolor='#000',
domain=[0.25, 0.75],
anchor='x2',
mirror = True,
ticks='',
showline=True)}]),
dict(label="(2) R<sub>0</sub> преку време",
method="update",
args=[{"visible": [True, True, True, True, True, True, False, True, False, False]},
{'annotations': [
dict(text="Прикажи: ",
showarrow=False,
x=0.25,
y=1.15,
yref="paper",
align="left"),
dict(x=0.15,
y=0.82,
showarrow=False,
text='R<sub>0</sub> преку време',
font=dict(size=10),
xref='paper',
yref='paper'),
dict(x=0.228,
y=0.13,
showarrow=False,
text='t',
font=dict(size=10),
xref='paper',
yref='paper'),
dict(x=0.01,
y=0.5,
showarrow=False,
textangle = -90,
text='R<sub>0</sub>',
font=dict(size=10),
xref='paper',
yref='paper') ],
'xaxis2': dict(range = [0,100],
tickvals = [0, 20, 40, 60, 80, 100],
linecolor='#000',
domain=[0.08, 0.38],
anchor='y2',
mirror = True,
side='bottom',
ticks='',
showline=True),
'yaxis2': dict(autorange=False,
range=[0, 5.5],
tickvals = [0, 1, 2, 3, 4, 5],
linecolor='#000',
domain=[0.25, 0.75],
anchor='x2',
mirror = True,
ticks='',
showline=True)}
]) ,
dict(label="(3) 𝛼 по група",
method="update",
args=[{"visible": [True, True, True, True, True, True, False, False, True, False]},
{'annotations': [
dict(text="Прикажи: ",
showarrow=False,
x=0.25,
y=1.15,
yref="paper",
align="left"),
dict(x=0.172,
y=0.82,
showarrow=False,
text='𝛼 по група',
font=dict(size=10),
xref='paper',
yref='paper'),
dict(x=0.128,
y=0.133,
showarrow=False,
text='Возрасна група',
font=dict(size=10),
xref='paper',
yref='paper'),
dict(x=0.01,
y=0.5,
showarrow=False,
textangle = -90,
text='𝛼',
font=dict(size=10),
xref='paper',
yref='paper')],
'xaxis2': dict(autorange = True,
linecolor='#000',
domain=[0.08, 0.38],
anchor='y2',
mirror = True,
side='bottom',
ticks='',
showline=True,
tickfont = dict(size=9)),
'yaxis2': dict(autorange = True,
linecolor='#000',
domain=[0.25, 0.75],
anchor='x2',
mirror = True,
ticks='',
showline=True)}
]) ,
dict(label="(4) Популација",
method="update",
args=[{"visible": [True, True, True, True, True, True, False, False, False, True]},
{'annotations': [
dict(text="Прикажи: ",
showarrow=False,
x=0.25,
y=1.15,
yref="paper",
align="left"),
dict(x=0.077,
y=0.82,
showarrow=False,
text='Распределба на популација',
font=dict(size=10),
xref='paper',
yref='paper'),
dict(x=0.13,
y=0.133,
showarrow=False,
text='Возрасна група',
font=dict(size=10),
xref='paper',
yref='paper'),
dict(x=0.01,
y=0.5,
showarrow=False,
textangle = -90,
text='%',
font=dict(size=10),
xref='paper',
yref='paper')],
'xaxis2': dict(autorange = True,
linecolor='#000',
domain=[0.08, 0.38],
anchor='y2',
mirror = True,
side='bottom',
ticks='',
showline=True,
tickfont = dict(size=9)),
'yaxis2': dict(autorange = True,
linecolor='#000',
domain=[0.25, 0.75],
anchor='x2',
mirror = True,
ticks='',
showline=True)}
])
]),
direction="down"
)],
title = "SIERD; Повозрасно население",
title_x = 0.5,
xaxis_title='t',
annotations=[
dict(text="Прикажи: ",
showarrow=False,
x=0.25,
y=1.15,
yref="paper",
align="left"),
dict(x=0.15,
y=0.82,
showarrow=False,
text='𝛼 преку време',
font=dict(size=10),
xref='paper',
yref='paper'),
dict(x=0.228,
y=0.13,
showarrow=False,
text='t',
font=dict(size=10),
xref='paper',
yref='paper')],
xaxis=dict(range=[0,100],
mirror=False,
ticks='outside',
showline=True,
tickvals = [0, 20, 40, 60, 80, 100],
linecolor='#000',
tickfont = dict(size=11)),
yaxis_title='Број на луѓе',
yaxis=dict(range=[0,1100000],
mirror=False,
ticks='outside',
showline=True,
showspikes = True,
linecolor='#000',
tickvals = [0, 200000, 400000, 600000, 800000, 1000000],
tickfont = dict(size=11)),
xaxis2=dict(range = [0,100],
tickvals = [0, 20, 40, 60, 80, 100],
linecolor='#000',
domain=[0.09, 0.38],
anchor='y2',
mirror = True,
side='bottom',
ticks='',
showline=True),
yaxis2=dict(autorange=False,
range=[0.1558, 0.1578],
tickvals = [0.1560, 0.1562, 0.1564, 0.1566, 0.1568, 0.1570, 0.1572, 0.1574, 0.1576],
linecolor='#000',
domain=[0.25, 0.75],
anchor='x2',
mirror = True,
ticks='',
showline=True),
plot_bgcolor='#fff',
hovermode = 'x unified',
width = 700,
height = 350,
font = dict(size = 10),
margin=go.layout.Margin(l=50,
r=50,
b=60,
t=35))
# Plot function saves as html or with ipplot
fig9_2 = dict(data=data, layout=layout)
plot(fig9_2, filename = 'fig9_old.html', config = config)
display(HTML('fig9_old.html'))
Пример друг, доколку би имале помладо население:
import plotly.graph_objects as go
import plotly.tools as tls
from plotly.offline import plot, iplot, init_notebook_mode
from IPython.core.display import display, HTML
from plotly.subplots import make_subplots
init_notebook_mode(connected = True)
config={'showLink': False, 'displayModeBar': False}
colors1 = ['lightslategray',] * 5
colors1[3] = '#0066CC'
colors2 = ['lightslategray',] * 5
colors2[0] = 'crimson'
alpha_by_agegroup = {"0-29": 0.01, "30-59": 0.05, "60-89": 0.2, "89+": 0.3}
proportion_of_agegroup = {"0-29": 50, "30-59": 30, "60-89": 10, "89+": 10}
fig = make_subplots(rows=1,
cols=2,
horizontal_spacing = 0.15,
subplot_titles=("𝛼 по ворзасни групи","Распределба на население"))
fig.add_trace(
go.Bar(
x=["0-29",
"30-59",
"60-89",
"89+"],
y=[alpha_by_agegroup["0-29"],
alpha_by_agegroup["30-59"],
alpha_by_agegroup["60-89"],
alpha_by_agegroup["89+"]],
marker_color=colors1,
hovertemplate = '%{x} група, 𝛼: %{y} ',
name = '',
showlegend = False,
hoverlabel = dict(bgcolor='white',
bordercolor='black')),
row=1, col=1
)
fig.add_trace(
go.Bar(
x=["0-29",
"30-59",
"60-89",
"89+"],
y=[proportion_of_agegroup["0-29"],
proportion_of_agegroup["30-59"],
proportion_of_agegroup["60-89"],
proportion_of_agegroup["89+"]],
marker_color=colors2,
hovertemplate = '%{x} група, %{y} %',
name = '',
showlegend = False,
hoverlabel = dict(bgcolor='white',
bordercolor='black')),
row=1, col=2
)
fig.update_layout(title_text = "SIERD",
title_x = 0.5,
xaxis_title = 'Возрасна група',
xaxis=dict(mirror=False,
showline=True,
linecolor='#000',
tickfont = dict(size=11)),
yaxis_title = '𝛼',
yaxis=dict(mirror=False,
showline=True,
linecolor='#000',
tickfont = dict(size=11)),
xaxis2_title = 'Возрасна група',
xaxis2=dict(mirror=False,
showline=True,
linecolor='#000',
tickfont = dict(size=11)),
yaxis2_title = '%',
yaxis2=dict(mirror=False,
showline=True,
linecolor='#000',
tickfont = dict(size=11)),
plot_bgcolor='#fff',
hovermode = 'closest',
width = 700,
height = 350,
font = dict(size = 10),
margin=go.layout.Margin(l=50,
r=50,
b=60,
t=55))
plot(fig, filename = 'fig9_2alpha_age.html', config = config)
display(HTML('fig9_2alpha_age.html'))
Со ваква поделба би имале стапка на смрност \(\alpha<10\%\)!
За да ги искористиме овие поделби и доделување на вредности, можеме да го користиме истиот модел дефиниран погоре, за болнички ресурси со тоа што ќе го пресметување \(\alpha_{base}\) имајќи ги овие вредности.
# Python3 imports
from scipy.integrate import odeint
import numpy as np
import math
import plotly.graph_objects as go
import plotly.tools as tls
from plotly.offline import plot, iplot, init_notebook_mode
from IPython.core.display import display, HTML
init_notebook_mode(connected = True)
config={'showLink': False, 'displayModeBar': False}
def deriv(y, t, N, beta, gamma, delta, alpha_opt, rho):
S, E, I, R, D = y
def alpha(t):
return s * I/N + alpha_opt
dSdt = -beta(t) * S * I / N
dEdt = beta(t) * S * I / N - delta * E
dIdt = delta * E - (1 - alpha(t)) * gamma * I - alpha(t) * rho * I
dRdt = (1 - alpha(t)) * gamma * I
dDdt = alpha(t) * rho * I
return dSdt, dEdt, dIdt, dRdt, dDdt
N = 1_000_000
D = 4.0 # infections lasts four days
gamma = 1.0 / D
delta = 1.0 / 5.0 # incubation period of five days
R_0_start, k, x0, R_0_end = 5.0, 0.5, 50, 0.5
def logistic_R_0(t):
return (R_0_start-R_0_end) / (1 + np.exp(-k*(-t+x0))) + R_0_end
def beta(t):
return logistic_R_0(t) * gamma
alpha_by_agegroup = {"0-29": 0.01, "30-59": 0.05, "60-89": 0.2, "89+": 0.3}
proportion_of_agegroup = {"0-29": 0.4, "30-59": 0.3, "60-89": 0.2, "89+": 0.1}
s = 0.01
alpha_opt = sum(alpha_by_agegroup[i] * proportion_of_agegroup[i] for i in list(alpha_by_agegroup.keys()))
rho = 1/9 # 9 days from infection until death
S0, E0, I0, R0, D0 = N-1, 1, 0, 0, 0 # initial conditions: one exposed
t = np.linspace(0, 99, 100) # Grid of time points (in days)
y0 = S0, E0, I0, R0, D0 # Initial conditions vector
# Integrate the SIR equations over the time grid, t.
ret = odeint(deriv, y0, t, args=(N, beta, gamma, delta, alpha_opt, rho))
S, E, I, R, D = ret.T
R0 = [logistic_R_0(i) for i in range(len(t))] # to plot R_0 over time: get function values
Alpha = [s * I[i]/N + alpha_opt for i in range(len(t))] # to plot alpha over time
colors1 = ['lightslategray',] * 5
colors1[3] = '#0066CC'
colors2 = ['lightslategray',] * 5
colors2[0] = 'crimson'
alpha_by_agegroup = {"0-29": 0.01, "30-59": 0.05, "60-89": 0.2, "89+": 0.3}
proportion_of_agegroup = {"0-29": 40, "30-59": 30, "60-89": 20, "89+": 10}
data_com = []
data_1 = go.Scatter(x = t,
y = S,
mode = 'lines',
visible = True,
line=dict(color="blue",
width=2),
name = "Подлежни; <i>S(t)</i>",
hovertemplate = '<i> %{y:.0f} </i> луѓе')
data_2 = go.Scatter(x = t,
y = E,
mode = 'lines',
visible = True,
line=dict(color="#CCCC00",
width=2),
name = "Изложени; <i>E(t)</i>",
hovertemplate = '<i> %{y:.0f} </i> луѓе')
data_3 = go.Scatter(x = t,
y = I,
mode = 'lines',
visible = True,
line=dict(color="red",
width=2),
name = "Заразени; <i>I(t)</i>",
hovertemplate = '<i> %{y:.0f} </i> луѓе')
data_4 = go.Scatter(x = t,
y = R,
mode = 'lines',
visible = True,
line=dict(color="green",
width=2),
name = "Оздравени; <i>R(t)</i>",
hovertemplate = '<i> %{y:.0f} </i> луѓе')
data_5 = go.Scatter(x = t,
y = D,
visible = True,
mode = 'lines',
line=dict(color="#696969",
width=2),
name = "Починати; <i>D(t)</i>",
hovertemplate = '<i> %{y:.0f} </i> луѓе')
data_6 = go.Scatter(x = t,
y = list(S+E+I+R+D),
mode = 'lines',
visible = True,
line=dict(color="#ade6e6",
width=2,
dash="dash"),
name = "Вкупно",
hovertemplate = '<i> %{y:.0f} </i> луѓе')
data_com.append(data_1)
data_com.append(data_2)
data_com.append(data_3)
data_com.append(data_4)
data_com.append(data_5)
data_com.append(data_6)
data_R0 = [dict(visible = False,
x = t,
y = R0,
name = 'R<sub>0</sub>',
hoverinfo = "all",
hovertemplate = "%{y: .3f}",
line=dict(width = 1.5,
dash = 'dash',
color = 'rgb(0, 204, 150)'),
xaxis='x2',
yaxis='y2',
showlegend = False
)]
data_alpha = [dict(visible = True,
x = t,
y = Alpha,
name = '𝛼',
hoverinfo = "all",
hovertemplate = "%{y: .4f}",
line=dict(width=1.5,
dash = 'dash',
color = 'rgb(238,144,238)'),
xaxis='x2',
yaxis='y2',
showlegend = False,
)]
data_bar_alpha = [go.Bar(
x=["0-29",
"30-59",
"60-89",
"89+"],
y=[alpha_by_agegroup["0-29"],
alpha_by_agegroup["30-59"],
alpha_by_agegroup["60-89"],
alpha_by_agegroup["89+"]],
marker_color=colors1,
hovertemplate = '%{x} група, 𝛼: %{y} ',
name = '',
xaxis='x2',
yaxis='y2',
showlegend = False,
hoverlabel = dict(bgcolor='white',
bordercolor='black'))]
data_bar_population = [go.Bar(
x=["0-29",
"30-59",
"60-89",
"89+"],
y=[proportion_of_agegroup["0-29"],
proportion_of_agegroup["30-59"],
proportion_of_agegroup["60-89"],
proportion_of_agegroup["89+"]],
marker_color=colors2,
hovertemplate = '%{x} група, %{y} %',
name = '',
xaxis='x2',
yaxis='y2',
showlegend = False,
visible = False,
hoverlabel = dict(bgcolor='white',
bordercolor='black'))]
data = data_com + data_alpha + data_R0 + data_bar_alpha + data_bar_population
# Setup the layout of the figure
layout = go.Layout(
updatemenus=[
dict(
active = 0,
x=0.2,
y=1.09,
yanchor="top",
buttons=list([
dict(label="(1) 𝛼 преку време",
method="update",
args=[{"visible": [True, True, True, True, True, True, True, False, False, False]},
{'annotations':[
dict(text="Прикажи: ",
showarrow=False,
x=0.25,
y=1.15,
yref="paper",
align="left"),
dict(x=0.15,
y=0.82,
showarrow=False,
text='𝛼 преку време',
font=dict(size=10),
xref='paper',
yref='paper'),
dict(x=0.228,
y=0.13,
showarrow=False,
text='t',
font=dict(size=10),
xref='paper',
yref='paper')],
'xaxis2': dict(range = [0,100],
tickvals = [0, 20, 40, 60, 80, 100],
linecolor='#000',
domain=[0.09, 0.38],
anchor='y2',
mirror = True,
side='bottom',
ticks='',
showline=True),
'yaxis2': dict(autorange=False,
range=[0.0890, 0.0905],
tickvals = [0.0890, 0.0892, 0.0894, 0.0896, 0.0898, 0.0900, 0.0902, 0.0904],
linecolor='#000',
domain=[0.25, 0.75],
anchor='x2',
mirror = True,
ticks='',
showline=True)}]),
dict(label="(2) R<sub>0</sub> преку време",
method="update",
args=[{"visible": [True, True, True, True, True, True, False, True, False, False]},
{'annotations': [
dict(text="Прикажи: ",
showarrow=False,
x=0.25,
y=1.15,
yref="paper",
align="left"),
dict(x=0.15,
y=0.82,
showarrow=False,
text='R<sub>0</sub> преку време',
font=dict(size=10),
xref='paper',
yref='paper'),
dict(x=0.228,
y=0.13,
showarrow=False,
text='t',
font=dict(size=10),
xref='paper',
yref='paper'),
dict(x=0.01,
y=0.5,
showarrow=False,
textangle = -90,
text='R<sub>0</sub>',
font=dict(size=10),
xref='paper',
yref='paper') ],
'xaxis2': dict(range = [0,100],
tickvals = [0, 20, 40, 60, 80, 100],
linecolor='#000',
domain=[0.08, 0.38],
anchor='y2',
mirror = True,
side='bottom',
ticks='',
showline=True),
'yaxis2': dict(autorange=False,
range=[0, 5.5],
tickvals = [0, 1, 2, 3, 4, 5],
linecolor='#000',
domain=[0.25, 0.75],
anchor='x2',
mirror = True,
ticks='',
showline=True)}
]) ,
dict(label="(3) 𝛼 по група",
method="update",
args=[{"visible": [True, True, True, True, True, True, False, False, True, False]},
{'annotations': [
dict(text="Прикажи: ",
showarrow=False,
x=0.25,
y=1.15,
yref="paper",
align="left"),
dict(x=0.172,
y=0.82,
showarrow=False,
text='𝛼 по група',
font=dict(size=10),
xref='paper',
yref='paper'),
dict(x=0.128,
y=0.133,
showarrow=False,
text='Возрасна група',
font=dict(size=10),
xref='paper',
yref='paper'),
dict(x=0.01,
y=0.5,
showarrow=False,
textangle = -90,
text='𝛼',
font=dict(size=10),
xref='paper',
yref='paper')],
'xaxis2': dict(autorange = True,
linecolor='#000',
domain=[0.08, 0.38],
anchor='y2',
mirror = True,
side='bottom',
ticks='',
showline=True,
tickfont = dict(size=9)),
'yaxis2': dict(autorange = True,
linecolor='#000',
domain=[0.25, 0.75],
anchor='x2',
mirror = True,
ticks='',
showline=True)}
]) ,
dict(label="(4) Популација",
method="update",
args=[{"visible": [True, True, True, True, True, True, False, False, False, True]},
{'annotations': [
dict(text="Прикажи: ",
showarrow=False,
x=0.25,
y=1.15,
yref="paper",
align="left"),
dict(x=0.077,
y=0.82,
showarrow=False,
text='Распределба на популација',
font=dict(size=10),
xref='paper',
yref='paper'),
dict(x=0.13,
y=0.133,
showarrow=False,
text='Возрасна група',
font=dict(size=10),
xref='paper',
yref='paper'),
dict(x=0.01,
y=0.5,
showarrow=False,
textangle = -90,
text='%',
font=dict(size=10),
xref='paper',
yref='paper')],
'xaxis2': dict(autorange = True,
linecolor='#000',
domain=[0.08, 0.38],
anchor='y2',
mirror = True,
side='bottom',
ticks='',
showline=True,
tickfont = dict(size=9)),
'yaxis2': dict(autorange = True,
linecolor='#000',
domain=[0.25, 0.75],
anchor='x2',
mirror = True,
ticks='',
showline=True)}
])
]),
direction="down"
)],
title = "SIERD; Помладо население",
title_x = 0.5,
xaxis_title='t',
annotations=[
dict(text="Прикажи: ",
showarrow=False,
x=0.25,
y=1.15,
yref="paper",
align="left"),
dict(x=0.15,
y=0.82,
showarrow=False,
text='𝛼 преку време',
font=dict(size=10),
xref='paper',
yref='paper'),
dict(x=0.228,
y=0.13,
showarrow=False,
text='t',
font=dict(size=10),
xref='paper',
yref='paper')],
xaxis=dict(range=[0,100],
mirror=False,
ticks='outside',
showline=True,
tickvals = [0, 20, 40, 60, 80, 100],
linecolor='#000',
tickfont = dict(size=11)),
yaxis_title='Број на луѓе',
yaxis=dict(range=[0,1100000],
mirror=False,
ticks='outside',
showline=True,
showspikes = True,
linecolor='#000',
tickvals = [0, 200000, 400000, 600000, 800000, 1000000],
tickfont = dict(size=11)),
xaxis2=dict(range = [0,100],
tickvals = [0, 20, 40, 60, 80, 100],
linecolor='#000',
domain=[0.09, 0.38],
anchor='y2',
mirror = True,
side='bottom',
ticks='',
showline=True),
yaxis2=dict(autorange=False,
range=[0.0890, 0.0905],
tickvals = [0.0890, 0.0892, 0.0894, 0.0896, 0.0898, 0.0900, 0.0902, 0.0904],
linecolor='#000',
domain=[0.25, 0.75],
anchor='x2',
mirror = True,
ticks='',
showline=True),
plot_bgcolor='#fff',
hovermode = 'x unified',
width = 700,
height = 350,
font = dict(size = 10),
margin=go.layout.Margin(l=50,
r=50,
b=60,
t=35))
# Plot function saves as html or with ipplot
fig9_4 = dict(data=data, layout=layout)
plot(fig9_4, filename = 'fig9_young.html', config = config)
display(HTML('fig9_young.html'))
Имплементациите до сега ни дозволуваат да дизајнираме некои поедноставни SIR модели што би се приближиле до некои реални сценарија. Со појавата на COVID-19 вирусот информациите за ваквите модели се зачестија меѓутоа некои статии/трудови се доста комплексни гледајќи дека е игра со модели.