【回归分析】[6]--残差分析

【回归分析】[6]--残差分析


  在这一节,我们讨论一下关于残差的问题。主要是为了验证四个假设。
 
  1. 关于模型形式的假定:模型关于参数是线性的-- 通过观察Y-- X的散点图;
  2. 关于误差的假定:a.方差服从正太分布    b.均值为0     c.方差相同      d.误差相互独立-- pp图;
  3. 关于预测变量的假定 : a.预测变量是非随机的    b.数据是无误差的  c.预测变量线性无关;
  4. 关于观测的假定 : 影响力相同;




  这一次,我们就要之前的一个例子来做解释。Mathematica数据处理(1)--安斯库母四重奏

 
datafrash = {{{10., 8.04}, {8., 6.95}, {13., 7.58}, {9., 8.81}, {11., 
     8.33}, {14., 9.96}, {6., 7.24}, {4., 4.26}, {12., 10.84}, {7., 
     4.82}, {5., 5.68}}, {{10., 9.14}, {8., 8.14}, {13., 8.74}, {9., 
     8.77}, {11., 9.26}, {14., 8.1}, {6., 6.13}, {4., 3.1}, {12., 
     9.13}, {7., 7.26}, {5., 4.74}}, {{10., 7.46}, {8., 6.77}, {13., 
     12.74}, {9., 7.11}, {11., 7.81}, {14., 8.84}, {6., 6.08}, {4., 
     5.39}, {12., 8.15}, {7., 6.42}, {5., 5.73}}, {{8., 6.58}, {8., 
     5.76}, {8., 7.71}, {8., 8.84}, {8., 8.47}, {8., 7.04}, {8., 
     5.25}, {19., 12.5}, {8., 5.56}, {8., 7.91}, {8., 6.89}}};
这个是数据
data = SortBy[datafrash[[#]], First] & /@ {1, 2, 3, 4};
lm = LinearModelFit[#, x, x] & /@ data
我们对四组数据一起处理
Show[ListPlot[data[[#]], ImageSize -> Medium], 
   Plot[lm[[#]][x], {x, 0, 20}, ImageSize -> Medium]] & /@ {1, 2, 3,4}
先画出拟合的效果图
我们可以认为
对于2--要能从残差看出y-x不成线性关系
对于3--倒数第二个点是强影响点
对于4--最后一个点称为强影响点(杠杆值大,残差小)

看一下三种残差图-- 残差,标准化残差,删除单个误差的残差
(*残差,标准化残差,删除单个误差的残差*)
cc = lm[[#]]["FitResiduals"] & /@ {1, 2, 3, 4};
Row[ListPlot[#, ImageSize -> Medium, Filling -> Axis] & /@lm[[#]][{"FitResiduals", "StandardizedResiduals","StudentizedResiduals"}]] & /@ {1, 2, 3, 4}
只有当 残差图是杂乱的,没有规律的,才说明残差符合正态分布
可以看到除了第一个,其他三个的残差图都有一定的规律。
直观看拟合的图也是能看出问题的


接下来,我们来检验残差是否符合正太分布--pp图和qq图
Row[{ProbabilityPlot[cc[[#]], PlotLabel -> "pp图", PlotRange -> All, ImageSize -> Medium],QuantilePlot[cc[[#]], PlotLabel -> "qq图", PlotRange -> All,ImageSize -> Medium]}] & /@ {1, 2, 3, 4}



接下来要看一下 杠杆值和残差的大小,有两种方法--库克距离和Hadi‘s距离,可以看到影响力的大小
ListPlot[lm[[#]]["CookDistances"], Filling -> Axis,ImageSize -> Medium, PlotRange -> Full] & /@ {1, 2, 3, 4}

那些较大值对应的点都是有问题的点,可以看到,用库克距离成功找到了第三张图的第10个点和第四张图的第十一个点

下面我们看一下Hadi‘s距离
hat = lm[[#]]["HatDiagonal"] & /@ {1, 2, 3, 4};
cc = lm[[#]]["FitResiduals"] & /@ {1, 2, 3, 4};
degreeoffree = 
  lm[[#]]["ANOVATableDegreesOfFreedom"][[-3]] & /@ {1, 2, 3, 4};
SSE = lm[[#]]["ANOVATableSumsOfSquares"][[-2]] & /@ {1, 2, 3, 4};
hadi  = hat[[#]]/(1 - 
        hat[[#]]) + ((degreeoffree[[#]] + 1)/(1 - 
          hat[[#]]))*((cc[[#]]^2)/(SSE[[#]] - cc[[#]]^2)) & /@ {1, 2, 
    3, 4};
ListPlot[hadi[[#]], Filling -> Axis, ImageSize -> Medium, 
   PlotRange -> All] & /@ {1, 2, 3, 4}
同样可以看到异常点。下面我们把异常点删选出来
(*找到异常点的位置*)
Position[hadi, _?(# > 1 &)]

(*提取数据点*) 
Extract[data, %]
这样就可以找到异常点了,但是,最好的方法还是看残差图

以上,所有
2016/10/30


转载于:https://www.cnblogs.com/wmn7q/p/7265546.html

  • 0
    点赞
  • 0
    评论
  • 8
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值