我是PyMC3的新手,我正在尝试将交换机模型作为示例代码。 但是,在我的数据中,我没有计数为泊松分布的数据。
相反,我对10位个体的身长进行了一些测量,从年龄= 1到年龄= 10,性别为M和F。 我想计算每种性别的转换点,分别说明非池化个人级别和池化人口级别。
我尝试了以下代码。我应该如何合并“性别”列,任何人都可以帮助查看是否有任何问题?谢谢!
我的数据如下所示: df:
Individual Age Body_length Sex
Tom 1 150 M
Tom 2 155 M
Tom 3 160 M
Tom 4 161 M
Mary 1 140 F
Mary 2 145 F
Mary 3 145 F
Mary 4 146 F
with pm.Model() as growth_model:
sigma = pm.HalfCauchy('sigma', beta=10, testval=1.)
switchpoint = pm.Uniform('switchpoint', lower=df.Age.min(), upper=df.Age.max(), testval=3.)
# Priors for pre- and post-switch intercepts and slopes
intercept_u1 = pm.Uniform('Intercept_u1', lower=-10, upper=20)
intercept_u2 = pm.Uniform('Intercept_u2', lower=-10, upper=20)
x_coeff_u1 = pm.Normal('x_u1', 0, sd=20)
x_coeff_u2 = pm.Normal('x_u2', 0, sd=20)
intercept = pm.math.switch(switchpoint < df.Age, intercept_u1, intercept_u2)
x_coeff = pm.math.switch(switchpoint < df.Age, x_coeff_u1, x_coeff_u2)
likelihood = pm.Normal('y', mu=intercept + x_coeff * df.Age, sd=sigma, observed=df.body_length)
start = pm.find_MAP()
with growth_model:
step1 = pm.NUTS([intercept_u1, intercept_u2, x_coeff_u1, x_coeff_u2])
step2 = pm.NUTS([switchpoint])
burned_trace = trace[5000:]
trace = pm.sample(20000, step=[step1, step2], start=start, progressbar=True)
p.s。另外,我应该只使用以下内容吗?以及如何将性别和个人水平纳入模型?
with pm.Model() as rate_model:
switchpoint = pm.Uniform('switchpoint',lower=df.Age.min(),upper=df.Age.max())
early_rate = pm.Exponential('early_rate',1)
late_rate = pm.Exponential('late_rate',1)
rate = pm.math.switch(switchpoint >= df.Age, early_rate, late_rate)
with rate_model:
weaning = pm.Exponential('weaning',rate,observed = df.body_length)
with rate_model:
trace = pm.sample(2000)