线性回归(OLS)只是构建了预测变量对因变量均值的模型,分位数回归能构建对因变量各种分位数(即整体分布)的模型,采用的损失函数是一乘的形式。

R中用包quantreg做分位数回归。

所用数据engel来自quantreg包,反映比利时工人阶级收入和食品花费。分别做0.15,0.25,0.5(中位数),0.75,0.95,0.99的分位数回归。

载入包和数据并绘制散点图。

library(quantreg)
## Loading required package: SparseM
## 
## Attaching package: 'SparseM'
## 
## The following object is masked from 'package:base':
## 
##     backsolve
data(engel)
head(engel,3)
##     income  foodexp
## 1 420.1577 255.8394
## 2 541.4117 310.9587
## 3 901.1575 485.6800
plot(engel) #因为只有两列,默认就x-y图了

似乎两个变量都有右偏的倾向,是否log变换下会好些。

par(mfrow=c(2,2))#设置绘图参数,两张图按1*2排列在一起
hist(engel$income)
hist(engel$foodexp)
hist(log(engel$income))
hist(log(engel$foodexp))

可以看出log变换后正态性好了很多。此时再绘制log变换后的散点图。

plot(log(foodexp)~log(income),data=engel) #这种表达似更符合公式的逻辑

下面对log变换后的数据进行各分位数下的分位数回归。

tau <- c(0.15,0.25,0.5,0.75,0.95,0.99)
reg=lapply(X=tau,FUN=rq,formula=log(foodexp)~log(income),data=engel) #注意lapply用法,不清楚时形参都注明

绘制各分位数回归直线。

plot(log(foodexp)~log(income),data=engel)
for (i in 1:6) {
  abline(reg[[i]],col=i,lty=i,lwd=1)  #abline直接添加回归模型的直线!
  }
legend("topleft",legend=paste("tau=",tau),col=1:6,lty=1:6,lwd=1,cex=0.9) #cex图例大小