直接观察开关结果的Pymc3模型

时间:2018-11-10 17:07:07

标签: python-3.x pymc3

我刚刚开始学习pymc3,所以我可能会完全以错误的方式来思考。

假设我们观察到一个由10个布尔值组成的向量。

感兴趣的过程生成(观察到的)具有参数theta1的伯努利分布的布尔值。因此,我先定义了theta1之前的Beta,然后定义了一个长度为10的变量,该变量是Bernoulli(theta1)的样本。

但是,有时会以theta2的概率将真实数据切换为0,从而扰乱了这个真实样本。因此,我将伯努利(theta2)的概率定义为0。

开关值是观察值。我不确定如何告诉模型我观察到了切换变量,即我不确定如何使模型适合观察到的数据。

这是我现在拥有的东西,我有点卡住:

# observed data (already switched)
observed_data = np.random.binomial(1, 0.5, size=10)

with pm.Model() as skeptic_model:
    # uniform probability of the bernoulli parameter
    true_model_prior = pm.Beta("true_model_prior", 1, 1)
    true_data = pm.Bernoulli("true_data", p=true_model_prior, shape=data.shape)
    disturbed_data = pm.math.switch(pm.Bernoulli("disturbed", 0.1), true_data, 0)

1 个答案:

答案 0 :(得分:1)

您的模型可以重组为Bernoulli随机变量的乘积,因此可以重组为具有乘法p的单个Bernoulli随机变量。即,以下模型与您的模型等效:

# observed data (already considered zero-inflated)
Y = np.random.binomial(1, 0.5, size=10)

with pm.Model() as zero_inflated_beta_bernoulli:
    # true_model_prior
    p = pm.Beta('p', alpha=1, beta=1)

    # dropout rate
    d = 0.1

    # disturbed_data;
    y = pm.Bernoulli('y', p = (1-d)*p, observed=Y)

您可以让辍学率也是一个随机变量,

# dropout rate
d = pm.Beta('d', mu=0.1, sd=0.02)

但是,应该指出的是,该模型实际上无法区分辍学率和原始结果,因此后代对先验敏感。