显示贝叶斯模型平均 (BMA) 优势的简单示例

机器算法验证 贝叶斯 数据可视化
2022-03-10 08:33:08

我将贝叶斯模型平均 (BMA) 方法纳入我的研究中,并将很快向我的同事介绍我的工作。然而,BMA 在我的领域中并不是那么有名,所以在向他们介绍了所有理论之后,在将其实际应用于我的问题之前,我想提供一个简单但有启发性的示例来说明 BMA 为何有效。

我正在考虑一个简单的示例,其中有两个模型可供选择,但真正的数据生成模型 (DGM) 介于两者之间,并且证据并不真正支持其中任何一个。因此,如果您选择一个并从它们继续,您将忽略模型不确定性并犯错误,但 BMA 尽管真实模型不是模型集的一部分,但至少给出了感兴趣参数的正确后验密度。例如,每天有两个天气预报(A 和 B),一个想要预测最好的天气,所以在经典统计中,您首先会尝试找到两者之间的最佳预测者,但如果事实介于两者之间呢? (也就是说,有时 A 是对的,有时是 B)。但我无法将其正式化。类似的东西,但我对想法非常开放。我希望这个问题足够具体!

在文献中,到目前为止,我还没有找到任何很好的例子:

  • Kruschke (2011)虽然对贝叶斯统计进行了很好的介绍,但并没有真正关注 BMA,他在第 4 章中的抛硬币示例非常适合介绍贝叶斯统计,但并没有真正说服其他研究人员使用 BMA。(“为什么我还有三个模型,一个说硬币是公平的,两个说它在任何一个方向上都有偏差?”)
  • 我读过的所有其他东西(Koop 2003Koop/Poirier/Tobias (2007)Hoeting et al. (1999)和大量其他)都是很好的参考资料,但我还没有在其中找到一个简单的玩具示例。

但也许我只是在这里错过了一个很好的来源。

那么有没有人有他或她用来介绍 BMA 的好例子?甚至可能通过显示可能性和后验,因为我认为这将很有启发性。

2个回答

我最近做了类似的事情。与其说是试图说服别人,不如说是做了一个小项目,让我对 BMA 有了一点了解。我所做的是生成一个具有二元响应的数据集,三个对响应有影响的自变量和七个对响应没有任何影响的变量。然后,我将 BMA 结果与逻辑回归中的常客估计进行了比较。我认为至少在这种情况下,BMA 方法似乎相当不错。如果您想让它更易于访问,您可以随时命名变量或其他名称,而不是称它们为泛型Xy.

我用于此的 R 代码如下所示。希望能给你带来启发!

# The sample size
n <- 100

# The 'true' coefficient vector
Beta <- cbind(c(-1.5, 0.45, -3))

# Generate the explanatory variables which have an effect on the outcome
set.seed(1)
X <- cbind(rnorm(n, 0, 1), rnorm(n, 4, 2), rnorm(n, 0.5, 1))

# Convert this into probabilities
prob <- 1/(1+exp(-X %*% Beta))

# Generate some uniform numbers. If the elements are smaller than the corresponding elements in the prob vector, then return 1.
set.seed(2)
runis <- runif(n, 0, 1)
y <- ifelse(runis < prob, 1, 0)

# Add the nonsense variables
X <- cbind(X, rpois(n, 3))        # Redundant variable 1 (x4)
X <- cbind(X, rexp(n, 10))        # Redundant variable 2 (x5)
X <- cbind(X, rbeta(n, 3, 10))    # Redundant variable 3 (x6)
X <- cbind(X, rbinom(n, 10, 0.5)) # Redundant variable 4 (x7)
X <- cbind(X, rpois(n, 40))       # Redundant variable 5 (x8)
X <- cbind(X, rgamma(n, 10, 20))  # Redundant variable 6 (x9)
X <- cbind(X, runif(n, 0, 1))     # Redundant variable 7 (x10)


# The BMA
library(BMA)
model <- bic.glm(X, y,  glm.family="binomial", factor.type=FALSE, thresProbne0 = 5, strict = FALSE)

# The frequentist model
model2 <- glm(y~X, family = "binomial")

old.par <- par()
par(mar=c(3,2,3,1.5))
plot(model, mfrow=c(2,5))
par(old.par)

summary(model)
summary(model2)

一个很好的资源是:
BMS 的贝叶斯模型平均,Stefan Zeugner (2012)

它使用的是 R-package BMS,更多信息可以在这里找到:http:
//bms.zeugner.eu/

可以在此处找到两个使用该软件包复制真实示例的动手教程:

以下论文是对贝叶斯方法的更一般的动机和当前介绍:

时机已到:组织科学中数据分析的贝叶斯方法 John K. Kruschke、Herman Aguinis 和 Harry Joo