In DisMod-II there was a requirement to have at least three different data types, corresponding to different parts of the compartmental model. DisMod-MR can run a compartmental model with only two, or even one data type, but this requires expert priors to fill in the gaps.
This document provides an example of how a model for Parkinson's Disease might look with different subsets of data types.
In [1]:
import matplotlib.pyplot as plt, numpy as np
import dismod_mr
In [2]:
models = {}
#iter=101; burn=0; thin=1 # use these settings to run faster
iter=10_000; burn=5_000; thin=5 # use these settings to make sure MCMC converges
In [3]:
model = dismod_mr.load('pd_sim_data/')
model.keep(areas=['GBR'], sexes=['female', 'total'])
In [4]:
model.setup_model()
%time model.fit(iter=iter, burn=burn, thin=thin)
In [5]:
models['p, i, r, smr'] = model
model.plot()
In [6]:
models
Out[6]:
In [7]:
model = dismod_mr.load('pd_sim_data/')
model.keep(areas=['GBR'], sexes=['female', 'total'])
model.input_data = model.input_data[model.input_data.data_type != 'i']
print('kept %d rows' % len(model.input_data.index))
In [8]:
model.setup_model()
%time model.fit(iter=iter, burn=burn, thin=thin)
In [9]:
models['p, r, smr'] = model
model.plot()
This uses only prevalence data and the assumption that there is no remission, so it is not valid in DisMod-II. The Bayesian priors included by default in DisMod-MR make it possible, but the tradeoff between incidence and mortality is not informed by any data in this case.
In [10]:
model = dismod_mr.load('pd_sim_data/')
model.keep(areas=['GBR'], sexes=['female', 'total'])
model.input_data = model.input_data[model.input_data.data_type == 'p']
print('kept %d rows' % len(model.input_data.index))
In [11]:
model.setup_model()
%time model.fit(iter=iter, burn=burn, thin=thin)
In [12]:
# the above took 20 minutes in 2013
In [13]:
models['p, r'] = model
model.plot()
In [14]:
model = dismod_mr.load('pd_sim_data/')
model.keep(areas=['GBR'], sexes=['female', 'total'])
model.input_data = model.input_data[model.input_data.data_type == 'p']
print('kept %d rows' % len(model.input_data.index))
model.set_level_bounds('r', 0., 1.)
model.set_level_value('r', age_before=0., age_after=101., value=0)
In [15]:
model.setup_model()
%time model.fit(iter=iter, burn=burn, thin=thin)
In [16]:
models['p'] = model
model.plot()
In [17]:
for i, (label, model) in enumerate(models.items()):
plt.hist(model.vars['p']['mu_age'].trace().mean(1), density=True, histtype='step',
color=dismod_mr.plot.colors[i%4], linewidth=3, linestyle=['solid','dashed'][i//4],
label=label)
plt.legend(loc=(1.1,.1))
plt.title('Posterior Distribution Comparison\nCrude Prevalence');
In [18]:
for i, (label, model) in enumerate(models.items()):
plt.hist(model.vars['i']['mu_age'].trace().mean(1), density=True, histtype='step',
color=dismod_mr.plot.colors[i%4], linewidth=3, linestyle=['solid','dashed'][i//4],
label=label)
plt.legend(loc=(1.1,.1))
plt.title('Posterior Distribution Comparison\nCrude Incidence');
In [19]:
model = dismod_mr.load('pd_sim_data/')
model.keep(areas=['GBR'], sexes=['female', 'total'])
model.input_data = model.input_data[model.input_data.data_type != 'p']
print('kept %d rows' % len(model.input_data.index))
model.setup_model()
In [20]:
%time model.fit(iter=iter, burn=burn, thin=thin)
In [21]:
models['i, r, smr'] = model
model.plot()
In [22]:
model = dismod_mr.load('pd_sim_data/')
model.keep(areas=['GBR'], sexes=['female', 'total'])
model.input_data = model.input_data[model.input_data.data_type == 'i']
print('kept %d rows' % len(model.input_data.index))
model.set_level_bounds('r', 0., 1.)
model.setup_model()
In [23]:
%time model.fit(iter=iter, burn=burn, thin=thin)
In [24]:
models['i'] = model
model.plot()
In [25]:
model = dismod_mr.load('pd_sim_data/')
model.keep(areas=['GBR'], sexes=['female', 'total'])
model.input_data = model.input_data[model.input_data.data_type == 'smr']
print('kept %d rows' % len(model.input_data.index))
model.setup_model()
In [26]:
%time model.fit(iter=iter, burn=burn, thin=thin)
In [27]:
models['r, smr'] = model
model.plot()
In [28]:
for i, label in enumerate(['p', 'i, r, smr', 'i', 'r, smr']):
try:
plt.hist(models[label].vars['p']['mu_age'].trace().mean(1), density=False, histtype='step',
color=dismod_mr.plot.colors[i%4], linewidth=3, linestyle=['solid','dashed'][i//4],
label=label)
except AttributeError as e:
print(e)
plt.legend(loc=(1.1,.1))
plt.title('Posterior Distribution Comparison\nCrude Prevalence')
plt.axis(xmin=-.001);
In [29]:
!date