如何用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()
结果说明
- 极限分布验证:随着n从100增大到5000,$Dₙ$的直方图逐渐逼近红色的Kolmogorov极限分布曲线,说明n→∞时$Dₙ$收敛到该极限分布。
- 分布无关性验证:N(0,1)、N(50,4)、EXP(1)三种分布对应的$Dₙ$直方图几乎完全重合,且都贴合Kolmogorov极限分布曲线,证明$Dₙ$的渐近分布与原分布$F(x)$无关。
内容的提问来源于stack exchange,提问作者Ianna
相关产品推荐
相关产品推荐

