You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用R绘图验证Kolmogorov-Smirnov统计量的渐近性质?

Kolmogorov-Smirnov统计量Dₙ的渐近性质验证

问题背景

设$X₁,…,Xₙ$为独立同分布随机变量,累积分布函数为$F(x)$,经验分布函数记为$Fₙ(x)$。Kolmogorov-Smirnov检验统计量定义为:
$$Dₙ = \sqrt{n} \sup_{x} |Fₙ(x) - F(x)|$$

需要通过绘图验证两点:

  • 当$n→∞$时,$Dₙ$存在极限分布;
  • $Dₙ$的渐近分布与分布函数$F(x)$无关。

原代码问题分析

原代码存在以下核心问题:

  • 函数调用错误:sapply(x, RNorm, ...)中的RNorm应为定义好的DNorm;
  • 模拟逻辑错误:DnNorm函数中sapply(10:n, rnorm...)会生成样本量从10到n的序列样本,而非固定样本量n的重复模拟,无法得到$Dₙ$的分布;
  • 分布类型错误:最后一个直方图误用正态分布函数生成指数分布样本。

修正后的代码(基础绘图函数实现)

# 安装并加载必要包
if (!require("latex2exp")) install.packages("latex2exp")
library(latex2exp)

# 定义计算单个样本Dₙ的函数
compute_Dn <- function(n, dist, ...) {
  # 生成n个来自指定分布的样本
  x <- do.call(dist, args = c(n = n, list(...)))
  # 经验分布函数
  emp_cdf <- ecdf(x)
  # 理论分布函数
  theo_cdf <- get(paste0("p", dist))
  # 计算所有样本点处的|Fₙ(x)-F(x)|,取最大值后乘以√n
  max_diff <- max(abs(emp_cdf(x) - theo_cdf(x, ...)))
  return(max_diff * sqrt(n))
}

# 定义重复模拟Dₙ的函数:重复B次,每次生成n个样本计算Dₙ
simulate_Dn <- function(n, B = 1000, dist, ...) {
  replicate(B, compute_Dn(n, dist, ...))
}

# --------------------------
# 1. 验证n→∞时Dₙ存在极限分布
# --------------------------
set.seed(123) # 设置随机种子保证可复现
n_list <- c(100, 1000, 5000)
sim_results <- lapply(n_list, function(n) simulate_Dn(n, B=1000, dist="rnorm", mean=0, sd=1))

pdf(file="Dn_limit_dist.pdf", width=10, height=8)
par(mfrow=c(2,2), mar=c(4,4,2,1))
for (i in seq_along(n_list)) {
  hist(sim_results[[i]], breaks=seq(0, 3, 0.2), col="cyan1", 
       main=TeX(paste0("$n = ", n_list[i], "$")),
       xlab=TeX("$D_n$"), xlim=c(0,3), freq=FALSE)
  # 叠加Kolmogorov极限分布的密度曲线
  ks_density <- function(x) {
    sum(sapply(1:100, function(k) (-1)^(k-1)*2*exp(-2*k²*x²)))
  }
  curve(sapply(x, ks_density), from=0, to=3, col="red", lwd=2, add=TRUE)
}
dev.off()

# --------------------------
# 2. 验证Dₙ渐近分布与F(x)无关
# --------------------------
set.seed(456)
n_fixed <- 3000
# 三种不同分布的模拟结果
norm01 <- simulate_Dn(n_fixed, B=1000, dist="rnorm", mean=0, sd=1)
norm504 <- simulate_Dn(n_fixed, B=1000, dist="rnorm", mean=50, sd=2) # 对应方差4
exp1 <- simulate_Dn(n_fixed, B=1000, dist="rexp", rate=1)

pdf(file="Dn_dist_independent_F.pdf", width=8, height=10)
par(mfrow=c(3,1), mar=c(4,4,2,1))
# 正态N(0,1)
hist(norm01, breaks=seq(0,3,0.2), col="cyan1", 
     main="N(0,1) 样本的Dₙ分布", xlab=TeX("$D_n$"), xlim=c(0,3), freq=FALSE)
curve(sapply(x, ks_density), from=0, to=3, col="red", lwd=2, add=TRUE)
# 正态N(50,4)
hist(norm504, breaks=seq(0,3,0.2), col="cyan1", 
     main="N(50,4) 样本的Dₙ分布", xlab=TeX("$D_n$"), xlim=c(0,3), freq=FALSE)
curve(sapply(x, ks_density), from=0, to=3, col="red", lwd=2, add=TRUE)
# 指数EXP(1)
hist(exp1, breaks=seq(0,3,0.2), col="cyan1", 
     main="EXP(1) 样本的Dₙ分布", xlab=TeX("$D_n$"), xlim=c(0,3), freq=FALSE)
curve(sapply(x, ks_density), from=0, to=3, col="red", lwd=2, add=TRUE)
dev.off()

结果说明

  1. 极限分布验证:随着n从100增大到5000,$Dₙ$的直方图逐渐逼近红色的Kolmogorov极限分布曲线,说明n→∞时$Dₙ$收敛到该极限分布。
  2. 分布无关性验证:N(0,1)、N(50,4)、EXP(1)三种分布对应的$Dₙ$直方图几乎完全重合,且都贴合Kolmogorov极限分布曲线,证明$Dₙ$的渐近分布与原分布$F(x)$无关。

内容的提问来源于stack exchange,提问作者Ianna

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 04:55:22