我是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
的连续值。
答案 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)。
实际上,不清楚上述模型的第一部分是什么,具体来说,为什么要为预测变量建立模型,但也许我遗漏了一些东西。