Python中的分位数回归与R中不同

4

在Python中,来自statsmodels包的QuantReg与R中的结果非常不同,使用以下代码中所示的数据。

我分别在Python和R中尝试了STACKLOSS数据,并且结果是相同的。我想知道是数据本身在Python中引起了一些问题,还是两种算法实现之间存在一些基本差异,但无法找出原因。

Python中的代码:

from statsmodels.regression.quantile_regression import QuantReg
y = [0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 662.59, 248.08, 331.25, 182.98, 1085.69, -44.32]
X = [
    [1, 20322.18, 0.00, 0], [1, 19653.34, 0.00, 0],
    [ 1, 0.00, 72712.41, 0], [1, 0.00, 72407.31, 0],
    [1, 0.00, 72407.31, 0], [1, 0.00, 72201.89, 9111],
    [1, 183.52, 0.00, 0], [1, 183.52, 0.00, 0],
    [1, 0.00, 0.00, 2879], [1, 0.00, 0.00, 2698],
    [1, 0.00, 0.00, 0], [1, 0.00, 0.00, 0],
    [1, 0.00, 0.00, 19358], [1, 0.00, 0.00, 19001]
]

print(QuantReg(y, X).fit(q=.5).summary())

并且在R中:

library(quantreg)

y <- c(0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 662.59, 248.08, 331.25, 182.98, 1085.69, -44.32)
X <- matrix(
    c(1, 20322.18, 0.00, 0, 1, 19653.34, 0.00, 0,
     1, 0.00, 72712.41, 0, 1, 0.00, 72407.31, 0,
    1, 0.00, 72407.31, 0, 1, 0.00, 72201.89, 9111,
    1, 183.52, 0.00, 0, 1, 183.52, 0.00, 0,
    1, 0.00, 0.00, 2879, 1, 0.00, 0.00, 2698,
    1, 0.00, 0.00, 0, 1, 0.00, 0.00, 0,
    1, 0.00, 0.00, 19358, 1, 0.00, 0.00, 19001),
    nrow=14, ncol=4, byrow=TRUE
)

rq(y~.-1, data=data.frame(X), tau=.5, method='fn')

R给出的系数为1.829800e+02,-9.003955e-03,-2.527093e-03,-5.697678e-05。

而Python给出的系数为3.339e-05,-1.671e-09,-4.635e-10,7.957e-11。

欢迎任何输入或提示。


这两个软件包中的标准误差有多大? - Josef
Python版本的4个系数的标准差分别为161.702、0.016、0.003和0.016。在R版本的摘要中,我只看到了上限和下限,但没有看到标准差。 - aspire
4个回答

3
我猜这是一个数据问题,即参数没有被很好地识别。超过一半的观测值具有零响应值,而所有其他值则大得多。
据我所知,R和statsmodels之间的优化算法差异特别在于对残差接近于零的观测值的处理方式。
如果参数没有被很好地识别,也就是说,数据在相关范围内没有提供足够的信息,那么实现和优化算法中的微小差异可能会对参数估计产生很大的影响。
这很可能意味着在这种情况下没有任何估计可以提供精确的参数估计。

好的,我明白了。有没有什么解决方法可以帮助我获得类似于R的Python结果?对于我的特定用例,R的结果对于预测更有意义。 - aspire
statsmodels在分位数回归中没有选择优化算法的选项。因此,在这种数据情况下,无法复制R结果的选项。 - Josef
更一般的问题是:为什么您要在这个数据集上使用分位数回归?也许这不是适合该数据集的模型和估计器。 - Josef
重新缩放变量也可能会有所帮助。第三列中的变量像一个虚拟变量,在0点和72000左右有点。 - Josef
主要是为了比较,因为这个模型之前表现不错。所以我希望将它迁移到Python,并与其他模型进行苹果对苹果的比较。顺便说一下,statsmodels版本的摘要显示95%置信区间的下限和上限,但我不确定R摘要是否被定义为相同的?如果有文档指针将非常有帮助,谢谢! - aspire
抱歉,我不知道R如何计算区间。在statsmodels中进行分位数回归的推断是在Stata之后设计的,我从未检查过它在R中的详细信息。statsmodels中的区间是基于标准误差的标准Wald区间,就像其他模型一样。标准误差的计算是特定于分位数回归的。 - Josef

2
R和Python中的优化算法差异很大。Python中的QuanReg使用迭代重加权最小二乘法估计分位数回归模型,而R包quantreg使用内点法、单纯形法和平滑方法来解决优化问题。
然而,两种算法得出的结果总是接近的。也许你的数据不适合该模型或某种优化算法。

1
我注意到了同样的事情。对我来说,它似乎只是一个数字/比例问题。对于Python和R,我将所有值转换为z-score,之后两组beta几乎完全相同,尽管SE仍然不同。在Python版本中,我还收到了警告:“条件数很大,5.66e + 06。这可能表明存在强多重共线性或其他数字问题。”
我意识到这个问题现在已经快两年了,但我认为其他答案中没有提到这一点,所以希望这能帮助任何新读者。

0

你可能已经意识到了,但是在Python QuantReg包中需要自己添加常数。 一旦使用sm.addconstant,你应该会得到相同的结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接