How to| 绘制拟合模型的诊断量
诊断量是分析数据模型的重要组成部分. 残差和杠杆率度量(或称影响度量)的图形为判断模型的假设是否合理、 是否有个别数据点对拟合产生过度影响等提供颇有价值的见解. 通过使用诸如 LinearModelFit 等函数提供的结果并结合内置绘图函数,可以在 Wolfram 语言中创建这类图形.
data1 = {{1.36, 15.36}, {1.69, 16.12}, {4.91, 104.62}, {4.85, 110.06}, {4.41, 99.07}, {2.15, 23.83}, {2.98, 48.86}, {1.19, 16.29}, {4.08, 79.91}, {0.05, 0.89}, {3.69, 70.13}, {2.34, 32.07}, {2.32, 29.39}, {1.77, 26.41}, {0.47, 6.64}};线性模型指的是有待估计的参数为线性的模型. 形如
的模型中
为二次,但对于参数
、
和
而言是一个线性模型.
使用 LinearModelFit 拟合模型:
lm = LinearModelFit[data1, {x, x ^ 2}, x]您可以计算
取一定值时的 FittedModel 对象,拟合后的曲线可以通过用 Plot 绘制函数 lm[x] 的图形来得到.
p1 = Plot[lm[x], {x, 0, 5}]您可以使用 ListPlot 绘制数据,并使用 Show 显示数据以及拟合曲线:
Show[ListPlot[data1], p1]您可以要求 FittedModel 对象给出一定数量的诊断量和结果.
对于一个线性模型而言,残差应该与白噪音很相似,服从均值为0和一个固定的方差值的随机正态分布. 如果残差值有任何趋势,则表示模型可能需要修正.
将属性 "FitResiduals" 与 FittedModel 对象(lm)一起使用来获得并绘制每个数据点的残差:
ListPlot[lm["FitResiduals"]]与其它任何图形相同,您可以使用另外的选项来添加边框、标签与填充等特色.
使用 Frame 选项在残差图周边添加边框,并使用 Filling 选项画出从点到轴的连线:
ListPlot[lm["FitResiduals"], Frame -> True, Filling -> Axis]标准化图形非常有用,因为它们能够有效去除残差中的整体尺度. 对于线性和非线性回归,标准化残差看上去应该与方差为1的白噪音相似.
ListPlot[lm["StandardizedResiduals"], Frame -> True, Filling -> Axis]前面的图形显示的是每个数据点的残差,将残差值与预测变量对应画出也很有用. 在下面的例子中,
是预测变量.
通过组建数据值与相关残差的数对,您可以绘制残差相对与一个预测变量的图形. 预测值是 data 中各个数据点的第一个元素:
xvals = data1[[All, 1]]使用 Transpose 组建
值与残差的数对,然后使用 ListPlot 绘制这些数对:
ListPlot[Transpose[{xvals, lm["FitResiduals"]}]]ListPlot[Transpose[{data1[[All, 1]], lm["FitResiduals"]}], Frame -> True, Filling -> 0, FrameLabel -> {"x", "residual"}, PlotLabel -> "Residual vs. Predictor"]相似地,也可以绘出数据集中点的影响或杠杆率度量,以评估个别数据点是否对拟合有过度影响.
例如,您可以绘制各个数据点的库克距离. 库克距离为点对整体拟合的影响提供了一种度量方法:
ListPlot[lm["CookDistances"], Filling -> 0]其它点式诊断量包括 "FitDifferences" 与 "BetaDifferences",常常分别称作 DFFITS 与 DFBETAS. 这些值常被可视化,以评估其它类型的影响.
绘制 "FitDifferences" 提供了度量各点对预测值影响的一种方式:
ListPlot[lm["FitDifferences"], Filling -> 0]诊断图形的获取与使用 NonlinearModelFit、GeneralizedLinearModelFit、LogitModelFit 和 ProbitModelFit 拟合非线性和广义线性模型的方式相似.
data2 = {{1.36, 15.36}, {1.69, 16.12}, {4.91, 104.62}, {4.85, 110.06}, {4.41, 99.07}, {2.15, 23.83}, {2.98, 48.86}, {1.19, 16.29}, {4.08, 79.91}, {0.05, 0.89}, {3.69, 70.13}, {2.34, 32.07}, {2.32, 29.39}, {1.77, 26.41}, {0.47, 6.64}};例如,将 Exp 用于 NonlinearModelFit,对数据进行指数模型的拟合:
nlm = NonlinearModelFit[data2, a Exp[b + c x ^ (1 / 2)], {a, b, c}, x]您可再次使用 ListPlot 和 Plot 制作拟合的视图:
Show[ListPlot[data2], Plot[nlm[x], {x, 0, 5}]]正如在线性范例中所示,您也可利用 ListPlot 画出如残差等点式诊断量:
ListPlot[nlm["FitResiduals"], Filling -> 0]下面的例子拟合一个形如
的模型,但假定响应变量(数据中的
值)服从逆高斯分布. 这通过将 GeneralizedLinearModelFit 的选项 ExponentialFamily 设为 "InverseGaussian" 实现:
glm = GeneralizedLinearModelFit[data2, {x, x ^ 2}, x, ExponentialFamily -> "InverseGaussian", LinkFunction -> Identity]与线性和非线性回归模型不同,误差的方差不再是常数. 对于一个逆高斯模型,误差将随着响应值的增加而增加.
各种变形的残差可使用这些模型,您可能希望同时看到多. 首先,指定您想要一起查看的残差:
glmresids = glm[{"FitResiduals", "AnscombeResiduals", "PearsonResiduals", "StandardizedPearsonResiduals"}];正如在线性和非线性回归中一样,"FitResiduals" 是响应值与预测值之差. "AnscombeResiduals" 将拟合残差变形,使其接近假定分布的常态噪声. "PearsonResiduals" 基于各点的估计方差调整尺度,而 "StandardizedPearsonResiduals" 则根据整体方差调整尺度.
labels = {"fit", "Anscombe", "Pearson", "standardized Pearson"};为不同类型的残差建立图形,并将每一个加上标签. 这里的输出通过分号 (;) 抑制,图形显示在下一步的网格中:
plots = MapThread[ListPlot[#1, Frame -> True, PlotLabel -> #2]&, {glmresids, labels}];用 Partition 生成一个 2×2 数组,并使用 GraphicsGrid 在一个网格中显示图形:
GraphicsGrid[Partition[plots, 2], ImageSize -> 400, PlotLabel -> "Types of Residuals"]