我刚刚开始学习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)
答案 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)
但是,应该指出的是,该模型实际上无法区分辍学率和原始结果,因此后代对先验敏感。