R语言 回归诊断几种方法
回归诊断技术提供了评价回归模型使用性的必要工具,能帮助发现并且纠正问题。
有几种方法进行回归诊断。
分别是标准方法、car包中的函数、gvlma函数。建议先通过gvlma函数进行验证,如果违反假设条件,再使用其他方法来判断哪些假设没有满足并进行修改。
第一种:标准方法(了解),对lm()函数的返回对象使用plot()函数。
> fit<-lm(weight~height,data=women)
> par(mfrow=c(2,2))
> plot(fit)
最好满足线性假设(左上),残差正态性(右上)和同方差性(左下)。
线性假设:若因变量与自变量线性相关,那么残差值和预测值应该没有任何关联。如果在左上图中看到清楚的曲线关系,那么需要对回归模型加上一个二次项。
正态性:若满足正态假设,那么右上图的点应该落在呈45度角的直线上。
同方差性:若满足不变方差假设,那么左下图中,水平线周围的点应该随机分布。
从上面四个图可见,这次的拟合看起来满足了正态性和同方差性,但是最好对回归模型加上一个二次项来满足线性假设。
> fit<-lm(weight~height+I(height^2),data=women)
> par(mfrow=c(2,2))
> plot(fit)
这样看起来就满足了线性假设,残差正态性和同方差性。
右下的图为残差杠杆图,可以鉴别出离群点、高杠杆点和强影响点。可以通过剔除强影响点来提高模型的拟合程度,但是后面还有更好的呈现方法,所以这里就不对这张图作深入,稍微了解即可。
方法二:使用car包中的函数进行验证:
1、正态性:通过qqPlot()检测正态性
> library(car)
> fit<-lm(Murder~Population+Illiteracy+Income+Frost,data=states)
> qqPlot(fit,labels=row.names(states),id.method="identify",simulate=TRUE,main="Q-Q Plot")
看起来除了Nevada和Rhode Island,其他州通过模型,根据该州的人口、收入、文盲率和温度预测所得的谋杀率结果都十分理想。
2、误差的独立性:通过函数作Durbin-Wstson检验
> library(car)
> fit<-lm(Murder~Population+Illiteracy+Income+Frost,data=states)
> durbinWatsonTest(fit)
p值是0.234,显然误差项之间相互独立
3、线性
使用car包中的crPlots()函数绘制。
> library(car)
> crPlots(fit)
如果图中显示出了非线性的关系,可能说明假设的模型不够精确,需要添加适当的曲线成分,比如多项式项或者对其中的变量进行变换(例如用log(x)代替x)。
从图中看,似乎线性模型对这个数据集是比较合适的。
4、同方差性:
car包提供了两个函数:
**ncvTest():**生成一个计分检验。若检验显著,则拒绝零假设。
**零假设:**误差方差不变
**备选假设:**误差方差随着拟合值水平变化而变化
**spreadLevelPlot():**创建添加了最佳拟合曲线的散点图。
> ncvTest(fit)
Non-constant Variance Score Test
Variance formula: ~ fitted.values
Chisquare = 1.746514, Df = 1, p = 0.18632
p=0.18,不显著,说明满足方差不变的假设。
> spreadLevelPlot(fit)
Suggested power transformation: 1.209626
也可以通过这个函数绘制出来的图片看到出这个结论,如果违反假设,那么会看到非水平的曲线。其中suggested power transformation为建议转换的幂,比如如果为0.5,那么fit可以改为:
> fit<-lm(Murder~I((Population+Illiteracy+Income+Frost)^(0.5)),data=states)
方法三:使用gvlma()函数进行线性模型假设的综合验证
它给模型提供了一个单独的综合检验(通过/不通过)
> library(gvlma)
> gvmodel<-gvlma(fit)
> summary(gvmodel)
可见,Global Stat中,p=2.5965 ,满足OLS回归模型中的所有统计假设。若p值过小,可以使用前面的方法来判断哪些假设没有被满足。
PS:
多重共线性:
多重共线性是指线性回归模型中的解释变量之间由于存在精确相关关系或高度相关关系而使模型估计失真或难以估计准确,具体表现为模型参数的置信区间过大,使单个系数难以解释。
可以使用car包中的vif函数计算vif值,一般原则下,如果(vif)^(1/2) >2就表明村庄多重共线问题(结果为TRUE)。
> library(car)
> fit<-lm(Murder~Population+Illiteracy+Income+Frost,data=states)
> vif(fit)
Population Illiteracy Income Frost
1.245282 2.165848 1.345822 2.082547
> sqrt(vif(fit))>2#problem?
Population Illiteracy Income Frost
FALSE FALSE FALSE FALSE
可见,此模型不存在多重共线性问题,
上一篇: R语言:基本数据类型和R运算符号(一)
下一篇: 微信小程序 页面跳转传参的介绍