这是一个很好的问题。我将使用一个简单的例子来说明我的方法。
假设我正在与需要为我提供高斯似然均值和方差的先验信息的人一起工作。就像是
y∼N(μ,σ2)
问题是:“这个人对和的先验是什么?”μσ2
平均而言,我可能会问“给我一个你认为预期值可能的范围”。他们可能会说“在 20 到 30 之间”。然后我可以自由地解释它(也许作为上的先验的 IQR )。μ
现在,我将使用 R(或更可能是 Stan)来模拟可能的场景,以进一步缩小现实先验的范围。例如,我的同事说介于 20 和 30 之间。现在我必须决定的先验。所以,我可以向他们展示以下内容并说“这四个中哪一个看起来更真实,为什么?”μσ
他们可能会说“第一个多变,后两个精确。第二个看起来更逼真,但在25处太集中了!”
此时,我将返回并调整均值的先验,同时缩小方差的先验。
这被称为“先验预测检查”——本质上是从先验抽样,以确保先验实际上反映了知识的状态。这个过程可能很慢,但是如果您的合作者没有数据或统计专业知识,那么他们对您有什么期望呢?不是每个参数都可以给定一个平坦的先验。
用于生成样本的 Stan 代码:
data{
real mu_mean;
real mu_sigma;
real sigma_alpha;
real sigma_beta;
}
generated quantities{
real mu = normal_rng(mu_mean, mu_sigma);
real sigma = gamma_rng(sigma_alpha, sigma_beta);
real y = normal_rng(mu, sigma);
}
用于生成图形的 R 代码
library(rstan)
library(tidyverse)
library(patchwork)
make_plot = function(x){
fit1 = sampling(scode, data = x, algorithm = 'Fixed_param', iter = 10000, chains =1 )
t1 = tibble(y = extract(fit1)$y)
p1 = t1 %>%
ggplot(aes(y))+
geom_histogram()+
xlim(0,50)
return(p1)
}
d1 = list(mu_mean = 25, mu_sigma = 1, sigma_alpha = 5, sigma_beta = 1)
d2 = list(mu_mean = 25, mu_sigma = 1, sigma_alpha = 3, sigma_beta = 1)
d3 = list(mu_mean = 25, mu_sigma = 1, sigma_alpha = 1, sigma_beta = 1)
d4 = list(mu_mean = 25, mu_sigma = 1, sigma_alpha = .1, sigma_beta = 2)
d = list(d1, d2, d3, d4)
y = map(d, make_plot)
reduce(y,`+`)