可以使用哪些方法从数据中指定先验?

机器算法验证 可能性 贝叶斯 荟萃分析 事先的
2022-04-06 22:51:58

背景

我通常对学习使用数据来指定先验的适当方法感兴趣。上一个问题询问如何从专家那里获得先验知识,并获得了一些很好的建议。在这里,我有兴趣学习如何指定使用数据的先验。我计划在荟萃分析中使用这些先验来综合我收集的其他数据。

更新 虽然约翰提供了一个“正确”的答案,但就我而言,它需要对原始模型进行大量修改才能实现,所以我更愿意找到一种方法来估计先验作为离散步骤。

问题

  1. 指定事先通知的此类数据的最佳方法是什么?

  2. 如果我正在使用特定物种(猴子)的参数,并且该物种属于一组生物体(灵长类动物),并且数据可用于灵长类动物但不适用于猴子,是否适合基于灵长类动物的分布数据?

示例案例,首先是建议的解决方案

  1. 我对 100 种灵长类拇指长度的灵长类动物进行了 100 次观察:

    set.seed(0)
    thumb <- rgamma(100, 4, 0.1)
    library(MASS)
    fitdistr(thumb, 'gamma')
    

    实际上,当没有先验理由选择特定分布时,可以通过最大似然选择分布:

    for(dist in c('gamma', 'lognormal', 'weibull') {
    logLik(fitdistr(thumb, dist))
    }
    
  2. 我收集了来自 50 种不同灵长类动物的 50 种平均值、标准误差和样本大小,以及来自另外 50 种眼睛直径的 50 次独立观察结果:

    eye <- data.frame( diameter = rgamma(100, 4, 0.1),
                       se       = c(rlnorm(50, 0.5,1), rep(NA, 50)),
                       n        = c(rep(1:5, 10), rep(1, 50)))      
    eye <- signif(eye, 3)
    

    如何将样本统计数据纳入我的先验计算中?

3个回答

如果您拥有所有这些数据,我认为最好的答案是使用分层建模实际拟合单个大型模型,而不是分两步进行(生成先验然后拟合模型)。这基本上是我对这个问题的回答。我在那里再解释一下。

在分层模型中,您对感兴趣的每个参数(例如,物种拇指长度的位置和尺度参数)进行建模,都来自一个常见的先验分布。分层模型的超参数参数化了物种参数的共同先验分布,您在估计超参数的同时估计您感兴趣的参数。超参数当然需要自己的先验分布,但是这些可以相对分散。

将数据合并到先验分布中的一种有用方法是最大熵原理。您基本上提供了先验分布要满足的约束(例如均值、方差等),然后选择满足这些约束的最“分散”的分布。

分布一般有以下形式 p(x)exp(...)

Edwin Jaynes 是这一原则的鼻祖,因此寻找他的作品是一个很好的起点。

有关更详细的描述,请参阅 wiki 页面 (http://en.wikipedia.org/wiki/Principle_of_maximum_entropy) 和其中的链接。

我对 2) 提出以下解决方案,并希望得到反馈:

  1. 数据包括平均值,Y, 样本量n, 和标准误σ; 计算精度 (τ=1σn) 因为 BUGS 的 logN 参数化需要它
  2. 数据YN(β0,τ)
  3. 精确τGamma(n2,n2τ)
  4. 扩散先验
  5. 利用N(μ=β0,σ=1τ) 事先的
  6. 这是代码:

    library(rjags)
    data <- data.frame(Y = c(1.6, 2.5, 1.8, 1.8, 1.7, 2.5), 
                       n = c(4, 4, 4, 3, 4, 3), 
                       se = c(0.2, 0.41, 0.24, 0.27, 0.2, 0.14))
    # convert se to precision
    data <- transform(data, obs.prec = 1/se)[, colnames(data)!='se'] 
    # write a bugs model
    sink(file= 'model.bug') #put following in file 'model.bug'
                            #i don't think sink() actually works like this 
    model 
    {
        for (k in 1:length(Y)) {
            Y[k] ~ dnorm(beta.o, tau.y[k])
            tau.y[k] <- prec.y * n[k]
            u1[k] <- n[k]/2
            u2[k] <- n[k]/(2 * prec.y)
            obs.prec[k] ~ dgamma(u1[k], u2[k])
        }
            beta.o ~ dnorm(3, 0.0001)
        prec.y ~ dgamma(0.001, 0.001)
        sd.y  <- 1/sqrt(prec.y)
    }
    sink()
    
    
    model  <- jags.model(file = "model.bug", 
                         data = data, 
                         n.adapt = 500, 
                         n.chains = 4)
    
    mcmc.object <- coda.samples(model = model, 
                                variable.names = c( 'beta.o', 'sd.y'), 
                                n.iter = 10000, 
                                thin = 50)
    summary(mcmc.object)
    

更新

我已经修改了这种方法来计算后验预测分布。它需要一些修改,主要是计算未观察样本的后验预测分布。

详情在这里:

David S. LeBauer、Dan Wang、Katherine T. Richter、Carl C. Davidson 和 Michael C. Dietze 2013。促进现场测量和生态系统模型之间的反馈。生态专着八十三:133—154。http://dx.doi.org/10.1890/12-0137.1 pdf

这种和更简单的方法的例子在这里:https ://github.com/dlebauer/pecan-priors/blob/master/priors_demo.Rmd