一、线性回归
线性回归是一种广泛用于数据分析、预测和建模的技术,可以帮助我们理解变量之间的关系,并进行预测和推断。
1、简单线性回归
简单线性回归是线性回归的一种特殊情况,适用于只有一个自变量和一个因变量的情况。
在R语言中,可以使用lm()函数来建立线性回归模型。
# 建立示例数据
df<-data.frame(
rain=c(136,269,311,427,537),
yield=c(179,137,355,411,523)
)
# 假设因变量为yield,自变量为rain
mode<-lm(yield~rain,data=df)
# 查看模型摘要
summary(mode)
输出结果如下:
在简单线性回归中:multiple R-squared=0.8054,说明rain可以解释yield变量80.54%的变异。F-statistic对应的p-value为0.03882,说明rain和yield之间存在线性关系。具体的线性回归系数查看coefficients表即可。
下面利用回归方程进行预测:
# 假设要预测的自变量值为350
new_x<-350
predict_y<-predict(mode,newdata=data.frame(rain=new_x))
print(predict_y)
# 绘制回归线和散点图
library(ggplot2)
ggplot(df,aes(x=rain,y=yield))+geom_point()+geom_smooth(
method="lm",se=FALSE
)
2、多元线性回归
在简单线性回归的基础上,引入多个自变量,建立一个多元线性回归模型。
在R语言中,也是使用lm()函数来建立多元线性回归模型。
# 示例数据集
df<-data.frame(
rain=c(136,269,311,427,537),
temp=c(15.5,12.7,16.3,14.3,12.9),
yield=c(179,137,355,411,523)
)
# 建立多元线性回归模型
model<-lm(yield~rain+temp,data=df)
# 查看模型摘要
summary(model)
F检验说明存在线性方程,方程可以解释yield变量的91.48%的变异;在系数的t检验,可知rain变量的回归系数是显著的,而temp变量的回归系数是不显著的。
# 数据预测
new_x<-data.frame(rain=c(275,360),temp=c(18.4,13.6))
predict_y<-predict(model,newdata=new_x)
print(predict_y)
二、回归诊断
回归诊断是对回归分析中的假设的检验与分析。R中lm线性回归基于OLS(普通最小二乘法)方法,需要基于一定的假设。
OLS回归的统计假设:
正态性:因变量呈正态分布
独立性:因变量值相互独立
线性:因变量与自变量线性相关
残差随机性
1、回归诊断方法
R基础包中提供了检验回归分析中统计假设的方法。
最常见的方法就是对lm()函数的返回对象使用plot()。
# 使用自带的mtcars数据集进行简单线性回归模型
model<-lm(mpg~hp,data=mtcars)
par(mfrow=c(2,2))
plot(model)
car包提供了大量函数,大大增强了诊断回归模型的能力
(1)qqPlot()函数提供了更为精确的正态假设检验方法。
# 加载car包
library(car)
# qqPlot()函数生成概率图
qqPlot(
model,
labels=row.names(mtcars),
simulate=TRUE,
main="Q-Q Plot"
)
(2)Durbin-Watson检验的函数,能够检测误差的序列相关性。
p-value小于0.05,说明误差项之间存在显著自相关,即误差项之间不独立。
(3)crPlots()函数绘制成分残差图,检验因变量与自变量之间是否呈非线性关系。
由上图可知,hp与mpg之间存在较明显的非线性关系,需要考虑其他曲线关系。
(4)ncvTest()函数和spreadLevelPlot()函数用于判断误差的同方差性。
ncvTest()函数生成一个计分检验,零假设是:误差方差不变;备择假设是:误差方差随着拟合值的水平变化而变化。
本例结果显示,vcvTest检验说明误差方差不变。
spreadLevelPlot()函数创建一个添加了最佳拟合曲线的散点图,来展示标准化残差绝对值与拟合值的关系。
本图显示,散点是水平的最佳拟合周边基本呈随机分布。
2、模型假设的综合验证
gvlma()函数能够线性模型假设进行综合验证,同时还能做偏斜度、峰度和异方差性的评价。它给模型假设提供了一个单独的综合检验(通过/不通过)。
install.packages("gvlma")
# 加载gvlma包
library(gvlma)
gvmodel<-gvlma(model)
summary(gvmodel)
重点查看Global Stat检验结果,显示差异极显著,且结论为不满足假设。说明此线性拟合结果存在明显的问题,需重新拟合。