自举是否适合这种连续数据?

机器算法验证 引导程序 样本量 重采样
2022-03-01 01:14:01

我是一个完整的新手:)

我正在做一项研究,样本量为 10,000,来自大约 745,000 的人口。每个样本代表一个“百分比相似性”。绝大多数样本在 97%-98% 左右,但少数在 60% 到 90% 之间,即分布严重负偏。大约 0.6% 的结果是 0%,但这些将与样本分开处理。

所有 10,000 个样本的平均值为 97.7%,仅在 Excel 中,StdDev 为 3.20。我知道 StdDev 在这里并不真正适用,因为结果不是正态分布的(而且因为 +3.20 会让你超过 100%!)。

我的问题是:

  1. 自举(对我来说是一个新概念)合适吗?
  2. 我是否正确引导:)
  3. 什么是足够的样本量?

我正在做的是重新采样(替换)我的 10,000 个结果并计算新的平均值。我这样做了几千次,并将每个平均值存储在一个数组中。然后我计算“平均值”,这是我的统计结果。为了计算 99% CI,我选择了第 0.5% 的值和第 99.5% 的值,这会产生一个非常小的范围:97.4% - 98.0%。这是一个有效的结果还是我做错了什么?

至于样本量,我只抽样了大约 1.3% 的人口——我不知道这是否“足够”。我如何知道我的样本是否代表总体?理想情况下,我希望对 +/- 0.50% 个百分点(即 97.2% - 98.2%)的平均值有 99% 的信心。

提前感谢您的任何提示!

1个回答

标准偏差在这里和其他任何地方一样适用:它提供了有关数据分散的有用信息。特别是,sd 除以样本大小的平方根是一个标准误差:它估计了均值抽样分布的离散度。让我们计算一下:

3.2%/10000=0.032%=0.00032.

那是很小的——远小于±0.50%您寻求的精度。

虽然数据不是正态分布的,但样本均值非常接近正态分布,因为样本量很大。 例如,这里是一个与你的特征相同的样本的直方图,在它的右边是来自同一总体的一千个额外样本的平均值的直方图。

图1

它看起来非常接近正常,不是吗?

因此,尽管您似乎正确引导,但不需要引导:对称100α%像往常一样,通过将标准误差乘以标准正态分布的适当百分位数来获得平均值的置信区间(即,Z1α/200) 并将该距离移动到平均值的任一侧。在你的情况下,Z1α/200=2.5758, 所以99%置信区间为

(0.9772.5758(0.032)/10000, 0.977+2.5758(0.032)/10000)=(97.62%,97.78%).

通过反转该关系以求解样本量,可以找到足够的样本量。在这里它告诉我们您需要一个样本大小

(3.2%/(0.5%/Z1α/200))2272.

这足够小,我们可能想要重新检查平均值的抽样分布是正态的结论。 我画了一个样本272来自我的人口并引导其平均值(对于9999迭代):

图 2

果然,看起来很正常。事实上,自举置信区间(97.16%,98.21%)与正常理论 CI 几乎相同(97.19%,98.24%).

正如这些例子所示,绝对样本量决定了估计的准确性,而不是人口规模的比例。 (一个极端但直观的例子是,一滴海水可以准确估计海洋中盐的浓度,即使那一滴海水只占所有海水的一小部分。)为了你所说的目的,获取一个样本的10000(这需要超过36工作量是样本的两倍272) 是矫枉过正。


R执行这些分析并绘制这些图形的代码如下。它从具有 Beta 分布的群体中采样,平均值为0.977和标准差0.032.

set.seed(17)
#
# Study a sample of 10,000.
#
Sample <- rbeta(10^4, 20.4626, 0.4817)
hist(Sample)
hist(replicate(10^3, mean(rbeta(10^4, 20.4626, 0.4817))),xlab="%",main="1000 Sample Means")
#
# Analyze a sample designed to achieve a CI of width 1%.
#
(n.sample <- ceiling((0.032 / (0.005 / qnorm(1-0.005)))^2))
Sample <- rbeta(n.sample, 20.4626, 0.4817)
cat(round(mean(Sample), 3), round(sd(Sample), 3)) # Sample statistics
se.mean <- sd(Sample) / sqrt(length(Sample))      # Standard error of the mean
cat("CL: ", round(mean(Sample) + qnorm(0.005)*c(1,-1)*se.mean, 5)) # Normal CI
#
# Compare the bootstrapped CI of this sample.
#
Bootstrapped.means <- replicate(9999, mean(sample(Sample, length(Sample), replace=TRUE)))
hist(Bootstrapped.means)
cat("Bootstrap CL:", round(quantile(Bootstrapped.means, c(0.005, 1-0.005)), 5))