整合先前模型的参数作为新数据贝叶斯建模的先验

机器算法验证 贝叶斯 事先的
2022-04-01 12:11:22

我正在从事一个科学出版项目(在社会科学领域),我正在用研究 1、研究 2 等格式构建我的手稿。基本上,我有一个令人信服的发现,其中一个数据集本身在我的领域中可能足以发表论文。但是,我知道如果将其复制到单独的数据集中,我的同事会认为这会更有趣,所以这就是我正在做的事情。

因此,让我们将此作为一个更具体的示例(这是生成的数据,但在统计上与我的真实数据相似)。我预测一个人每周食用的甜甜圈的平均数量与体重增加有关。出于问题的目的,让我们假设这种影响独立于我们通常在更复杂的模型中控制的所有其他人口统计数据。

下面是数据生成过程:

set.seed(3)
donuts1 <- runif(100, 0, 15)
weight1 <- 5 * donuts1 + rnorm(100, 0, 50) + 185

正如预期的那样,跑步lm(weight1 ~ donuts1)揭示了甜甜圈消费对体重的显着影响。

伟大的!现在我将去另一个人群收集更多数据。虽然在这个新人群中效果是恒定的,但随机误差更大。

set.seed(8)
donuts2 <- runif(100, 0, 15)
weight2 <- 5 * donuts2 + rnorm(100, 0, 100) + 185

现在,如果我将我的研究 2 报告为lm(weight2 ~ donuts2),我们将看到 p 值约为 0.22,因此无法复制。现在,一个理性的人可以观察研究 2 的数据并说,尽管统计上不显着,但研究 2 的数据与研究 1 中的数据是一致的。不过,观察它并说“足够接近”通常不是我们想要的当涉及到统计推断时。

在我看来,有几个选择:

  • 将两个样本合二为一,并对组合数据进行分析。这在我的领域和许多其他领域会被认为是奇怪的。
  • 像对待荟萃分析一样对待它们,按精度分析效应大小和加权。
  • 将研究 1 的信息作为贝叶斯方法分析研究 2 的信息先验。

我对最后一个选项特别感兴趣,即使只是为了演示——我正在学习贝叶斯分析,想看看我是否理解正确。

那么问题来了:我如何将研究 1 的结果作为研究 2 分析的信息先验?

我倾向于这样做,下面用在 JAGS 中运行分析的代码进行了演示。

library(rjags)
library(runjags)

model.inform <- '
model {
  for (i in 1:N) {
    weight2[i] ~ dnorm(y.hat[i], tau)
    y.hat[i] <- a + b * donuts2[i]
  }

  a ~ dnorm(183.41, 9.11)
  b ~ dnorm(5.07, 1.08)

  tau <- pow(sigma, -2)
  sigma ~ dunif(0, 100)
}
'

我已经将aandb项的先验(假设一个线性模型:)设置为研究 1 的参数估计值。先验的标准偏差设置为 OLS 派生的标准误差。如果您运行分析(问题末尾的代码),您会发现这更好地反映了我们从两个数据集中知道的情况,因为 95% 的可信区间不包括零,中值估计接近真实效果。我会注意到,使用平坦的先验会导致较低的估计效果和更宽的置信区间。Y=a+bx

话虽如此,我在已发表的研究中从未见过这样的事情,尽管我承认我很少在我的领域看到任何贝叶斯分析。据我了解,这类似于经验贝叶斯,但在这种情况下,我没有使用相同的数据来估计先验和后验。令我震惊的是,也许我所做的并没有表达出对先验的足够不确定性,但我不确定。

我知道许多人称这些主观先验是有原因的,但我认为这个问题本身并不是那么主观,即使可能有多种方法可以解决这个问题并模拟相同的一般情况,也无法在交叉验证上回答方法。

在 JAGS 中拟合上述模型的代码:

fit.inform <- run.jags(model.inform, c('a','b'),
                data = list('donuts2' = donuts2,
                            'weight2' = weight2,
                            'N' = 100),
                inits=list(list(.RNG.name="lecuyer::RngStream"),
                           list(.RNG.name="lecuyer::RngStream"),
                           list(.RNG.name="lecuyer::RngStream")),
                burnin = 1000, sample = 5000, thin = 15, summarise = TRUE,
                n.chains = 3)
1个回答

一般来说,通知先验需要大量的判断调用(以及在撰写中的理由)。有几个步骤:

  1. 收集可以为当前研究提供信息的相关先前研究。这一步很像收集以前的研究进行荟萃分析。您想确保它不会受到文件抽屉问题的影响,即您只使用碰巧达到重要意义的已发表研究,而不是发生未达到重要意义的未发表研究。就您而言,这一步可能很容易,因为您已经将自己限制在考虑一项特定的先前研究。(但请注意不要忽视先前研究的“不方便”结果。)

  2. 决定如何使用先前研究的结果来为本研究提供信息。一般来说,以前的研究可能使用不同的设计、不同的变量、不同的分析。这是从不同先前模型的参数到新模型中参数的先验的巧妙转换。在您的情况下,如果您的第二项研究与之前的研究具有相同的结构,则此步骤可能很容易——从之前的分析到新分析的参数映射是直接的。

  3. 如果您有先前研究的 MCMC 采样后验分布,那么请弄清楚如何告知新研究的数学指定先验。一般来说,这一步并非微不足道,因为先前研究的后验分布大概是一个复杂的多维分布,几乎可以肯定,参数相关,并且可能带有倾斜和/或峰态尾部。您需要决定哪种数学分布可以合理地逼近 MCMC 样本。然后你需要把那个数学表达式放在 JAGS 的前面。在您的情况下,由于您正在进行线性回归,因此包括参数的相关性可能很重要。

  4. 如果第二项研究的结构与第一项研究完全相同,那么本质上,您只是在同一项研究中收集更多数据,您可以将两个数据集合并为一个。但大概第二项研究有一些不同,所以你不能直接使用第一项研究的后验并准确地用于第二项研究,因为如果你这样做,就等于说你只是在同一时间收集更多数据学习。相反,为了捕捉到第二项研究有一些不同的事实,您应该“放松”先前的研究,也就是说,使其更加不确定,因为您不确定先前的研究究竟应该在多大程度上适用于第二项研究。你应该先放松多少?出色地,

当然,其他受访者可能有更具体的建议,甚至可能会指出文献中使用知情先验的例子。我只想说,当您阅读这些示例时,请牢记以上内容。