如何找到 95% 的可信区间?

机器算法验证 贝叶斯 描述性统计 可信区间 最高密度区
2022-01-28 01:56:08

我正在尝试计算以下后验分布的 95% 可信区间。我在 R 中找不到它的函数,但下面的方法是否正确?

x <- seq(0.4,12,0.4)
px <-  c(0,0, 0, 0, 0, 0, 0.0002, 0.0037, 0.018, 0.06, 0.22 ,0.43, 0.64,0.7579, 0.7870, 0.72, 0.555, 0.37, 0.24, 0.11, 0.07, 0.02, 0.009, 0.005, 0.0001, 0,0.0002, 0, 0, 0)
plot(x,px, type="l")
mm <- sum(x*px)/sum(px)
var <- (sum((x)^2*px)/sum(px)) - (mm^2)
cat("95% credible interval: ", round(mm -1.96*sqrt(var),3), "-", round(mm + 1.96*sqrt(var),3),"\n")
1个回答

正如Henry所指出的,您假设正态分布,如果您的数据遵循正态分布,那是完全可以的,但如果您不能为其假设正态分布,那将是不正确的。下面我描述了两种不同的方法,您可以将它们用于仅给定数据点和伴随的密度估计的未知分布。xpx

首先要考虑的是你想用你的间隔来总结什么。例如,您可能对使用分位数获得的区间感兴趣,但您也可能对分布的最高密度区域(参见此处此处)感兴趣。虽然这在对称、单峰分布等简单情况下不会产生太大(如果有的话)差异,但这将对更“复杂”的分布产生影响。通常,分位数会为您提供包含集中在中位数周围的概率质量的区间(中间100α%您的分布),而最高密度区域是分布模式周围的区域。如果您比较下图中的两个图,这将更加清楚——分位数垂直“切割”分布,而最高密度区域水平“切割”分布。

分位数与 HDR 间隔

接下来要考虑的是如何处理您对分布的信息不完整的事实(假设我们正在谈论连续分布,您只有一堆点而不是一个函数)。您可以做的是“按原样”获取值,或使用某种插值或平滑来获得“中间”值。

一种方法是使用线性插值(参见?approxfunR),或者使用更平滑的样条曲线(参见?splinefunR)。如果您选择这种方法,您必须记住插值算法对您的数据没有领域知识,并且可以返回无效结果,例如低于零的值等。

# grid of points
xx <- seq(min(x), max(x), by = 0.001)

# interpolate function from the sample
fx <- splinefun(x, px) # interpolating function
pxx <- pmax(0, fx(xx)) # normalize so prob >0

您可以考虑的第二种方法是使用内核密度/混合分布来使用您拥有的数据来近似您的分布。这里的棘手部分是决定最佳带宽。

# density of kernel density/mixture distribution
dmix <- function(x, m, s, w) {
  k <- length(m)
  rowSums(vapply(1:k, function(j) w[j]*dnorm(x, m[j], s[j]), numeric(length(x))))
}

# approximate function using kernel density/mixture distribution
pxx <- dmix(xx, x, rep(0.4, length.out = length(x)), px) # bandwidth 0.4 chosen arbitrary

接下来,您将找到感兴趣的区间。您可以通过数字方式进行,也可以通过模拟进行。

1a) 采样以获得分位数区间

# sample from the "empirical" distribution
samp <- sample(xx, 1e5, replace = TRUE, prob = pxx)

# or sample from kernel density
idx <- sample.int(length(x), 1e5, replace = TRUE, prob = px)
samp <- rnorm(1e5, x[idx], 0.4) # this is arbitrary sd

# and take sample quantiles
quantile(samp, c(0.05, 0.975)) 

1b) 采样以获得最高密度区域

samp <- sample(pxx, 1e5, replace = TRUE, prob = pxx) # sample probabilities
crit <- quantile(samp, 0.05) # boundary for the lower 5% of probability mass

# values from the 95% highest density region
xx[pxx >= crit]

2a) 以数字方式查找分位数

cpxx <- cumsum(pxx) / sum(pxx)
xx[which(cpxx >= 0.025)[1]]   # lower boundary
xx[which(cpxx >= 0.975)[1]-1] # upper boundary

2b)以数字方式查找最高密度区域

const <- sum(pxx)
spxx <- sort(pxx, decreasing = TRUE) / const
crit <- spxx[which(cumsum(spxx) >= 0.95)[1]] * const

正如您在下图中看到的那样,在单峰对称分布的情况下,两种方法都返回相同的区间。

两种间隔

当然,你也可以尝试寻找100α%围绕某个中心值的间隔,使得Pr(Xμ±ζ)α并使用某种优化来找到合适,但上述两种方法似乎更常用且更直观。ζ