如何计算非正态分布的置信区间?

机器算法验证 置信区间 意思是
2022-02-04 01:54:23

我有 383 个样本对某些常见值有很大偏差,我将如何计算平均值的 95% CI?我计算的 CI 似乎有些偏离,我认为这是因为当我制作直方图时我的数据看起来不像曲线。所以我认为我必须使用诸如引导程序之类的东西,我不太了解。

4个回答

是的,bootstrap 是获取均值置信区间的一种替代方法(如果您想了解该方法,则必须付出一些努力)。

思路如下:

  1. 用替换 B 次重新采样。
  2. 对于这些样本中的每一个,计算样本均值。
  3. 计算适当的引导置信区间。

关于最后一步,有几种类型的引导置信区间 (BCI)。以下参考文献讨论了不同类型 BCI 的属性:

http://staff.ustc.edu.cn/~zwp/teach/Stat-Comp/Efron_Bootstrap_CIs.pdf

http://www.tau.ac.il/~saharon/Boot/10.1.1.133.8405.pdf

计算多个 BCI 并尝试了解它们之间可能存在的差异是一种很好的做法。

在 R 中,您可以使用 R 包 'boot' 轻松实现这个想法,如下所示:

rm(list=ls())
# Simulated data
set.seed(123)
data0 = rgamma(383,5,3)
mean(data0) # Sample mean

hist(data0) # Histogram of the data

library(boot) 

# function to obtain the mean
Bmean <- function(data, indices) {
  d <- data[indices] # allows boot to select sample 
    return(mean(d))
} 

# bootstrapping with 1000 replications 
results <- boot(data=data0, statistic=Bmean, R=1000)

# view results
results 
plot(results)

# get 95% confidence interval 
boot.ci(results, type=c("norm", "basic", "perc", "bca"))

另一种标准替代方法是使用 Wilcoxon 检验计算 CI。在 R 中

wilcox.test(your-data, conf.int = TRUE, conf.level = 0.95)

不幸的是,它为您提供了(伪)中位数周围的 CI,而不是均值,但是如果数据严重不正常,则中位数可能是一种更具信息性的度量。

对于对数正态数据,Olsson (2005)建议使用“改进的 Cox 方法”

如果是对数正态分布且的置信区间为XE(X)=θlog(θ)

Y¯=S22±tdfS2n+S42(n1)

其中的样本均值是的样本方差对于 df,使用 n-1。Y=log(X)YY¯YS2

R函数如下:

ModifiedCox <- function(x){
  n <- length(x)
  y <- log(x)
  y.m <- mean(y)
  y.var <- var(y)

  my.t <- qt(0.975, df = n-1)

  my.mean <- mean(x)
  upper <- y.m + y.var/2 + my.t*sqrt(y.var/n + y.var^2/(2*(n - 1)))
  lower <- y.m + y.var/2 - my.t*sqrt(y.var/n + y.var^2/(2*(n - 1)))

 return(list(upper = exp(upper), mean = my.mean, lower = exp(lower)))

}

重复 Olsson 论文中的例子

CO.level <- c(12.5, 20, 4, 20, 25, 170, 15, 20, 15)

ModifiedCox(CO.level)
$upper
[1] 78.72254

$mean
[1] 33.5

$lower
[1] 12.30929

您可以只使用平均值的标准置信区间:请记住,当我们计算平均值的置信区间时,我们可以诉诸中心极限定理并使用标准区间(使用 T 分布的临界点),即使基础数据不正常。事实上,只要数据是独立同分布且数据的分布具有有限方差,观测值的样本均值分布应该与正态分布几乎无法区分即使数据的基础分布与正态分布极为不同,情况也会如此。n=383