PyMC3:合并和不合并增长率转换点

时间:2018-12-24 05:23:32

标签: python pymc3

我是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)

0 个答案:

没有答案
相关问题