R语言线性回归
程序员文章站
2022-07-14 19:43:36
...
线性回归简介
线性回归是利用最小二乘法对一个或多个自变量和因变量之间关系进行建模的一种回归分析。
变量类型
- 线性回归要求自变量与因变量皆是连续变量。
适用条件
- 线性趋势。自变量与因变量之间的惯性应当是线性的。通过散点图来判断。
- 独立性。因变量y的取值相互独立,之间没有联系。在线性模型中,实际上就是要求残差()独立。
- 正态性。因变量y服从正态分布,实质就是要求残差()正态分布
- 方差齐性。因变量y的方差相等,在模型中即要求残差()方差齐性。
分类
回归模型的分类非常多,针对线性回归的建模条件不满足情况下,衍生出多种回归模型。常见模型有:
模型 | 描述 |
---|---|
OLS回归 | 最小二乘法回归,包括简单线性回归、多项式回归、多元线性回归 |
含哑变量线性回归 | 自变量为分类变量时,将分类变量进行虚拟化 |
加权最小二乘法 | OLS回归方差齐性要求不满足时使用的回归模型 |
岭回归 | 应对变量之间存在严重多重共线性的情况 |
非线性回归 | 应对变量之间的非线性关系 |
Logistic回归簇 | 应对因变量为二分类变量、有序分类变量情况 |
自回归模型 | 应对变量独立性不满足情况,多用于时间序列分析 |
线性回归模型繁多,实际应用中最常见的三种为OLS回归、二分类logistic回归、专门针对时间序列数据类型的时间序列分析。其他模型大致了解即可。
用途
- 预测
- 分类(logistic回归簇)
- 因果关系判断
R语言实现
我们使用一个多元线性回归的例子贯穿这个建模过程。
线性建模的一般步骤如下:
- 模型建构
- 模型评估
- 模型检验
- 模型修正
模型建构
- 建立线性回归模型前通常检验变量之间的相关性,通过cov()或散点图来判断。两个变量通过plot()生成散点图,多个变量通过car包scatterplotMatrix()生成散点图矩阵。
- 使用lm()拟合回归模型。
lm()函数基本形式如下:
myfit <- lm(formula,data)
其中,formula指要拟合的模型形式,data是拟合模型所需要的数据框。
表达式formula形式如下:
y~x1+x2+…+xk
~左边为因变量,右边为自变量。自变量之间用+号分割。
也可以用.表示纳入除因变量之外所有自变量。
使用R基础包state.x77数据集,探讨一个州的犯罪和其他因素的关系,包括人口、文盲、平均收入和结霜天数(自然因素)
lm()需要数据框格式数据,使用as.data.frame()函数转化为数据框。
#生出数据框
states <- as.data.frame(state.x77[,c('Murder','Population','Illiteracy','Income','Frost')])
#相关性(结果占据空间大,不展示)
cor(states)
#lm()
fit <- lm(Murder~.,data = states)
模型评估
模型评估就是通过各种指标来判断模型拟合情况。
常见函数如下:
函数 | 用途 |
---|---|
summary() | 展示拟合模型的详细结果 |
coeffictients() | 展示拟合模型的模型参数 |
confint() | 展示模型参数置信区间(默认95%) |
fitted() | 列出拟合模型预测值 |
residuals() | 列出拟合模型残差值 |
anova() | 生成一个拟合模型的方差分析表或比较多个模型的方差分析表 |
vcov() | 列出模型参数的协方差矩阵 |
AIC() | 输出赤池信息统计量 |
plot() | 生成评价拟合模型的诊断图 |
predict() | 用拟合模型对新的数据集因变量进行预测 |
#使用summary函数查看拟合结果
summary(fit)
Call:
lm(formula = Murder ~ ., data = states)
Residuals:
Min 1Q Median 3Q Max
-4.7960 -1.6495 -0.0811 1.4815 7.6210
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 1.235e+00 3.866e+00 0.319 0.7510
Population 2.237e-04 9.052e-05 2.471 0.0173 *
Illiteracy 4.143e+00 8.744e-01 4.738 2.19e-05 ***
Income 6.442e-05 6.837e-04 0.094 0.9253
Frost 5.813e-04 1.005e-02 0.058 0.9541
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 2.535 on 45 degrees of freedom
Multiple R-squared: 0.567, Adjusted R-squared: 0.5285
F-statistic: 14.73 on 4 and 45 DF, p-value: 9.133e-08
#结果显示(带*号为显著变量),文盲率、人口与谋杀率存在显著关系。
#决定系数R2表示,这些自变量可以解释谋杀率57%的变化原因。
#confint(fit)
confint(fit)
2.5 % 97.5 %
(Intercept) -6.552191e+00 9.0213182149
Population 4.136397e-05 0.0004059867
Illiteracy 2.381799e+00 5.9038743192
Income -1.312611e-03 0.0014414600
Frost -1.966781e-02 0.0208304170
#置信区间方面。文盲率改变1%,谋杀率字95%置信区间[2.38-5.90]中变化。
#Frost置信区间包含0,所以该变量与谋杀率无关。
模型检验
模型检验就是检验线性回归模型的各种先决条件。
可以使用R基础功能检验, 也可以使用car包进行检验。
R基础功能:
函数 | 功能 |
---|---|
plot(fit) | 用plot函数检验拟合模型,结果返回包含正态性、线性趋势、方差齐性情况的图 |
- 正态性的数据在QQ图中是落在45%度角直线上。
- 独立性。通过经验得出,无法通过这些图辨别。
- 线性趋势,通过‘残差图与拟合图’(Residuals vs Fitted)。如果图为曲线,则需要对回归模型加上一个二次项。
- 方差齐性。位置尺度图(scale-Location Graph),方差齐性的数据应该围绕红色水平线随机分布。
- 残差与杠杆图(Residuals vs Leverage)显示离群点、高杠杆值点、强影响点。
#生成一个2x2的画布,将4幅图合一
par(mfrow=c(2,2))
plot(fit)
如图
car包:
函数 | 用途 | 指标 |
---|---|---|
qqplot() | 正态性检验 | 数据点离参照直线很近,且都落在置信区间。说明正态分布情况好 |
durbinwatsonTest() | 德宾沃森误差独立性检验 | P>0.05,说明无自相关性,误差项之间相互独立 |
crPlot() | 成分与残差图 | 检验线性趋势图 |
ncvTest() | 对非恒定的残差方差做得分检验 | 检验显著,则说明存在异方差 |
apreadLevelplot() | 分散水平检验 | 以图形式展示标准化残差绝对值与拟合值的关系 |
outlierTest() | Bonferroni离群点检验 | P<0.05,说明存在离群点 |
avPolts() | 强影响点的变量图形 | 图 |
inluencePlot() | 回归影响图 | 略 |
sactterplot() | 增强的散点图 | 略 |
scatterplotMatrix() | 增强的散点图矩阵 | 略 |
vif() | 方差膨胀因子 | 社科中,vif>5,存在多重共线性。vif>10,说明存在严重共线性 |
#限于篇幅,这里只展示durbinwatsonTest和VIf函数
#载入包
library(car)
#德宾沃森独立性诊断
durbinWatsonTest(fit)
lag Autocorrelation D-W Statistic p-value
1 -0.2006929 2.317691 0.264
Alternative hypothesis: rho != 0
#方差膨胀因子
vif(fit)
Population Illiteracy Income Frost
1.245282 2.165848 1.345822 2.082547
模型修正
模型修正就是改进模型、模型最优。
- 改进模型
情况 | 方法 |
---|---|
存在离群点、强影响点 | 1删除观测点2做加权最小二乘法3增加样本量 |
不符合正态分布、线性、方差齐性 | 变量变换(常见方法取对数log(x),如果变量过0点,log(x+1)) |
存在严重多重共线性 | 1逐步回归2岭回归3主成分回归4增加变量 |
其他 | 可以采用其他回归模型 |
- 模型比较
- 使用anova(fit1,fit2)比较模型,P>0.05,说明两个模型没有区别。
- 选择AIC最小模型
- 选择变量(从大量变量中选择最终变量)
- 逐步回归(MASS包stepAIC())
- 全子集回归(leaps包regsubsets()函数)
上一篇: R语言 ts()函数