线性回归
1. 如何理解协方差和相关系数?
协方差公式:公式简单翻译一下是:如果有X,Y两个变量,每个时刻的“X值与其均值之差”乘以“Y值与其均值之差”得到一个乘积,再对这每时刻的乘积求和并求出均值(其实是求“期望”,但就不引申太多新概念了,简单认为就是求均值了)。
相关系数的公式:就是用X、Y的协方差除以X的标准差和Y的标准差。
细节说明可以参考这篇文章:如何通俗易懂地解释「协方差」与「相关系数」的概念?
相关系数的性质如下:
- 相关系数的值介于-1与+1之间,即-1≤r≤+1。
当r>0时,表示两变量正相关,当r<0时,表示两变量为负相关。当|r|=1时,表示两变量为完全线性相关即函数关系。当r=1时,称为完全正相关,而当r=-1时,称为完全负相关。当r=0时,表示两变量间无线性相关关系。 - r具有对称性。X与y之间的相关系数rxy和y与x之间的相关系数ryx相等。
- r数值大小与x和y的数据原点及计量尺度无关。改变x和y的数据原点和计量尺度,并不改变r数值的大小。
- r仅仅是x与y 之间线性关系的一个度量,它不能用于描述非线性关系。
- r虽然是两个变量之间线性关系的一个度量,却不一定意味着x与y一定有因果关系。
当︱r︱≥0.8时,可视为高度相关;当0.5≤︱r︱<0.8时,可视为中度相关;当0.3≤︱r︱<0.5时,视为低度相关;当︱r︱<0.3时,说明两个变量之间的相关程度极弱
在R中,相关系数的计算使用cor函数
2. 相关系数的显著性检验
一般情况下我们都是使用样本数据来计算相关系数,用样本的相关系数来估计整体的相关系数,因此存在一定的偏差,会受到抽样波动的影响。每次抽样数据不同,得到的样本相关系数也不同。因此样本相关系数是个随机变量。如何确定样本相关系数是否能代表总体的相关水平呢?需要对样本相关系数进行可靠性检验,也就是显著性检验。一般我们用t检验。
根据给定的显著性水平和自由度(n-2)查分布表,得出的临界值。若则拒绝原假设,认为总体存在显著的线性关系。在R中,相关系数的检验可以使用cor.test函数
3. 一元线性回归
回归模型:
回归模型中的参数估计( , ),使用最小二乘法来进行估计计算。
拟合优度:通俗点说就是看我们推断出来的这条直线代表了实际数据分布情况的优良程度。
判定系数():
实际的观测数据跟总体平均值之间的差异叫作变差(也即离均差或离差)。变差的平方,也即平方偏差。所有的平方偏差之和,记为:
注意,方差的定义其实就是对平方偏差之和求平均数。即,
从下图可以看到,所有的变差(也即离均差)都可分解为:
将上式两边平方再求和,得到:
可以证明,,因此
其中,由于 是根据回归方程估计出来的值,因此, 可以表示根据回归方程估计出来的值与总体平均值之间的变差,他是由于自变量x的变化而引起的变化。其平方和我们称为回归平方和,记为SSR。
而 表示的是实际观测值和我们根据回归方程估计出来的估计值之间的差异,也即回归模型中的部分,它表示的是除了x对y线性影响之外的其他因素引起的y的变化部分,我们称之为残差。其平方和我们称之为残差平方和,记为:SSE。三个平方和之间的关系为:
根据上图我们可以看到,回归直线拟合的好坏取决于残差部分。残差越小,拟合得越好。跟据上式我们可知,SSE越小,SSR越大。也即,SSR/SST的比值越大。我们将这个比例称为判定系数:
若所有观测点都落在直线上,则,此时, 。若y的变化与x完全无关,x完全无助于解释y的变化,此时,。可见,的取值范围为[0,1]。而上面讲到的相关系数,其实就是判定系数的平方根,即
估计标准误:
从上面可以看到,,其实就是残差的均方差(MSE)。而估计标准误,其实就是对所有残差求标准差而已。公式:
显著性检验
注意如下几点:
1)我们的回归方程,是根据样本数据得出的,不一定代表了整体真实数据;
2)我们在做拟合时,先入为主的假定了y和x存在线性关系;
3)我们在做拟合时,还假设了误差项是一个服从正态分布的随机变量,且对不同的x,具有相同的方差
以上假设是否成立,还需要通过检验来加以证实。
-
线性关系的检验:
F检验(也叫方差比率检验):对两组样本数据求方差,计算两组样本数据的方差之比F,如果:
F < F表 表明两组数据没有显著差异;
F ≥ F表 表明两组数据存在显著差异。
如果y和x存在显著的线性关系,那么,根据线性方程得到的y值(估计值),在样本范围内,其方差与实际值和估计值之间的残差的方差,应该存在显著差异。那我们就可以采用F检验来判定。即:
注意,SST的自由度为n,SSR的自由度为k,即自变量的个数,在一元线性回归中为1,SSE的自由度为n-k-1,在一元线性回归中为n-2;
若,则拒绝原假设(两个变量间的线性关系不显著假设),认为两个变量间的线性关系是显著的,否则不拒绝原假设,没有证据表明两个变量间的线性关系是显著的。 -
回归系数的检验(检验是否等于0)
我们之前用的是判定系数或者估计标准误来对回归方程的拟合性好坏做判段。但是判定系数只能说明回归方程总体的回归效果,整体效果显著并不能说明每个自变量对因变量都是有效的。(尤其是在多元回归中,如果某个自变量对因变量不显著,就应该剔除)。显然,如果某个自变量对因变量作用不显著,那么他的系数就应该为0。所以,我们要检测每个自变量的系数是否显著不为0。上面的F检验,也是检验的整体效果,做F检验时,我们是假设所有的自变量系数都为0,那么显然,即便模型通过了F检验,但也并不清楚究竟哪一个参数不为零,那么我们对模型的解释就还不够清楚。
如何判断自变量系数显著不为0呢?因为自变量系数是个随机变量,方差也未知。在此情况下,根据统计学原理,这个随机变量转化为标准分数后的标准值应该服从自由度为n-2的t分布。因此我们用t检验来检测参数是否显著不为0:
一般我们会计算P值,即根据t分布表,查到的在n-2自由度下,概率为t时对应的a(也即百分比),如果小于给定的a(例如0.05,也就是5%),那么表示我们有极少的概率会出现系数为0的情况,因此要拒绝原假设,反之,我们不拒绝原假设。 -
残差分析: 检验误差项的假定是否成立
不同形态的残差图
残差除以标准误差后的值,叫标准化残差,记作:
检验误差项的假定是否成立,可以通过残差图分析来完成。残差图的x轴是自变量的值或者因变量的值,纵轴是对应的残差。(或)对应的残差,在图中用一个点表示。
若关于等方差的假设成立,且描述y与x之间关系的回归模型是合理的,那么残差图中的所有点都应以均值0为中心随机分布在一条水平带中间,如下图(a)所示。
另外,在R语言中,我们可以方便的来进行图形化的模型诊断
model <- lm(因变量~自变量)
plot(model)
此时会显示四张图:
其中,Residuals vs Fitted类似于残差图,横坐标代表你拟合值,纵坐标代表残差值。若关于等方差的假设成立,且描述y与x之间关系的回归模型是合理的,那么残差图中的所有点都应以均值0为中心随机分布在一条水平带中间。
Normal QQ-plot用来检测其残差是否是正态分布的。正态分布的QQ图的横坐标为:标准正态分布的分位数,纵坐标为样本值。利用QQ图鉴别样本数据是否近似于正态分布只需看QQ图上的点是否近似地在一条直线附近,图形是直线说明是正态分布,而且该直线的斜率为标准差,截距为均值.
Scale-Location 是位置尺度图,用来判断残差的方差齐性。若满足方差齐性假设,那么在位置尺度图中,水平线周围的点应该随机分布。
Residuals vs Leverage 用于判断样本数据中是否有离群点、高杠杆值点和强影响点。
更细致的说明可以参考这篇文章:R语言里的模型诊断图
4. 多元线性回归
基本同一元线性回归,回归模型为:
在多元回归总,我们仍然使用判定系数来判段拟合程度的好坏。此时叫多重判定系数。但是要注意的是,残差平方和往往随着解释变量个数的增加而减少,至少不会增加,但是由增加解释变量个数引起的判定系数的增大与拟合好坏无关,因此在多元回归模型之间比较拟合优度,判定系数就不是一个合适的指标,必须加以调整,于是引入了调整的多重判定系数:
在多元回归中,既要避免遗漏变量偏误的发生,也要尽量避免引入过多的变量,导致多重共线性的发生。
当回归模型中两个或两个以上的自变量彼此相关时,则称回归模型中存在多重共线性。具体来说,如果出现以下情况,暗示存在多重共线性:
- 模型中各对自变量存在显著相关;
- 当模型的线性关系检验(F检验)显著时,几乎所有回归系数的t检验却不显著;
- 回归系数的正负号与预期的相反;
- 通过容忍度和方差扩大因子判断:容忍度越小,多重共线性越严重。方差扩大因子越大,多重共线性越严重。
多重共线性度问题主要是影响对单个回归系数的解释和检验,在求因变量置信区间和预测区间时一般不会受影响,但必须保证用于估计和预测的自变量值在样本数据范围内。
解决多重共线性的方法主要是:
- 将一个或多个相关的自变量从模型中剔除,是保留的自变量尽量不相关;
- 如果要保留所有的自变量,则避免根据t统计量对单个参数进行检验,同时对因变量y的推断限定在自变量样本值的范围内。
变量选择与逐步回归
在建立模型时,尽量用最少的变量来建立模型。每次只增加一个变量,并将新变量与模型中的变量进行比较。若新变量引入模型后,以前的某个变量的t统计量不显著,这个变量就会从模型中剔除。另外,我们引入新的变量后,要看是否使残差平方和(SSE)显著减少。如果增加一个自变量使得残差平方和显著减少,则说明有必要将这个自变量引入到模型中,否则就没有必要。确定引入自变量是否使残差平方和显著减少的一个办法就是使用F检验统计量。
变量的选择方法包括:向前选择、向后剔除、逐步回归、最优子集等。
-
向前选择:
第一步:对k个自变量,分别拟合与因变量y的一元线性回归模型,共有k个,然后找出F统计量的最大模型及对应的自变量,并将其作为第一个自变量引入到模型中;
第二步:对剩下的k-1个自变量,分别引入到第一步的模型中,得到k-1个二元线性回归模型,然后找出F统计量的最大模型及对应的自变量,并将其作为第二个自变量引入到模型中。如果除之外的k-1个自变量中没有一个是统计上显著的,则运算终止。如此反复进行,直到模型外的自变量均无统计显著性为止。 -
向后剔除
与向前选择相反,先建立包括所有自变量的多元线性回归模型,然后考察去掉一个自变量的模型,是模型SSE值减小最小的自变量被挑出来并从模型中去除,直到剔除一个自变量不会使SSE显著减小为止。上述过程可以通过F检验的P值来判断 -
逐步回归
使用向前选择和向后剔除的混合。前两步先用向前回归,从增加第三个变量开始,需要判断增加这个变量后,前面的变量是否对模型的贡献变得不显著,如不显著,就剔除。
在R中,使用AIC作为选择标准,选择使用AIC最小的变量建立模型。AIC越小,表示拟合的模型精度越高而且越简洁。
n为样本量,p为模型中参数的个数(包括常数项)
model1 <- lm(y~x1+x2+x3+x4+x5, data=example)
mode2 <- step(model1)
模型比较
采用了逐步回归方式得到的模型是否很好的拟合了数据,或者说得到的模型是否就一定比使用所有变量的模型要好,需要比较后才能得知。
对于嵌套模型(一个模型中包含了另外一个模型的所有变量,并且至少有一个额外项),我们可以假设,多出来的额外项,其参数全为0。如果假设不成立,则表示使用了比较全的模型,拟合效果要好于简化模型。否则表示使用简化模型和完全拟合模型拟合效果一样好,此时我们应选择简化模型。
对于上述假设,我们一般是计算出两个模型的SSE。如果两者的差值较大,证明完全拟合模型提供的信息比较多,就不能拒绝原假设。检验统计量为:
其中,代表简化模型,代表完全模型,完全模型中的参数个数(包括常数项)为k+1,简化模型中的参数个数为g+1。如果检验的P值很小,就拒绝,否则不拒绝原假设。这一检验过程可以有R的anova函数来完成。
用anova函数比较时,要求两个模型是嵌套模型。如果不是嵌套模型,可以使用AIC来比较。AIC值小,说明模型用比较少的参数就获得了足够的拟合度。
自变量的相对重要性
评估自变量的相对重要性的方法之一就是比较标准化回归系数。标准化回归系数,就是将因变量和所有自变量都标准化后,再进行回归,得到的回归系数。其含义是:在其他自变量取值不变的情况下,自变量每变动一个标准差,因变量平均变动个标准差。显然,的绝对值越大,说明该自变量对因变量的影响越大,因此相对于其他自变量而言,它也越重要。在R中,可以使用lm.beta(object)函数来计算标准化回归系数。
稳健回归:
我们一般使用的普通最小二乘法(OLS)进行线性回归,其原理就是使得残差的平方和最小,也就相当于使各残差平方的算术均数最小,而算术均数对于偏离正态分布的情况其估计显然是不稳健的,
例如,当数据样本点出现很多的异常点(outliers),这些异常点对回归模型的影响会非常的大,传统的基于最小二乘的回归方法将不适用。
比如下图中所示,数据中存在一个异常点,如果不剔除该点,适用OLS方法来做回归的话,那么就会得到途中红色的那条线;如果将这个异常点剔除掉的话,那么就可以得到图中蓝色的那条线。显然,蓝色的线比红色的线对数据有更强的解释性,这就是OLS在做回归分析时候的弊端。
但在此情况下中位数却非常稳健,于是将LS估计的目标函数改为使各残差平方的中位数最小,得到的“最小平方中位数”估计应该是稳健的,这就是LMS。
同理,由于在单变量情况下的“调整均数”(trimmed mean)是稳健的,所以考虑在回归情形下如果把残差较大的点弃去不计,目标函数是使排序在前一部分较小的残差平方合计最小,这就是LTS。
生活中常见的一个应用稳健统计(Robust Statistics)的例子是, 在一些主观性的评价比赛打分中, 比如歌唱比赛,艺术体操比赛, 去掉一个最高分, 去掉一个最低分, 剩下的评分再取平均值为选手的得分, 这样就非常有效地防止了某些评委故意打出一个特别高的分或者特别低的分来影响选手的最终得分,这样的评分统计规则就是稳健的。
关于稳健回归,可以参考这篇文章:稳健回归
以及这篇文章:线性回归有离群值也不怕?稳健回归
由于上述原因,我们通过普通最小二乘法估计出来的模型,有可能存在异方差问题(可以通过上面的方法对残差进行异方差检验),而我们单个参数的t统计量,其公式等于系数值除以其标准误。如果存在异方差情况下,这个标准误是不准确的,因此我们得到的t检验量也不准确,此时应该考虑使用稳健的t检验量来进行检验。
在R中,我们可以使用lmtest包中的coeftest()函数来进行稳健的t统计量检验:
coeftest(linear_model, vcov. = vcov)
有关上述知识,可以参考:标准误两三事:为什么一使用稳健标准误,我的系数就不显著了?
这篇文章挺好,收藏一下:R语言回归篇