Quantreg:不平衡残差

机器算法验证 分位数回归 损失函数
2022-04-19 10:01:15

我正在尝试使用该quantreg软件包来拟合指数曲线。

这是一个可复制的示例。IRL 我有更复杂的异常值数据,这就是为什么我不喜欢使用nls对异常值不可靠的数据。

library(quantreg)
library(ggplot2)

x = 1:100
set.seed(42)
y = 500*exp(-0.02*x) +rnorm(100, 0, 5 )
df = data.frame(cbind(x,y))
plot(df)

formula =  y ~ k * exp(b*x) 
qr_exp = nlrq(formula,
                   data = df,
                   start = list(k = 600, b = -0.01),
                   tau = .50,
                   nlrq.control(maxiter=1000))
summary(qr_exp)
sum(qr_exp$m$resid())
[1] -26.52373

我预计会有sum(qr_exp$m$resid())大约 0, tau = 0.5但该值为负数,这意味着模型倾向于高估实际值。

如您所见,我的残差总和接近于 0tau= 0.47

formula =  y ~ k * exp(b*x) 
qr_exp = nlrq(formula,
              data = df,
              start = list(k = 600, b = -0.01),
              tau = .47,
              nlrq.control(maxiter=1000))
summary(qr_exp)
sum(qr_exp$m$resid())
[1] -4.467781

我真的不明白为什么!

是因为可能有无限数量的解决方案,因此没有保证负残差比正残差多吗?

如果是的话,如果这对我来说非常重要,那么最好的解决方案是什么:

  • 最小化最小绝对偏差而不是最小二乘偏差(对异常值不稳健)
  • 有平衡残差吗?

添加一小部分 L2 惩罚来平衡是否有意义?(参见Huber 损失

1个回答

您正在tau=0.5对不对称分布的数据进行中值回归 ( )。这是一个更简单的示例来显示正在发生的事情。

假设您的非对称数据是对数正态的:

set.seed(1)
xx <- rlnorm(100,0,1)

那么你所做的就是找到数据的中位数。

median(xx)
[1] 1.121518

现在,中位数使绝对误差之和最小化。它不会最小化“原始”错误的总和:

sum(xx-median(xx))
[1] 52.74494

如果你想要一个最小化“原始”错误总和的值,你需要取平均值:

mean(xx)
[1] 1.648967
sum(xx-mean(xx))
[1] -9.992007e-15

所以:如果您的拟合产生零平均误差对您很重要,您将需要运行普通的 OLS 回归。当然,这对异常值很敏感。(您偶然发现条件均值等于条件 47% 分位数。但这当然不会最小化绝对偏差。)

如果您的分布不对称,则无法同时拥有最小绝对偏差和平衡残差。您当然可以通过取平均值或以其他方式(套索、岭回归、弹性网络)进行正则化来在中值回归和 OLS 回归之间找到折衷。