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 = "频率")
我们先提出一个问题:
假设全球人类的智商符合正态分布, \(N(100, 15^2)\)。我们从全球80亿人口中随机抽取100个人, 这100人的平均智商大于等于110的概率是多少?
1 标准误(standard error)
如果我们只用模拟而不适用数学公式,上面的问题其实很好解决:
- 80 亿人抽 100 个人,我们重复 1 万次,每次都算出平均值。
- 平均值大于等于 110 的次数除以 1 万,就是随机抽取 100 人,该 100 人平均智商大于等于 110 的概率。
但是,如果我们想看看从正态分布 \(N(\mu, \delta^2)\) 的总体中随机抽取M个大小为N的样本,每个样本都计算平均值\(\bar{X}\)(即总共有M个\(\bar{X}\))。那么这些样本的平均值 \(\bar{X}\) 的分布1是怎样的呢?它们是否存在某种规律?
然后我们从整体中随机抽取 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 可知,不管样本量是多少,样本均值的分布都非常接近正态分布,且随着样本量的增加,平均值逐渐增大,而标准差逐渐变小。
从一个正态分布\(N(\mu,\delta^2)\) 的总体中,随机不放回的抽取M个大小为N的样本,样本的平均值\(\bar{X}\)的分布,就是服从正态分布\(N(\mu, \frac{\sigma^2}{N})\)。
2 解答问题
我们回到之前的问题:
假设全球人类的智商符合正态分布, \(N(100, 15^2)\)。我们从全球80亿人口中随机抽取100个人, 这100人的平均智商大于等于110的概率是多少?
从80亿人口中随机抽取100人,假设我们抽取无数次,每次可算出这100个人的平均智商(\(\bar{X}\))。那么,\(\bar{X}\) 的分布应该为:
\[ \bar{X} \sim n(100, \frac{15^2}{100}) \]
# 设置统计参数
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):不管总体服从哪种分布,只要每次抽样的样本容量足够大(通常认为\(N \geq 30\)),那么抽样平均值 \(\bar{X}\) 的分布就服从正态分布。
假设总体的平均值为\(\mu\),标准差为\(\sigma\),我们从母体中随机不放回抽取 M 个大小为 N 的样本,样本的平均值\(\bar{X}\)的分布为:
\[ \bar{X} \sim N(\mu, \frac{\sigma^2}{N}) \]
这就是中心极限定理。
Footnotes
标准误(standard error)是用来衡量样本平均值的分布的标准差。这个分布的标准差,就是标准误。↩︎