欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用R语言进行回归诊断

程序员文章站 2022-07-14 19:39:09
...

人们提出所谓回归诊断的问题,其主要内容有:

  • 关于误差项是否满足:独立性、等方差性、正态性。
  • 选择线性模型是否合适
  • 是否存在异常样本
  • 回归分析的结果是否对某些样本依赖过重,也就是回归模型是否具有稳定性
  • 自变量之间是否存在高度相关,即是否存在多重共线性

下面我们通过一个小例子来大体认识一下回归诊断的重要性。

一、使用散点图显示变量之间的关系及修正过程:

Anscombe<-data.frame(
  X =c(10.0, 8.0, 13.0, 9.0, 11.0, 14.0, 6.0, 4.0, 12.0, 7.0, 5.0),
  Y1=c(8.04, 6.95, 7.58, 8.81, 8.33, 9.96, 7.24, 4.26, 10.84, 4.82, 5.68),
  Y2=c(9.14, 8.14, 8.74, 8.77, 9.26, 8.10, 6.13, 3.10, 9.13, 7.26, 4.74),
  Y3=c(7.46, 6.77, 12.74, 7.11, 7.81, 8.84, 6.08, 5.39, 8.15, 6.44, 5.73),
  X4=c(rep(8,7), 19, rep(8,3)),
  Y4=c(6.58, 5.76, 7.71, 8.84, 8.47, 7.04, 5.25, 12.50, 5.56, 7.91, 6.89)
)

#这里y1,y2,y3是x的因变量,y4是x4的因变量,我们来查看两者之间的关系
summary(lm(Y1~X,data=Anscombe))
summary(lm(Y2~X,data=Anscombe))
summary(lm(Y3~X,data=Anscombe))
summary(lm(Y4~X4,data=Anscombe))

#通过查看变量间的线性模型概况,我们发现这四组数据模型的p值以及模型系数均能通过显著性检验
#但同时我们看到四个模型的R方值都在60%左右,不算理想

#接下来,我们通过绘制这个模型相应的散点图,以及其拟合曲线,来查看是否满足线性关系
par(mfrow=c(2,2)) #将屏幕分为2*2的矩阵
plot(Y1~X,data=Anscombe,main="Y1~X",xlab="",ylab="");abline(lm(Y1~X,data=Anscombe))
plot(Y2~X,data=Anscombe,main="Y2~X",xlab="",ylab="");abline(lm(Y2~X,data=Anscombe))
plot(Y3~X,data=Anscombe,main="Y3~X",xlab="",ylab="");abline(lm(Y3~X,data=Anscombe))
plot(Y4~X4,data=Anscombe,main="Y4~X4",xlab="",ylab="");abline(lm(Y4~X4,data=Anscombe))
使用R语言进行回归诊断

#我们首先对图二模型进行更新,更新为可能的二次多项式
attach(Anscombe) #表示下面的代码可以直接取Anscombe中的变量名,不必加$
X2<-X^2
lm.new<-lm(Y2~X+X2,data=Anscombe)
coef(lm.new)
x<-seq(min(X),max(X),by=0.1)
y<-b[1]+b[2]*x+b[3]*x^2
plot(c(3,20), c(3,13), type="n", xlab = "X", ylab = "Y")
points(X,Y2)
lines(x,y)

summary(lm.new)
#通过查看summary,我们看到通过二次多项式拟合之后的模型R方值为1,即完全拟合
# > summary(lm.new)
# 
# Call:
#   lm(formula = Y2 ~ X + X2, data = Anscombe)
# 
# Residuals:
#   Min         1Q     Median         3Q        Max 
# -0.0013287 -0.0011888 -0.0006294  0.0008741  0.0023776 
# 
# Coefficients:
#   Estimate Std. Error t value Pr(>|t|)    
# (Intercept) -5.9957343  0.0043299   -1385   <2e-16 ***
#   X            2.7808392  0.0010401    2674   <2e-16 ***
#   X2          -0.1267133  0.0000571   -2219   <2e-16 ***
#   ---
#   Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
# 
# Residual standard error: 0.001672 on 8 degrees of freedom
# Multiple R-squared:      1,	Adjusted R-squared:      1 
# F-statistic: 7.378e+06 on 2 and 8 DF,  p-value: < 2.2e-16
使用R语言进行回归诊断
#对于图三和图四中因为异常点拟合有误的情况,需要去除异常点重新进行拟合,比如图三
#我们发现是第三个点(13.0.12.74)为异常点,我们将其排除

lm3.new<-lm(Y3[-3]~X[-3],data=Anscombe)
plot(X,Y3)
abline(lm3.new)
使用R语言进行回归诊断
二、查看残差值:

#关于残差,我们可以通过residuals(object)来查看残差值,其中object是回归方程对象。
residuals(lm3.new)
# 1             2             3             4             5             6             7             8 
# -0.0010606061 -0.0009740260 -0.0060173160  0.0038961039 -0.0012337662 -0.0008874459 -0.0008008658 -0.0011471861 
# 9            10 
# 0.0140692641 -0.0058441558 
#通过plot(object)的方法可以查看回归模型的残差图,命令执行之后共有四个图:
#1、表示普通残差与拟合值的残差图
#2、表示画残差图的QQ图
#3、画标准化残差的开方与拟合值的残差图
#4、表示画Cook统计量的残差图
三、发现多重共线性

什么是多重共线性,如果存在常数C1、C2、C3使得线性等式成立:C1X1+C1X2=C3
则认为变量X1和X2之间存在精确的多重共线性,但是这种情况出现基本是偶然的,如果等式换为约等式,则说明有一定程度的共线性。
在R语言中,通常用cor函数和kappa函数配合来发现变量之间的多重共线性。

最终计算的kappa值与多重共线性的关系如下:

  • kappa<100则认为有共线性程度很小。
  • 100<=kappa<=1000则认为存在中等程度或者较强的共线性。
  • 若kappa>1000则认为存在很严重的共线性

下边举例说明其应用:

collinear<-data.frame(
   Y=c(10.006, 9.737, 15.087, 8.422, 8.625, 16.289, 
        5.958, 9.313, 12.960, 5.541, 8.756, 10.937),
   X1=rep(c(8, 0, 2, 0), c(3, 3, 3, 3)), 
   X2=rep(c(1, 0, 7, 0), c(3, 3, 3, 3)),
   X3=rep(c(1, 9, 0), c(3, 3, 6)),
   X4=rep(c(1, 0, 1, 10), c(1, 2, 6, 3)),
   X5=c(0.541, 0.130, 2.116, -2.397, -0.046, 0.365,
        1.996, 0.228, 1.38, -0.798, 0.257, 0.440),
   X6=c(-0.099, 0.070, 0.115, 0.252, 0.017, 1.504,
        -0.865, -0.055, 0.502, -0.399, 0.101, 0.432)
)
XX<-cor(collinear[2:7])
kappa(XX,exact=TRUE)
# [1] 2195.908

eigen(XX)

# > eigen(XX) 输出相关系数矩阵的特征值和特征向量
# eigen() decomposition
# $values
# [1] 2.428787365 1.546152096 0.922077664 0.793984690 0.307892134 0.001106051
# 
# $vectors
#         [,1]        [,2]        [,3]        [,4]       [,5]         [,6]
# [1,] -0.3907189  0.33968212  0.67980398 -0.07990398  0.2510370 -0.447679719
# [2,] -0.4556030  0.05392140 -0.70012501 -0.05768633  0.3444655 -0.421140280
# [3,]  0.4826405  0.45332584 -0.16077736 -0.19102517 -0.4536372 -0.541689124
# [4,]  0.1876590 -0.73546592  0.13587323  0.27645223 -0.0152087 -0.573371872
# [5,] -0.4977330  0.09713874 -0.03185053  0.56356440 -0.6512834 -0.006052127
# [6,]  0.3519499  0.35476494 -0.04864335  0.74817535  0.4337463 -0.002166594

#通过eigen函数可以看到相关系数矩阵中的最小特征值和特征向量,取最小特征值value=0.001106051
#此时的特征向量为

# [,6]
# -0.447679719
# -0.421140280
# -0.541689124
# -0.573371872
# -0.006052127
# -0.002166594

#意味着-0.447679719x1-0.421140280x2-0.541689124x3-0.573371872x4-0.006052127x5-0.002166594x6≈0
#x5和x6系数约等于0,所以可以基本认为-0.447679719x1-0.421140280x2-0.541689124x3-0.573371872x4≈0