使用R语言ggplot2绘制N(0,1)的CDF与样本ECDF并求二者最大距离
R语言实现ECDF/CDF绘制及分布最大距离计算
第一步:加载依赖包并生成样本数据
首先加载绘图需要的ggplot2包,生成指定的样本数据,这里加set.seed保证运行结果可复现,不需要可以删除:
library(ggplot2) # 固定随机种子,结果可复现 set.seed(123) x <- rnorm(50, 1, 1)
第二步:计算两个分布的最大距离
你需要的两个分布的最大垂直距离就是Kolmogorov-Smirnov(KS)检验的统计量,直接调用内置函数计算即可:
# 对比样本分布与标准正态N(0,1)的KS检验 ks_res <- ks.test(x, "pnorm", mean = 0, sd = 1) max_dist <- ks_res$statistic # 输出最大距离,保留4位小数 cat("两个分布的最大距离:", round(max_dist, 4), "\n")
如果需要手动验证结果,可以用以下代码,输出结果和KS检验返回的统计量完全一致:
# 手动计算验证最大距离 sample_ecdf <- ecdf(x)(x) theory_cdf <- pnorm(x, 0, 1) manual_max <- max(abs(sample_ecdf - theory_cdf))
第三步:ggplot2绘制对比图
直接用ggplot2的内置图层分别绘制样本ECDF和理论CDF,用颜色和线型区分:
ggplot(data.frame(val = x), aes(x = val)) + # 绘制样本ECDF阶梯曲线 stat_ecdf(geom = "step", aes(color = "样本ECDF"), linewidth = 1) + # 绘制标准正态理论CDF虚线 stat_function(fun = pnorm, args = list(mean = 0, sd = 1), aes(color = "标准正态CDF"), linewidth = 1, linetype = 2) + # 标签设置 labs( x = "变量取值", y = "累积概率", color = "分布类型", title = paste0("分布对比(最大距离:", round(max_dist, 4), ")") ) + # 配色和主题调整 scale_color_manual(values = c("样本ECDF" = "darkblue", "标准正态CDF" = "firebrick")) + theme_bw()
内容的提问来源于stack exchange,提问作者Statistical scientist
相关产品推荐
相关产品推荐

