基础理论:
线性回归模型是一个简单而有效的模型,曾经在过去的一个世纪中在统计界得到主要的应用。
Yi(i=1,…n)是响应随机变量,(x1i,…xpi)是n个实测数据,p是解释变量的数量。€i是残差,是独立分布的随机变量,其平均值为0,方差是一个常数。
以上公式可简化为:Y=Xβ+€
Y和€是n1的矩阵。X是一个np 矩阵,β是一个p*1的矩阵。
线性回归模型的目标是,通过减少响应变量的真实值和预测值的差值来获得模型的参数(截距项和斜率),具体而言,是使得残差的平方和最小。
为了能够恰当解释OLS模型的系数,数据必须满足以下统计假设:正态性、独立性、线性、同方差性
在R中,用lm()来拟合回归模型。当回归模型包含一个因变量和一个自变量时,我们称为简单线性回归。当只有一个预测变量,但同时包含变量的幂时,我们称为多项式回归。当有不止一个预测变量时,则称为多元线性回归。
R语言代码:
#1 简单线性回归
fit<-lm(weight~height,data=women)#先定义拟合的公式
summary(fit)#展示拟合模型的详细结果
women$weight#展示women数据框中的weight字段
fitted(fit)#列出拟合模型的预测值
residuals(fit)#列出拟合的残差值
plot(women$height,women$weight,xlab="Height(in inches)",
ylab="Weight(in inches)")#画实测数据的散点图
abline(fit)#在原图中增加拟合直线图
#2 多项式回归
fit2<-lm(weight~height+I(height^2),data=women)#I(height^2)表示向预测等式
#添加一个身高的平方项
summary(fit2)
plot(women$height,women$weight,xlab="Height(in inches)",
ylab="Weight(in labs)")
lines(women$height,fitted(fit2))
#3 多元线性回归
states<-as.data.frame(state.x77[,c("Murder","Population","Illiteracy","Income","Frost")])#lm()需要数据框格式,而源数据是矩阵格式,所以作此转换
cor(states)#先计算变量间的相关性
library(car)#car包中包含scatterplotmatrix函数,可以生成散点图矩阵
scatterplotMatrix(states,spread=FALSE,smoother.args=list(lty=2),main="Scatter Plot Matrix")
#scatterplotMatrix()函数默认在非对角区域绘制变量间的散点图,并添加平滑和线性拟合曲线。对角线区域绘制每个变量的密度图和轴须图
fit3<- lm(Murder~Population+Illiteracy+Income+Frost,data=states)
summary(fit3)
#当预测变量不止一个时,回归系数的含义为:一个预测变量增加一个单位,其他预测变量保持不变时,因变量将要增加的数量。
#4 考虑交互项的多元线性回归
fit4<-lm(mpg~hp+wt+hp:wt,data=mtcars)#hp:wt为交互项
summary(fit4)
#若两个变量的交互项显著,说明响应变量与其中一个预测变量的关系依赖于另外一个预测变量的水平。
library(effects)
plot(effect("hp:wt", fit4,,list(wt=c(2.2,3.2,4.2))),multiline=TRUE)
#5 回归诊断
#以上计算没有任何输出告诉你,模型是否合适。你对模型的信心依赖于它在多大程度上满足OLS模型统计假设。
confint(fit3)
# 先使用R基础包中函数的标准方法
par(mfrow=c(2,2))
plot(fit)
dev.off
# 使用改进的方法 car包提供了大量函数,大大增强了拟合和评价回归模型的能力
# 正态性
library(car)
states<-as.data.frame(state.x77[,c("Murder","Population","Illiteracy","Income","Frost")])
fit3<- lm(Murder~Population+Illiteracy+Income+Frost,data=states)
par(mfrow=c(1,1))
qqPlot(fit3,labels=row.names(states),id.method="identify",simulate=TRUE,main="Q-Q plot")
residplot<-function(fit3,nbreaks=10){
z<-rstudent(fit3)
hist(z,breaks=nbreaks,freq=FALSE,
xlab="Studentized Residual",main="Distribution of Errors")
rug(jitter(z),col="brown")
curve(dnorm(x,mean=mean(z),sd=sd(z)),
add=TRUE,col="blue",lwd=2)
lines(density(z)$x,density(z)$y,
col="red",lwd=2,lty=2)
legend("topright",legend=c("Normal Curve","Kernel Density Curve"),lty=1:2,col=c("blue","red"),cex=.7)
}
residplot(fit3)
#误差的独立性
durbinWatsonTest(fit3)#p值不显著说明无自相关性
# 线性
library(car)
crPlots(fit3)#成分残差图绘制,若图形存在非线性,则说明你对预测变量的函数形式建模不够充分,需要添加一些曲线成分
# 同方差性
ncvTest(fit3)#生成计分检验,p不显著,则说明满足方差不变的假设
spreadLevelPlot(fit3)#最佳拟合曲线的散点图,水平曲线说明合格



