具有PyMC中观察到的数据的连续父和离散子条件

时间:2014-12-22 17:48:46

标签: probability pymc

我是PyMC的新手并尝试设置简单的条件概率模型:P(has_diabetes|bmi, race)。 Race可以采用编码为0-4的5个离散值,BMI可以采用非零正实数。到目前为止,我的父变量设置如下:

p_race = [0.009149232914923292,
          0.15656903765690378,
          0.019637377963737795,
          0.013947001394700141,
          0.800697350069735]
race = pymc.Categorical('race', p_race)

bmi_alpha = pymc.Exponential('bmi_alpha', 1)
bmi_beta = pymc.Exponential('bmi_beta', 1)
bmi = pymc.Gamma('bmi', bmi_alpha, bmi_beta, value=bmis, observed=True)

我观察到的数据如下:

  

| bmi |比赛| has_diabetes |
  | 21.7 | 1 | 0 |
  | 45.3 | 4 | 1 |
  | 18.9 | 2 | 0 |
  | 26.6 | 0 | 0 |
  | 35.1 | 4 | 0 |

我正在尝试将has_diabetes建模为:

has_diabetes = pymc.Bernoulli('has_diabetes', p_diabetes, value=data, observed=True)

我的问题是我不确定如何构建p_diabetes函数,因为它取决于race的值和bmi的连续值。

1 个答案:

答案 0 :(得分:2)

您需要构建一个确定性函数,根据预测变量生成p_diabetes。最安全的方法是通过logit-linear转换。例如:

intercept = pymc.Normal('intercept', 0, 0.01, value=0)
beta_race = pymc.Normal('beta_race', 0, 0.01, value=np.zeros(4))
beta_bmi = pymc.Normal('beta_bmi', 0, 0.01, value=0)

@pymc.deterministic
def p_diabetes(b0=intercept, b1=beta_race, b2=beta_bmi):

    # Prepend a zero for baseline
    b1 = np.append(0, b1)

    # Logit-linear model
    return pymc.invlogit(b0 + b1[race] + b2*bmi)

我会让基线竞赛成为最大的一组(在本例中假设它是指数0)。

实际上,不清楚上述模型的第一部分是什么,具体来说,为什么要为预测变量建立模型,但也许我遗漏了一些东西。