1

我正在使用quantreg包来预测基于训练集的新数据。predict.rq但是,我注意到orpredict和手动执行之间存在差异。这是一个例子:

分位数回归设置为

N = 10000
   tauList = seq(1:11/12)/12
   y = rchisq(N,2)
   X = matrix( rnorm(3*N)  ,nrow = N, ncol = 3 )
   fit <- rq( y ~ X-1, tau = tauList, method = "fn")

我要预测的新数据集是

newdata <- matrix( rbeta((3*N),2,2)    ,nrow = N,ncol=3 )

我使用predict.rqorpredict来预测 newdata。两者都返回相同的结果:

fit_use_predict <- predict.rq( fit, newdata = as.data.frame(newdata) )

我也手动根据系数矩阵进行预测:

coef_mat <- coef(fit)
fit_use_multiplication <- newdata %*% coef_mat

我希望两者在数字上是相同的,但它们不是:

diff <- fit_use_predict - fit_use_multiplication
print(diff)

他们的差异不容忽视。

然而,预测原始数据集X,两者都返回相同的结果,即

predict(fit, newdata = data.frame(X)) = X %*% coef_mat  ## True

使用该功能时我会错过什么吗?谢谢!

4

2 回答 2

2

这里的一个更严重的问题是,在我们进行预测之前,模型迫使所有拟合的分位数函数通过设计空间的原点,并且由于协变量以原点为中心,所有分位数函数都被迫交叉在那里。即使 X 都位于正正方位,也可以说响应的分布在原点处是退化的,这是一个相当强的假设。

于 2021-04-04T15:23:29.653 回答
1

我认为您只需要在数据中保留“X”名称,就像在训练数据中一样。


library(quantreg)
N = 10000
tauList = seq(1:11/12)/12
y = rchisq(N,2)
X = matrix( rnorm(3*N)  ,nrow = N, ncol = 3 )
fit <- rq( y ~ X-1, tau = tauList, method = "fn")

newdata <- matrix( rbeta((3*N),2,2)    ,nrow = N,ncol=3 )
fit_use_predict <- predict.rq( fit, newdata = data.frame(X=I(newdata)) )

coef_mat <- coef(fit)
fit_use_multiplication <- newdata %*% coef_mat
diff <- fit_use_predict - fit_use_multiplication

max( abs(diff) )

输出是0

于 2021-04-04T14:29:07.217 回答