该答案分析了报价的含义,并提供了模拟研究的结果来说明报价并帮助理解报价可能要说的内容。任何人(具有基本R
技能)都可以轻松扩展该研究,以探索其他置信区间程序和其他模型。
这项工作出现了两个有趣的问题。 一个问题涉及如何评估置信区间过程的准确性。鲁棒性给人的印象取决于这一点。我显示了两种不同的精度度量,因此您可以进行比较。
50%
健壮性在统计中具有标准含义:
健壮性通常意味着对围绕基本概率模型的假设不敏感。
(Hoaglin,Mosteller和Tukey,《了解健壮和探索性数据分析》, J。Wiley(1983),第2页。)
这与问题中的报价一致。为了理解报价,我们仍然需要知道置信区间的预期目的。为此,让我们回顾一下盖尔曼的著作。
我更喜欢50%到95%的间隔,原因有3个:
计算稳定性
更直观的评估(50%的间隔应包含真实值的一半),
从某种意义上说,最好在应用程序中了解参数和预测值的位置,而不要尝试不切实际的接近确定性。
由于了解预测值并不是置信区间(CI)的目的,因此我将重点介绍获取参数值的意义,CI就是这样做的。我们称这些为“目标”值。从那里,根据定义,一个CI旨在覆盖其目标与指定的概率(其置信水平)。实现预期的覆盖率是评估任何CI程序质量的最低标准。(此外,我们可能对典型的CI宽度感兴趣。为了使帖子保持合理的长度,我将忽略此问题。)
这些考虑因素促使我们研究置信区间计算在目标参数值方面会误导我们多少。 引用可以被理解为暗示即使数据是通过不同于模型的过程生成的,较低置信度CI也可以保留其覆盖范围。我们可以测试一下。程序是:
采用包括至少一个参数的概率模型。经典的是从未知均值和方差的正态分布中采样。
为一个或多个模型参数选择一个CI程序。一个优秀的样本可以通过样本均值和样本标准差构建CI,然后将后者乘以Student t分布给出的因子。
将该程序应用于各种不同的模型(与所采用的模型相差不大),以评估其在一定置信度范围内的覆盖率。
50%99.8%
αp, 然后
log(p1−p)−log(α1−α)
很好地抓住了差异。当它为零时,覆盖范围恰好是预期的值。如果为负,则覆盖范围太低-这意味着置信区间过于乐观,低估了不确定性。
那么问题是,随着底层模型的扰动,这些错误率会如何随着置信度而变化? 我们可以通过绘制仿真结果来回答。 这些图量化了此原型应用程序中CI的“近乎确定性”的“不现实”程度。
(1/30,1/30)
α95%3
α=50%50%95%5% 有时候,我们应该为更大的错误率做好准备,以防万一世界无法按照我们的模型所假设的那样工作。
50%50%
这是R
生成图的代码。它很容易修改以研究其他分布,其他置信范围和其他CI程序。
#
# Zero-mean distributions.
#
distributions <- list(Beta=function(n) rbeta(n, 1/30, 1/30) - 1/2,
Uniform=function(n) runif(n, -1, 1),
Normal=rnorm,
#Mixture=function(n) rnorm(n, -2) + rnorm(n, 2),
Exponential=function(n) rexp(n) - 1,
Lognormal=function(n) exp(rnorm(n, -1/2)) - 1
)
n.sample <- 12
n.sim <- 5e4
alpha.logit <- seq(0, 6, length.out=21); alpha <- signif(1 / (1 + exp(-alpha.logit)), 3)
#
# Normal CI.
#
CI <- function(x, Z=outer(c(1,-1), qt((1-alpha)/2, n.sample-1)))
mean(x) + Z * sd(x) / sqrt(length(x))
#
# The simulation.
#
#set.seed(17)
alpha.s <- paste0("alpha=", alpha)
sim <- lapply(distributions, function(dist) {
x <- matrix(dist(n.sim*n.sample), n.sample)
x.ci <- array(apply(x, 2, CI), c(2, length(alpha), n.sim),
dimnames=list(Endpoint=c("Lower", "Upper"),
Alpha=alpha.s,
NULL))
covers <- x.ci["Lower",,] * x.ci["Upper",,] <= 0
rowMeans(covers)
})
(sim)
#
# The plots.
#
logit <- function(p) log(p/(1-p))
colors <- hsv((1:length(sim)-1)/length(sim), 0.8, 0.7)
par(mfrow=c(1,2))
plot(range(alpha.logit), c(-2,1), type="n",
main="Confidence Interval Accuracies (Logit Scales)", cex.main=0.8,
xlab="Logit(alpha)",
ylab="Logit(coverage) - Logit(alpha)")
abline(h=0, col="Gray", lwd=2)
legend("bottomleft", names(sim), col=colors, lwd=2, bty="n", cex=0.8)
for(i in 1:length(sim)) {
coverage <- sim[[i]]
lines(alpha.logit, logit(coverage) - alpha.logit, col=colors[i], lwd=2)
}
plot(range(alpha), c(-0.2, 0.05), type="n",
main="Raw Confidence Interval Accuracies", cex.main=0.8,
xlab="alpha",
ylab="coverage-alpha")
abline(h=0, col="Gray", lwd=2)
legend("bottomleft", names(sim), col=colors, lwd=2, bty="n", cex=0.8)
for(i in 1:length(sim)) {
coverage <- sim[[i]]
lines(alpha, coverage - alpha, col=colors[i], lwd=2)
}