理解R语言QQ图样本量影响:基于Boston数据集的绘图及函数用法咨询
核心实现方案
你观察到的qqnorm()没有n参数是完全正确的——这个函数本身的设计逻辑就不支持直接指定参考样本量,所有参考分位都由传入的待检验样本长度自动匹配生成,没法自定义参考样本的大小。
要实现“对比不同正态参考样本量下crim变量的QQ图变化、排布3行1列绘图”的需求,可以直接用通用的qqplot()函数实现,完整可运行代码如下:
# 加载依赖包与数据集 library(MASS) # 提取目标分析变量 crim_vec <- Boston$crim # 设置3行1列的纵向绘图布局 par(mfrow = c(3, 1), mar = c(4, 4, 3, 1)) # 生成不同样本量的正态随机参考样本 ref_n10 <- rnorm(10) ref_n100 <- rnorm(100) ref_n1000 <- rnorm(1000) # 依次绘制三张QQ图:x轴为正态参考样本的分位数,y轴为crim变量的经验分位数 qqplot(ref_n10, crim_vec, main = "正态参考样本量n=10", xlab = "参考分布分位数", ylab = "crim经验分位数") abline(0, 1, col = "red") # 叠加y=x参考线,方便判断分布偏离程度 qqplot(ref_n100, crim_vec, main = "正态参考样本量n=100", xlab = "参考分布分位数", ylab = "crim经验分位数") abline(0, 1, col = "red") qqplot(ref_n1000, crim_vec, main = "正态参考样本量n=1000", xlab = "参考分布分位数", ylab = "crim经验分位数") abline(0, 1, col = "red")
你目前采用的“用rnorm生成不同长度正态样本传入qqplot”的核心逻辑是完全可行的,仅存在两处细节可优化:
- 绘图布局不匹配需求:你需要的是3行1列的纵向排布,之前代码设置的
par(mfrow = c(1,3))是1行3列的横向排布,需要调整参数为c(3,1)。- 参数顺序不符合通用读图习惯:
qqplot(x, y)的实现规则是第一参数对应x轴样本、第二参数对应y轴样本。常规读图逻辑是把参考分布放在x轴、待检验的目标样本放在y轴。你之前将Boston$crim放在第一参数、正态参考样本放在第二参数的写法,虽然因为两个分布互换坐标轴后散点图只是镜像对称,不影响“判断分布是否一致”的核心目的,但不符合通用阅读习惯,其他用户看你的图时需要反向对应坐标。
函数差异说明
两个函数的定位和适用场景有明确区分,没有重叠:
qqnorm()是专门面向单样本正态性检验的简化工具。它不需要用户手动生成参考样本,内部直接根据传入的待检验样本长度,计算无随机误差的理论正态分位数,直接绘制“样本经验分位数-理论正态分位数”的散点图。它没有n参数是设计使然——它的参考分位数永远和待检验样本的长度一一对应,目的是给手里固定的样本做正态性判断,不是用来调整参考基准的大小。qqplot()是无绑定的通用双样本分布对比工具。它不预设任何特定分布,只要传入两个数值向量(可以是真实观测数据,也可以是任意分布生成的随机数),就会自动把两个向量的经验分位数插值配对,绘制分位散点图,用来对比两个分布的位置、尺度、形状差异。你想调整参考分布的样本量、换其他分布做参考,都可以通过自定义传入向量实现,灵活性远高于qqnorm()。
预期观察规律
运行上述代码后会直观看到和样本量相关的QQ图变化:
- 当参考样本n=10时,因为随机抽样的样本量太小,分位数的随机波动非常大,散点抖动感很强,参考线附近的离散点很多,最终图上的配对散点总数只有10个。
- 当参考样本n=100时,分位数的随机波动明显收窄,散点更接近平滑的参考趋势,最终图上的配对散点总数为100个。
- 当参考样本n=1000时,参考样本的经验分位数已经非常接近正态分布的理论分位数,因为crim总共有506个观测,插值配对后的散点总数为506个,此时画出的QQ图和直接用
qqnorm(Boston$crim)得到的效果几乎没有差别。
内容的提问来源于stack exchange,提问作者snicksnackpaddywhack91
相关产品推荐
相关产品推荐

