Author

Lee

Published

October 14, 2024

我们先提出一个问题:

假设全球人类的智商符合正态分布, N(100,152)。我们从全球80亿人口中随机抽取100个人, 这100人的平均智商大于等于110的概率是多少?

1 标准误(standard error)

如果我们只用模拟而不适用数学公式,上面的问题其实很好解决:

  1. 80 亿人抽 100 个人,我们重复 1 万次,每次都算出平均值。
  2. 平均值大于等于 110 的次数除以 1 万,就是随机抽取 100 人,该 100 人平均智商大于等于 110 的概率。

但是,如果我们想看看从正态分布 N(μ,δ2) 的总体中随机抽取M个大小为N的样本,每个样本都计算平均值X¯(即总共有M个X¯)。那么这些样本的平均值 X¯ 的分布是怎样的呢?它们是否存在某种规律?

library(tidyverse)
library(tibble)
library(patchwork)
# 模拟总体的正态分布:N(100, 15^2)
set.seed(42)
x <- rnorm(100000, mean = 100, sd = 15) # 100000个样本,均值为100,标准差为15
data <- as.data.frame(x)

population_mu <- mean(data$x)
population_sd <- sd(data$x)

# 作图
ggplot(data, aes(x = x)) +
  geom_histogram(binwidth = 1, color = "black", fill = "white") +
  labs(x = "智商", y = "频率")

然后我们从整体中随机抽取 num_sample 个大小为 sample_size 的样本,计算它们的平均值。

# 我们分别抽取2000个,大小为10,100,1000,10000的样本,并计算它们的平均值
# 定义函数,模拟抽样过程
rnorm_stats <- function(df, n) {
  the_sample <- sample(x, n)
  tibble(
    sample_size = n,
    sample_mean = mean(the_sample),
    sample_sd = sd(the_sample)
  )
}

# 反复抽样
df_sample_10 <-
  map_dfr(1:2000, \(x) rnorm_stats(x, 10))
df_sample_100 <-
  map_dfr(1:2000, \(x) rnorm_stats(x, 100))
df_sample_1000 <-
  map_dfr(1:2000, \(x) rnorm_stats(x, 1000))
df_sample_10000 <-
  map_dfr(1:2000, \(x) rnorm_stats(x, 10000))
# 使用 ggplot2 绘制直方图
size <- c(10, 100, 1000, 10000)

p1 <- ggplot(data = df_sample_10, aes(x = sample_mean)) +
  geom_histogram(bins = 30, fill = "steelblue", color = "black", alpha = 0.5) +
  labs(
    title = bquote(
      "Sample Size = " ~ .(size[1])
      ~ ", mean =" ~ .(round(mean(df_sample_10$sample_mean), 2))
      ~ ", sd = " ~ .(round(sd(df_sample_10$sample_sd), 2))
    ),
    x = "Value", y = "Frequency"
  ) +
  geom_vline(xintercept = 100, linetype = "dashed", color = "red") +
  theme_bw() +
  theme(
    panel.grid = element_blank(),
    title = element_text(size = 8)
  )

p2 <- ggplot(data = df_sample_100, aes(x = sample_mean)) +
  geom_histogram(bins = 30, fill = "steelblue", color = "black", alpha = 0.5) +
  geom_vline(xintercept = 100, linetype = "dashed", color = "red") +
  labs(
    title = bquote(
      "Sample Size = " ~ .(size[1])
      ~ ", mean =" ~ .(round(mean(df_sample_100$sample_mean), 2))
      ~ ", sd =" ~ .(round(sd(df_sample_100$sample_sd), 2))
    ),
    x = "Value", y = "Frequency"
  ) +
  theme_bw() +
  theme(
    panel.grid = element_blank(),
    title = element_text(size = 8)
  )

p3 <- ggplot(data = df_sample_1000, aes(x = sample_mean)) +
  geom_histogram(bins = 30, fill = "steelblue", color = "black", alpha = 0.5) +
  geom_vline(xintercept = 100, linetype = "dashed", color = "red") +
  labs(
    title = bquote(
      "Sample Size = " ~ .(size[1])
      ~ ", mean =" ~ .(round(mean(df_sample_1000$sample_mean), 2))
      ~ ", sd =" ~ .(round(sd(df_sample_1000$sample_sd), 2))
    ),
    x = "Value", y = "Frequency"
  ) +
  theme_bw() +
  theme(
    panel.grid = element_blank(),
    title = element_text(size = 8)
  )

p4 <- ggplot(data = df_sample_10000, aes(x = sample_mean)) +
  geom_vline(xintercept = 100, linetype = "dashed", color = "red") +
  geom_histogram(bins = 30, fill = "steelblue", color = "black", alpha = 0.5) +
  labs(
    title = bquote("Sample Size = " ~ .(size[1]) ~ ", mean =" ~ .(round(mean(df_sample_10000$sample_mean), 2)) ~ ", sd =" ~ .(round(sd(df_sample_10000$sample_sd), 2))),
    x = "Value", y = "Frequency"
  ) +
  theme_bw() +
  theme(
    panel.grid = element_blank(),
    title = element_text(size = 8)
  )

(p1 + p2) / (p3 + p4)
图 1: 不同样本量的样本均值直方图

可知,不管样本量是多少,样本均值的分布都非常接近正态分布,且随着样本量的增加,平均值逐渐增大,而标准差逐渐变小。

Tip

从一个正态分布N(μ,δ2) 的总体中,随机不放回的抽取M个大小为N的样本,样本的平均值X¯的分布,就是服从正态分布N(μ,σ2N)

2 解答问题

我们回到之前的问题:

假设全球人类的智商符合正态分布, N(100,152)。我们从全球80亿人口中随机抽取100个人, 这100人的平均智商大于等于110的概率是多少?

从80亿人口中随机抽取100人,假设我们抽取无数次,每次可算出这100个人的平均智商(X¯)。那么,X¯ 的分布应该为:

X¯n(100,152100)

# 设置统计参数
mu <- 100        # 总体均值
sigma <- 15      # 总体标准差
n <- 100         # 样本大小
x_bar <- 110     # 样本均值

# 计算样本均值分布的Z值
z <- (x_bar - mu) / (sigma / sqrt(n))

# 计算P值
p_value <- pnorm(z, lower.tail = FALSE)
p_value
[1] 1.308392e-11

由于计算的 Z 值非常大,结果 P(Z≥6.67) 会非常接近 0。这意味着从 80 亿人中随机抽取 100 人,并且其平均智商大于等于 110 的概率非常小,几乎为零。

3 中心极限定理

那么如果总体分布不是正态分布呢?

中心极限定理(CLT):不管总体服从哪种分布,只要每次抽样的样本容量足够大(通常认为N30),那么抽样平均值 X¯ 的分布就服从正态分布。

假设总体的平均值为μ,标准差为σ,我们从母体中随机不放回抽取 M 个大小为 N 的样本,样本的平均值X¯的分布为:

X¯N(μ,σ2N)

这就是中心极限定理。

Footnotes

  1. 标准误(standard error)是用来衡量样本平均值的分布的标准差。这个分布的标准差,就是标准误。↩︎