如何在R语言中绘制Box-Cox变换后的Exp(1000)样本与Weib(5,1000)分布的Q-Q图
如何在R语言中绘制Box-Cox变换后的Exp(1000)样本与Weib(5,1000)分布的Q-Q图
嘿,我看你遇到了QQ图绘制的问题,核心原因是对QQ图的逻辑理解有点偏差——我们要对比的是样本的经验分位数和理论分布的分位数,而不是两个随机样本的分位数。你之前用rweibull生成了另一个Weibull随机样本z,这其实是拿两个随机数据集做对比,不是我们要的「样本vs理论分布」的QQ图。
我来一步步帮你修正代码,顺便解释每一步的逻辑:
第一步:确认参数定义(很重要!)
首先要注意R里分布函数的参数定义:
rexp(n, rate)的rate是指数分布的率参数λ,如果你说的Exp(1000)是指尺度参数θ=1000(即均值为1000),那应该写成rexp(500, 1/1000);如果就是率参数λ=1000(均值为1/1000),那你的写法没问题。这里先按你的代码来,记得根据实际需求调整。- Weibull分布的
qweibull(p, shape, scale)对应Weib(shape, scale),你说的Weib(5,1000)正好对应shape=5、scale=1000,这个是对的。
第二步:生成数据与变换(你的这部分是对的)
先保留你生成样本和做Box-Cox变换的代码:
set.seed(123) # 固定随机种子,保证结果可复现 x <- rexp(500, 1000) lambda <- 0.2 y <- (x ^ lambda - 1) / lambda
第三步:计算理论分位数与样本分位数
QQ图的关键是让样本的每个分位数点,对应理论分布相同概率位置的分位数:
- 用
ppoints(n)生成合适的概率点,这个函数会生成n个均匀分布的概率值,适合用来匹配样本分位数(默认用(i-0.5)/n的方式,避免概率取0或1)。 - 用
qweibull()计算这些概率点对应的Weibull理论分位数。 - 对变换后的样本y排序,得到经验分位数(排序后的样本值就是样本的分位数)。
代码如下:
n <- length(y) # 生成匹配样本分位数的概率点 prob_points <- ppoints(n) # 计算Weibull(5,1000)的理论分位数 weib_theoretical_quantiles <- qweibull(prob_points, shape=5, scale=1000) # 对样本y排序,得到经验分位数 sorted_y <- sort(y)
第四步:绘制QQ图并添加参考线
现在就可以把理论分位数和样本分位数画在一起,再添加一条参考线(用线性回归拟合的直线,帮助判断拟合程度):
# 绘制QQ图 plot(weib_theoretical_quantiles, sorted_y, xlab="Weibull(5,1000) 理论分位数", ylab="Box-Cox变换后的Exp样本分位数", main="Box-Cox变换样本 vs Weibull(5,1000) Q-Q图", pch=16, col="#2E86AB") # 调整点的样式和颜色,让图更好看 # 添加拟合参考线 abline(lm(sorted_y ~ weib_theoretical_quantiles), col="#E74C3C", lwd=2)
为什么你的原代码有问题?
你之前用rweibull(500,5,1000)生成了另一个随机样本z,这时候qqplot(z,y)是在对比两个随机数据集的分位数分布,本质是「样本vs样本」的对比,而不是我们需要的「样本vs理论分布」的QQ图——后者必须用理论分布的分位数函数(qweibull)来计算对应概率点的分位数,这样才能准确判断样本是否符合目标理论分布。
备注:内容来源于stack exchange,提问作者M.Ramana
相关产品推荐
相关产品推荐

