如何计算 MATLAB wblplot 概率图的 R²?
可以在线性化坐标下对 Weibull 概率图进行线性回归,并计算 R²。wblplot 也能返回图形句柄,用于读取绘图数据。回归得到的 R² 衡量的是变换后散点的线性程度,不能直接证明数据服从 Weibull 分布。
获取 wblplot 的绘图数据
wblplot 返回线对象句柄。对于题目中的单列向量,这些句柄分别对应散点、连接第一和第三四分位数的参考线,以及参考线的延长线。图中默认的参考线由四分位数确定,并非最小二乘回归线。MathWorks wblplot 文档
rng('default') % For reproducibility
r = wblrnd(1.2,1.5,50,1);
h = wblplot(r);
% 单列输入对应的第一个句柄表示数据点
xData = get(h(1),'XData');
yData = get(h(1),'YData');
这些属性保存了图形对象的绘图数据。概率图涉及坐标变换和非线性刻度,不能仅凭坐标轴显示的概率标签,就把读取到的数值作为普通直角坐标交给 fitlm。从原始样本重建线性化坐标,可以明确 R² 的计算含义。
重建坐标并计算 R²
对于正值样本,先将样本排序为 x,再使用绘图位置 p_i = (i - 0.5)/n。这是 wblplot 使用的经验累计概率中点规则。MathWorks 算法说明
两参数 Weibull 分布满足:
F(x) = 1 - exp(-(x/a)^b)
log(-log(1-F(x))) = b*log(x) - b*log(a)
其中 a > 0 是尺度参数,b > 0 是形状参数。根据 Weibull 的累计分布函数,可以直接推得这一变换,并对 X = log(x) 和 Y = log(-log(1-p)) 做线性回归。MathWorks Weibull 分布定义
接着上面的示例运行:
assert(isreal(r) && all(isfinite(r(:))) && all(r(:) > 0), ...
'Data must be real, finite, and strictly positive.');
x = sort(r(:));
n = numel(x);
assert(n >= 3 && x(end) > x(1), ...
'At least three observations and nonconstant data are required.');
p = ((1:n)' - 0.5) / n;
X = log(x);
Y = log(-log1p(-p));
mdl = fitlm(X,Y);
R2 = mdl.Rsquared.Ordinary;
disp(R2)
log1p(-p) 用于计算 log(1-p),在 p 较小时可以减少数值精度损失。mdl.Rsquared.Ordinary 返回普通决定系数,即 1 - SSE/SST。MathWorks LinearModel 文档
这里计算的 R² 来自重新拟合的最小二乘直线,图中的参考线则由四分位数确定。报告结果时,应说明这是 Weibull 概率图变换坐标下线性回归的 R²。
如果目的是检验 Weibull 分布
R² 越接近 1,上述变换后的散点就越接近直线,但没有通用的 R² 阈值可以确认数据服从 Weibull 分布。排序后的点也不满足普通回归中独立误差的常规前提,因此不要直接用该回归的显著性检验来判断分布是否成立。
对于独立、连续、未删失的正值样本,可以补充 Lilliefors 检验。MathWorks 给出的做法是检验 log(r) 是否服从 extreme value 分布:MathWorks lillietest 文档
[hTest,pValue] = lillietest(log(r(:)), ...
'Distribution','extreme value','Alpha',0.05);
这里,hTest = 1 表示在 5% 显著性水平下拒绝 Weibull 分布假设;hTest = 0 表示未能拒绝该假设,不能解释为已经证明数据服从该分布。实际判断时,还应检查概率图是否存在系统性弯曲或尾部偏离。
备注:内容仅供参考。
