为什么分位数回归模型的预测会因 DV 的递增变换而改变?

机器算法验证 数据转换 分位数回归
2022-04-21 03:29:01

拿一个数据集,假设我们为它拟合了两个分位数回归模型,一个带有原始因变量 (DV),一个带有记录的 DV。然后查看每个模型对训练数据的预测,在记录模型的情况下反转转换。这是R中的一个例子:

library(quantreg)

set.seed(1)

x1 = rnorm(100)
y = exp(x1 + 3*rnorm(100))

m = rq(y ~ x1, tau = .5)
p1 = predict(m)

m = rq(log(y) ~ x1, tau = .5)
p2 = exp(predict(m))

print(head(p1))
print(head(p2))

这两个模型给出了不同的预测:

        1         2         3         4         5         6 
0.4631787 0.8619277 0.3602179 1.5567692 0.9337257 0.3676802 
        1         2         3         4         5         6 
0.2776789 0.7859069 0.2122640 4.8162168 0.9478212 0.2164372

但这怎么可能呢?这些模型根据 DV 的分位数进行拟合,自然对数是一个递增函数,因此它保留了分位数等级。

3个回答

仅当正确指定了条件分位数函数时,暗示在实践中不太可能出现这种情况,并且在您的模拟中也不是这种情况,因为线性模型准确的唯一情况是所有回归变量都是离散的,我们指定一个完全饱和的模型,其中虚拟变量作为回归变量,耗尽所有可能的交互作用。Qq(y|x)=exp{Qq(lny|x)}exp{x+ε}x+ε

这将为您提供更好的结果,因为我添加了一个常数以避免未定义的零和负数对数,而不是求幂:

library(quantreg)
set.seed(1)
x1 = rnorm(100)
y = 10 + x1 + 3*rnorm(100)
m = rq(y ~1 + x1, tau = .5)
p1 = predict(m)
m2 = rq(log(y) ~1 + x1, tau = .5)
p2 = exp(predict(m2))
print(head(p1))
print(head(p2))

这不是一个完整的答案,但它可能会有所帮助。

您的模型中的协变量可能是一条红鲱鱼,该问题可以通过仅截距模型重现

set.seed(1)

y = runif(100, 0, 1)  # Need to keep it positive for the log.

m = rq(y ~ 1, tau = .5)
p1 = predict(m)

m2 = rq(log(y) ~ 1, tau = .5)
p2 = exp(predict(m2))

print(head(p1))
print(head(p2))

这导致

> print(head(p1))
        1         2         3         4         5         6 
0.4820801 0.4820801 0.4820801 0.4820801 0.4820801 0.4820801 
> print(head(p2))
        1         2         3         4         5         6 
0.4935413 0.4935413 0.4935413 0.4935413 0.4935413 0.4935413 

但是如果我们用奇数个数据点重做这整个事情

set.seed(1)

y = runif(101, 0, 1)  # <- Now it's odd!

m = rq(y ~ 1, tau = .5)
p1 = predict(m)

m2 = rq(log(y) ~ 1, tau = .5)
p2 = exp(predict(m2))

print(head(p1))
print(head(p2))

我们得到

    1         2         3         4         5         6 
0.4935413 0.4935413 0.4935413 0.4935413 0.4935413 0.4935413 
> print(head(p2))
        1         2         3         4         5         6 
0.4935413 0.4935413 0.4935413 0.4935413 0.4935413 0.4935413

哪个在鼻子上。

没有分位数回归调用很容易重现这一点

> x <- c(1, 2, 3, 4, 5, 6)
> median(x)
[1] 3.5
> exp(median(log(x)))
[1] 3.464102
> 
> x <- c(1, 2, 3, 4, 5, 6, 7)
> median(x)
[1] 4
> exp(median(log(x)))
[1] 4

我怀疑这与您所看到的行为有关,但尚不清楚如何将协变量纳入论点。

通过将自变量的向量值代入系数估计值(在这种情况下为中位数)来计算拟合值。

y=mx+c

原始 (m) 和 log (m2) 预测之间存在直接的线性关系(即相同的 x 具有不同的斜率和截距)。

这是一个代码片段来了解它的具体细节:

set.seed(1)
x1 = rnorm(100)
y = exp(x1 + 3*rnorm(100))
X <- as.matrix(cbind("(Intercept)"=rep(1,length(x1)),x1))
rq1 <- rq.fit.fnb(X, y, tau = 0.5)
resid <- (y - X %*% rq1$coefficients)
fit <- X %*% rq1$coefficients

rq2 <- rq.fit.fnb(X, log(y), tau = 0.5)
residlog <- (y - X %*% rq2$coefficients)
fitlog <- X %*% rq2$coefficients

model <- coef(lm(fit~fitlog))
plot(fitlog ~ fit)
head(fit)
head((fitlog*model[2])+model[1])
      [,1]
[1,] 0.4769196
[2,] 0.8292802
[3,] 0.3859367
[4,] 1.4432873
[5,] 0.8927255
[6,] 0.3925308

      [,1]
[1,] 0.4769196
[2,] 0.8292802
[3,] 0.3859367
[4,] 1.4432873
[5,] 0.8927255
[6,] 0.3925308

参考分位数回归的数学:

https://projecteuclid.org/download/pdf_1/euclid.ss/1030037960

http://www.econ.uiuc.edu/~roger/research/rq/rq.pdf