In [4]:
import numpy as np
import scipy.stats as stats
import matplotlib.pyplot as plt
%matplotlib inline  
from __future__ import print_function

In [235]:
# Declaration
Nephropathy = ['A', 'B', 'C']
Neuropathy = ['1', '2', '3']

In [250]:
class Model(object):
    """A general model class"""
    def __init__(self, states, parameters=None, submodels=None):
        # States should be a dictionary for the different states
        self.states = states
        # Make to types of states: Discrete states and continuous states
        self.parameters = parameters
        self.time = []
        self.submodels = submodels
        
    def rhs(self, state, time):
        P = self.parameters["P"]
        return P
    
    def update(self, state, time):
        # Update all submodels
        if self.submodels:
            self.submodels.update(self.submodels.states, time)
        
        # Make this somehow into a loop over all states going through a dictionary of functions
        # A1c state
        currentstate = self.states["A1c"][-1]
        newstate = currentstate + 0.01*np.random.random_sample()
        self.states["A1c"].append(newstate)
        
        # Nephropathy
        currentstate = self.states["Nephropathy"][-1]
        newstate = np.random.choice(Nephropathy, None, p=self.rhs(currentstate, time)[Nephropathy.index(currentstate),:])
        self.states["Nephropathy"].append(newstate)
        
        # Time step
        self.time.append(time)

In [251]:
# Simulate Model
def simulate(model, tspan):
    for t in tspan:
        model.update(model.states, t)

In [ ]:


In [259]:
parameters = {"P" : np.array([[0.9, 0.1, 0],[0, 0.8, 0.2],[0.01, 0, 0.99]])}
states = {
    "Nephropathy": [np.random.choice(Nephropathy)],
    "A1c"        : [0.05]
    }
substates = {
    "Nephropathy": [np.random.choice(Nephropathy)],
    "A1c"        : [0.05]
    }

submodel = Model(substates,parameters)
model = Model(states,parameters,submodel)

simulate(model, range(100))

print(model.submodels.states)
print(model.states)


{'A1c': [0.05, 0.05669507467093344, 0.06519281905145284, 0.06615860670386503, 0.07523640084365837, 0.08384454892704324, 0.08488695856225871, 0.09154453316124914, 0.09560180847634502, 0.10030935595040656, 0.10095333468235797, 0.10771577759644284, 0.11547998756373787, 0.12361739331832103, 0.12422587538877546, 0.13314582839253622, 0.14008713595161557, 0.1436773257482252, 0.15218068699037993, 0.15223243894316105, 0.16178423652933585, 0.168551808915684, 0.17158552866779161, 0.17972149601662213, 0.1867244148838939, 0.19259125334672172, 0.19538812063540215, 0.19951523351843883, 0.2058539320272171, 0.20832467004136154, 0.21444905959944888, 0.21753539733971153, 0.22733923835835715, 0.2274718989990434, 0.23623108861283268, 0.23793087835601376, 0.24234021779666334, 0.2429353302301125, 0.24694893857397598, 0.251657173943307, 0.25791346915990576, 0.25802071733239335, 0.2628392513549057, 0.2714305893553559, 0.27511288046830257, 0.28028551898271126, 0.28341414277734445, 0.2861008254854346, 0.29307457653732283, 0.2997650822221154, 0.30520732090263325, 0.3057190741322252, 0.3130825872004608, 0.3223846057396895, 0.32923603948547586, 0.3348908594080083, 0.3435698617886813, 0.35270326102183414, 0.35987825546375035, 0.36219891443910607, 0.36794667670499254, 0.3728651619864814, 0.3759595637949666, 0.37866688387738384, 0.3851334835896769, 0.3866807899911092, 0.3928159150444849, 0.3937873518847998, 0.40343195107853524, 0.40685565849526684, 0.4082389070636598, 0.4120804824774259, 0.420301138372871, 0.4272053241362952, 0.4294007013586141, 0.4392387443727052, 0.44733887492698654, 0.4500790811478313, 0.4514412296780484, 0.45895210316456236, 0.467856165321037, 0.47773591647754216, 0.4847693138764687, 0.48954340763251303, 0.4972699319187056, 0.5040758805378333, 0.5055530996793649, 0.506399891528658, 0.5075287595147465, 0.5075723290036087, 0.5103969707731196, 0.5120981050089446, 0.5180662581945802, 0.524166483117753, 0.528035460360312, 0.5348141182622851, 0.5382864698256271, 0.5421376655043454, 0.5505271902781069, 0.5582086688335559, 0.5630677776881319], 'Nephropathy': ['B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C']}
{'A1c': [0.05, 0.05579471731874421, 0.06413481512971474, 0.06595360351595703, 0.06751620847580027, 0.07248096810040418, 0.0821328675868386, 0.08620269506358688, 0.0915632712603356, 0.09627966186745006, 0.10080255573766049, 0.10475932939351196, 0.11054084405206283, 0.11499381917968785, 0.12240755405596675, 0.12832396677249092, 0.13006691603577145, 0.13152064205001573, 0.1405048598485938, 0.14576355804000427, 0.15214179644016054, 0.15422046956248048, 0.1620617925755828, 0.16543538745953534, 0.17489156410822138, 0.1809566355617497, 0.19027690226674732, 0.1910665299361135, 0.20053768078580028, 0.2041020854986646, 0.20790921113780148, 0.2149529330125928, 0.22168511606048782, 0.22425162203736096, 0.23070330715590198, 0.2388038693829399, 0.24178514545792076, 0.24446680237380006, 0.2511513025967661, 0.2557282257913807, 0.26263347701752815, 0.2659108021189551, 0.2743845671520185, 0.2810154212597566, 0.2862321966150271, 0.29263339468108435, 0.3008334319313002, 0.30590704834403915, 0.3144846302654343, 0.3243007652885504, 0.332565546405943, 0.3356356191115523, 0.3400131077227642, 0.3416019242632807, 0.3507633931483495, 0.3585130244923651, 0.36281026127957866, 0.36876070696722757, 0.3718764594143131, 0.37240708526051436, 0.37815491881983776, 0.3798206107471422, 0.3821399834453309, 0.3822093808835207, 0.38748262254300203, 0.3901284852491836, 0.3935889810500502, 0.3969049146784524, 0.40649476283166247, 0.41512974987578477, 0.42207237648046686, 0.4251192434292352, 0.4257780546325924, 0.4260466401746583, 0.42812395387042, 0.435183226488375, 0.4406000538714471, 0.44893186139567565, 0.44907927762318284, 0.45699645122866933, 0.4648830222031329, 0.4711908471099772, 0.4754665853174934, 0.48495594785876944, 0.49087685999313313, 0.4950254585549851, 0.49852330352027524, 0.5079774989656843, 0.5117950771244562, 0.5139257471187081, 0.5140999082467321, 0.5217382840859004, 0.5238051908956861, 0.5304624427658936, 0.5311400965585549, 0.5324669221739249, 0.541891989079261, 0.5425418093779988, 0.5523419081313343, 0.5601185801571823, 0.5602052979094659], 'Nephropathy': ['B', 'B', 'C', 'C', 'C', 'C', 'C', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'C', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'C']}

In [263]:
# Simulate Cohort
tspan = range(100)
cohort = []

for i in range(100):
    # Initialize
    states = {
        "Nephropathy": [np.random.choice(Nephropathy)],
        "A1c"        : [0.05]
        }    
    substates = {
        "Nephropathy": [np.random.choice(Nephropathy)],
        "A1c"        : [0.05]
        }

    submodel = Model(substates,parameters)
    
    cohort.append(Model(states,parameters,submodel))
    # Simulate
    simulate(cohort[-1],tspan)

# Output    
print(len(cohort),cohort[1].states)


100 {'A1c': [0.05, 0.05212844926198338, 0.05219767886548339, 0.06215156578922244, 0.06714516732316772, 0.07452779235089671, 0.08389272474845477, 0.0865911045971642, 0.09532324414881146, 0.0983894383696849, 0.10249157476223575, 0.10368438043937879, 0.10652655358685871, 0.11260223312627743, 0.11593943459931125, 0.11697476068766673, 0.12398194780747888, 0.12603346072082752, 0.13001526103457484, 0.13513849128622732, 0.13721569620644486, 0.14388205869630355, 0.14460606383032623, 0.15215930679110323, 0.1525993907788763, 0.16212881968908247, 0.17065771279232628, 0.17313138449873341, 0.17332263631623485, 0.17451550529905843, 0.18431956482887268, 0.19059884122122472, 0.19331033070770454, 0.19471576161287013, 0.1978307679301397, 0.199826010728662, 0.20400425268110564, 0.20568290559754987, 0.20647621026803786, 0.21078296893101442, 0.21712622887786298, 0.22503133336283535, 0.22809908913734847, 0.23791854481983252, 0.24136616107468797, 0.24555318661046857, 0.24815637530128346, 0.251910628618744, 0.26180573462924966, 0.2680488618183707, 0.27348711536474074, 0.2774900631276307, 0.2783356598109075, 0.2813814126676068, 0.28901965610982944, 0.2946822140223188, 0.3039042460775658, 0.3101305741045382, 0.31421516613579237, 0.31726663514419146, 0.3192002698978045, 0.3259254625356856, 0.33200431254800516, 0.3394762076260156, 0.3442225524718992, 0.3445869298462969, 0.3514502928967176, 0.35524750928702553, 0.36120763266780703, 0.36901254718417736, 0.37551728823923736, 0.3760437146094116, 0.3857461623040184, 0.38802413741485065, 0.39560541915354813, 0.39619203684310567, 0.3993077246082719, 0.4026466582897898, 0.4058549247452211, 0.41242180082907975, 0.41377269608584866, 0.4203961845914733, 0.42791573734241173, 0.4337303822296322, 0.4420550927867459, 0.4503581825028219, 0.45304690163802996, 0.46000478301409814, 0.4605881091756412, 0.46065088170729185, 0.46346163908136384, 0.4729991503664355, 0.4789079544017381, 0.4808245707157615, 0.4856646020464825, 0.4891095614292005, 0.49351457667251664, 0.5023154760035988, 0.5034017743902524, 0.5086941275270215, 0.5097116122947332], 'Nephropathy': ['A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B']}

Inheritance


In [ ]:


In [29]:
P = np.array([[0.9, 0.1, 0],[0, 0.8, 0.2],[0.01, 0, 0.99]])
x=[]
x.append(0)
for i in range(100):
    x.append(np.random.choice([0, 1 ,2], 1, p=P[x[i],:])[0])
print(x)
plt.hist(x)


[0, 0, 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]
Out[29]:
(array([  6.,   0.,   0.,   0.,   0.,   1.,   0.,   0.,   0.,  94.]),
 array([ 0. ,  0.2,  0.4,  0.6,  0.8,  1. ,  1.2,  1.4,  1.6,  1.8,  2. ]),
 <a list of 10 Patch objects>)

In [6]:


In [ ]: