采用最小二乘法进行线性回归时,需要满足特定的条件:
正态性:一定范围内,给定任意x值,对应的y均服从正态分布
独立:即误差项间不存在相关,一般时间序列数据会存在自相关
线性:因变量和自变量有线性关系
同方差性:即模型误差项的方差相等。
这些假设都与误差项有关,所以我们可以从误差的估计量残差来解决,即我们常用到的残差分析、残差图等。残差图就是以某种残差(残差、标准化残差、学生化残差等)为纵坐标,以任何其他的量为横轴的散点图,如果数据能较好满足回归条件,那么残差图会是一个在水平线周围随机均匀分布的散点图。另外我们也可通过假设检验的手段进行回归诊断。
残差图诊断
1.正态性:如果满足此条件,那么残差值将服从正态分布。可以采用残差的qq图来判断
2.线性:可以采用残差和预测值散点图,如果满足线性,那么残差值与预测值没有任何关联。
3.同方差性:可以看学生化残差图和预测值的散点图,如果满足同方差性假设,那么散点大致落在±2的区域,且不呈任何趋势。
对于回归中的残差诊断图,SAS程序会自动生成并展示在结果里。
假设检验诊断:
正太性:可以输出残差,使用univariate过程步进行正态检验。或者使用transreg过程box-cox转换方法
同方差性:SAS里提供white检验和bp法。
线性:可以使用网上的boxTdiwell变换的宏程序。该宏的运行还需使用另外一个gskip宏程序才能运行。两个宏程序下载地址:
boxTdiwell:http://www.datavis.ca/sas/macros/boxtid.sas
gskip:http://www.datavis.ca/sas/macros/util/gskip.sas
自相关:DW检验,SAS程序里加入dw选项,后文不再介绍
下面我们使用sashelp.class的数据拟合一个简单线性回归模型进行说明。
拟合模型:
proc reg data=sashelp.class; model height=age;run;
一、SAS生成的部分诊断图(rstudent为学生化残差):可以看出基本满足回归条件
二、假设检验诊断程序:
1.正态性
程序:
*正态box-cox变换;proc transreg data=sashelp.class test; model BoxCox(height) = identity(age);run;
结果:
可以看到参数lambda=1(lamabda=1表示不转换,lambda=0时表示对因变量进行对数转换,转换的规则为y的lambda次方)在95%的置信区间内,可以认为满足正态的条件,不考虑进行转换。如果转换,lambda的值可以考虑取红色方块的值。
2.线性
程序:
*载入两个宏程序,boxTidwell线性检验与转换;%INCLUDE "C:\Users\Administrator\Desktop\boxTidwell.sas";%INCLUDE "C:\Users\Administrator\Desktop\gskip.sas";%boxtid(data=sashelp.class,yvar=height,xvar=age,xtrans=age,id=name)
结果:
可以看出结果p=0.7282,可以认为满足线性,如果p<0.05,则使用power的值对自变量进行转换,因为power的值接近-0.5,所以它建议使用-0.5次方(0.5次方即开根号)进行转换,该处理方法也适用于上。
3.同方差性
程序:
*parms语句指定系数,const为常数项,beta为age回归系数,white为white检验,breusch为bp检验,括号1代表截距,age代表自变量;proc model data=sashelp.class; parms const beta; height=const+age*beta; fit height /white breusch=(1 age);run;quit;
结果:可以看出两种方法都表示满足同方差性。
另外在R软件里有更多的关于回归诊断的函数,我们可以在SAS里调用R软件来帮助我们判断。程序如下:
*开启调用R的选项;proc options option=rlang;run;*iml模块调用R;proc iml; run exportdatasettoR("sashelp.class", "test"); *将sas数据导入到R里; submit/r; *开始调用R; #R里的car包有很多做诊断的函数,可以对模型进行线性、正态性、同方差性等检验 library(car) mod = lm(Height ~ Age, data = test) #基础包plot()函数可以生成4幅诊断图 plot(mod) #qqPlot()函数可以对正态性检验,如果不满足,可以使用powerTransform()函数对因变量进行box-cox正态转换 summary(powerTransform(mod)) #boxTidwell()函数对模型进行线性检验,并给出自变量转换参数来让模型满足线性 boxTidwell(Height ~ Age, data = test) #ncvTest()函数对模型进行同方差检验,spreadLevelPlot()可以对不满足同方差模型提供因变量转换参数 ncvTest(mod) spreadLevelPlot(mod) endsubmit; *结束调用;quit;
结果: