我读硕士老师给我的第一篇论文就是一个分位数回归的文章,当时觉得这个模型很简单,我很快就用R的示例文件写了一个例子,但是,在后面的研究中,我越来越觉得,这个模型没有我想的那么简单,而且有着非常丰富的内涵需要来挖掘,就找了好几本书来看,结果真的是越看越懵,越看越懵,但是懵了一段时间之后,又重新感觉自己明白点了,所以赶紧把这一点进行一个总结,省的再放一段时间,连仅有的这一点懂的东西都没有了。

分位数回归神经网络 python代码 分位数回归通俗理解_分位数回归神经网络 python代码

分位数回归神经网络 python代码 分位数回归通俗理解_损失函数_02

这些是分位数回归的一些基本思想,这仅仅只涉及到基本的分位数线性回归,还有较为复杂的核回归在随后的研究中再进行更新。

下面我们来看一下代码实现。

分位数回归可以使用R中的quantreg包进行实现,我们就是用该包中的示例数据构建分位数回归模型:

首先加载数据和包


library(SparseM)
library(quantreg)
data("engel")


engel的这个数据中有两个变量一个变量是income,代表每个家庭的收入,另一个变量是foodexp代表食物支出,数据的大致情况是这样的:


分位数回归神经网络 python代码 分位数回归通俗理解_线性回归_03

我们来建立一个0.5分位数回归:


fit1 <- rq(foodexp ~ income, tau = .5, data = engel)
fit1
summary(fit1)


我们使用summary来看一下模型的大致情况:


分位数回归神经网络 python代码 分位数回归通俗理解_损失函数_04

大体上来看,income的 

分位数回归神经网络 python代码 分位数回归通俗理解_损失函数_05

 值是有意义的(95%置信区间未包含0),即income变动一个单位,foodexp的0.5分位数变动0.56个单位。我们可以通过summary的se参数数据的不同假设,iid即为独立同分布的假设。

我们可以使用quantreg内置的函数计算模型拟合的残差,并绘制残差图:


r1<-resid(fit1)#计算残差
plot(r1)


分位数回归神经网络 python代码 分位数回归通俗理解_损失函数_06

残差图数据均匀分布在(-200,200)的区间中,模型拟合的结果还是可以的。

接下来,我们可以画出,income和foodexp的散点图,并绘制不同分位数的分位回归曲线。


attach(engel)
plot(income, foodexp, cex = 0.25, type = "n", xlab ="Household Income", ylab = "Food Expenditure")
points(income,foodexp , cex = 0.25, col = "blue")
abline(rq(foodexp ~income , tau = 0.5), col = "blue")
abline(lm(foodexp ~income  ), lty = 2, col = "red")
taus <- c(0.05, 0.1, 0.25, 0.75, 0.9, 0.95)
for (i in 1:length(taus)) {
  abline(rq(foodexp ~income  , tau = taus[i]), col = "gray")
} 
detach(engel)


分位数回归神经网络 python代码 分位数回归通俗理解_线性回归_07

图中的蓝色实线代表0.5分位回归的回归曲线,红色虚线代表使用最小二乘法拟合的线性回归曲线,几条灰色的曲线,代表0.05, 0.1, 0.25, 0.75, 0.9, 0.95的分位数回归曲线。

我们可以看到不同分位数的分位回归曲线的斜率不同,0.5分位数的分位回归曲线和线性回归曲线的斜率也不相同,则可以认为,income对于foodexp不同的分位数影响不同,据此,我们将绘制不同分位数的分位回归曲线的置信区间图,来进一步探讨income对于foodexp的影响。


engel<-within(engel,xx <- income - mean(income))
fit1 <- summary(rq(foodexp~xx,tau=2:98/100,data = engel))
plot(fit1,mfrow = c(1:2))


分位数回归神经网络 python代码 分位数回归通俗理解_分位数回归神经网络 python代码_08

上图绘制了0.02到0.98这个区间中,每隔0.01做一次分位回归,其中黑色实心点代表回归曲线的 

分位数回归神经网络 python代码 分位数回归通俗理解_损失函数_05

 值,阴影部分代表95%置信区间,红色实线和虚线分别代表的是,线性回归曲线的 

分位数回归神经网络 python代码 分位数回归通俗理解_损失函数_05

值和置信区间。从图中可以看出,income对于0.02分位的foodexp的影响在0.35左右,对于0.98分位的影响在0.7左右。不同分位数的分位回归的 

分位数回归神经网络 python代码 分位数回归通俗理解_损失函数_05

值是否是由于抽样误差造成的,我们同样需要假设检验进行验证,那么我们使用Wald 检验进行验证。 得到如下结果,P值小于0.05可以认为不同分位数回归的 

分位数回归神经网络 python代码 分位数回归通俗理解_损失函数_05

 值是有差异的。

fit1 <- rq(y ~ x, tau = 0.25)
fit2 <- rq(y ~ x, tau = 0.5)
fit3 <- rq(y ~ x, tau = 0.75)

anova(fit1, fit2, fit3)


分位数回归神经网络 python代码 分位数回归通俗理解_损失函数_13