【问题标题】:Continous Parent and Discrete Child Conditional with Observed Data in PyMCPyMC 中具有观察数据的连续父和离散子条件
【发布时间】:2015-01-01 01:50:05
【问题描述】:

我是 PyMC 的新手,正在尝试建立简单的条件概率模型:P(has_diabetes|bmi, race)。 Race 可以采用 5 个离散值,编码为 0-4,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)

我观察到的数据如下:

|体重指数 |种族 |有糖尿病|
| 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 的连续值。

【问题讨论】:

    标签: probability pymc


    【解决方案1】:

    您需要构建一个确定性函数,生成 p_diabetes 作为您的预测变量的函数。最安全的方法是通过对数线性变换。例如:

    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)。

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

    【讨论】:

    • 感谢您的回复。我确实有一个关于 logit 线性模型的快速问题。为什么要有基线比赛而不是从正常情况中采样比赛线性因子,即有beta_race = pymc.Normal('beta_race', 0, 0.01, value=np.zeros(5))
    • 这是另一种参数化。确实,您可以简单地为每个种族设置一个单独的拦截,如果每个种族组内的计数相似,这很有效。通常,一场比赛比其他比赛更频繁,在这种情况下,我的参数化往往会更好。
    • 有道理。谢谢!
    猜你喜欢
    • 2022-10-07
    • 1970-01-01
    • 2023-01-24
    • 2014-12-11
    • 1970-01-01
    • 2019-03-26
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    相关资源
    最近更新 更多