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


13

我正在尝试计算以下后验分布的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
并非如此-您假设正态分布和均值的均等间隔,在这种情况下,这两者都不是特别合理的。实际上,假设这是一个离散分布,您已经捕获了大约的概率,并且需要稍微拓宽间隔以达到。如果这是离散分布,最好采用最高密度区域,该区域为。或者,选择一个间隔,使其低于该概率的概率为或更小,而高于该概率的概率为或更小,此处也是 。95 [ 4.4 8.0 ] 2.5 2.5 [ 4.4 8.0 ]94%95%[4.4,8.0]2.5%2.5%[4.4,8.0]
亨利

Answers:


24

正如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μ±ζ)αζ


为什么仅在直接根据给定的信息直接计算分位数(使用任一方法)时进行抽样?
ub

1
@whuber,因为它既便宜又容易,但是我将在明天编辑以描述非模拟计算。
蒂姆

嗨,蒂姆,这很有帮助。仅从分辩中获得分位数是否是不正确的。(较低的<-x [which(as.logical(diff(cumsum(px)/ sum(px)> 0.025)))]))(上方的<-x [which(as.logical(diff(cumsum(px)/ sum (px)<0.975)))))
user19758

@ user19758请检查我的编辑。
蒂姆

+1其他说明,插图和代码为该网站上的答案树立了高标准。谢谢!
ub
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.