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


21

我有383个样本的某些常用值有很大偏差,如何计算平均值的95%CI?我计算出的CI似乎相去甚远,我认为这是因为制作直方图时数据看起来不像曲线。所以我认为我必须使用类似引导程序的工具,但我对此不太了解。


2
一种解决方案是使用渐近CI,它利用RV具有有限的标准正态分布这一事实。您的样本相当大,因此可以很好地近似。X¯μS/n
约翰·K

1
不,您会发现使用该方法的置信区间的两条尾部的尾部覆盖率都非常差。幸运的是,平均覆盖率可能还不错,但是两个尾部错误率都将是错误的。
2014年

2
“对某些共同价值的偏见”是什么意思?注意,偏差在统计中具有特殊含义;如果不是那样的话,您应该尽量避免这种情况。您是简单地表示“某些特定值经常发生”吗?您可以显示您的计算以及数据的某些显示或表格吗?
Glen_b-恢复莫妮卡2014年

Answers:


21

是的,引导程序是获取均值置信区间的一种替代方法(如果您想了解该方法,则需要付出一些努力)。

这个想法如下:

  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"))

3
最后,计算几个步骤,意味着从结果中寻找您喜欢的配置项。您应该根据事先确定的CI来决定所需的CI类型。
约翰

@John不同的CI具有不同的属性。最好检查是否存在差异(并尝试调查其来源)。钓鱼不是为了方便的结果。
Munchausen 2014年

绝对可以,但是在回答中没有这样的原因说明,“暗示”钓鱼。而且,您仍然没有说明先实际选择所需的配置项至关重要。我建议对一些天真提问者的关键信息进行更新。如果您指出通常首选哪种CI,为什么,或者在这种情况以及为什么这样的情况下,首选哪种CI会更好。
约翰

2
@IhaveCandy:否。它演示了中心极限定理,即,即使对于遵循非常“非正态”分布的值,均值的采样分布也趋于正态。这就是为什么简单的z置信区间与任何其他理想解决方案(例如引导程序)没有太大区别的原因。
Michael M

1
@IhaveCandy请参阅上面的评论,Michael Mayer持相同观点。
JohnK 2014年

8

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

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

不幸的是,它不能为您提供(伪)中位数附近的CI,但是如果数据严重不正常,则中位数可能是更有用的度量。


2

对于对数正态数据,Olsson(2005)建议采用“改进的考克斯方法”

XE(X)=θlog(θ)

Y¯=S22±tdfS2n+S42(n1)

Y=log(X)YY¯Y小号2

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)))

}

重复奥尔森论文中的例子

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

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.