In [1]:
%matplotlib inline
import ABCPRC as prc
import numpy as np
import scipy.stats as stats
import matplotlib.pyplot as plt
In [2]:
def ibm(*ps):
m0,k = ps[0],ps[1]
T0 = 0.5
#measurements in regular increments throughout the year
ms,ts = np.zeros(100),np.linspace(0,1,100)
ms = (m0/2)*(np.sin(np.pi/2 + (ts-T0)*2*np.pi)+1)
ps = k/(k+ms)
outs = np.array([stats.nbinom(n=k,p=p).rvs() if p>0 else 0 for m,p in zip(ms,ps)])
return outs
In [3]:
m0,k = 50.0,1.0
xs = ibm(m0,k)
plt.plot(xs,'ko')
Out[3]:
In [4]:
#measurements in regular increments throughout the year
ms,ts = np.zeros(100),np.linspace(0,1,100)
ms = (m0/2)*(np.sin(np.pi/2 + (ts-0.5)*2*np.pi)+1)
plt.plot(ts,ms)
plt.ylabel('rate')
plt.xlabel('time (yrs)')
Out[4]:
In [5]:
m = prc.ABC()
In [6]:
priors = [stats.expon(scale=100.0).rvs,stats.expon(scale=0.5).rvs]
m.setup(modelFunc=ibm,xs=xs,priors=priors)
In [7]:
m.fit(sample_size=100)
Out[7]:
In [8]:
m.run(1000)
In [9]:
res = m.trace()
plt.figure()
print('Initial Distribution')
m.trace(plot=True,tol=0)
In [10]:
plt.figure()
print('Middle Tolerance')
m.trace(plot=True,tol=5)
In [11]:
plt.figure()
print('Final Distribution')
m.trace(plot=True,tol=-1)
In [12]:
ps = np.round(m.paramMAP(),decimals=2)
print('MAP for max rate is : {}, MAP for heterogeneity is {}'.format(*ps))
res = m.fitSummary()
It slightly underestimates heterogeneity, but is close for max rate
In [13]:
m.save('ecology_model_example')