【问题标题】:Quantile Regression in Python gives different results than in RPython中的分位数回归与R中的结果不同
【发布时间】:2019-05-02 14:20:51
【问题描述】:

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

感谢任何输入或提示。

【问题讨论】:

  • 两个包中的标准错误有多大?
  • Python 版本的 4 个 coef 的标准差分别为 161.702、0.016、0.003 和 0.016。我在摘要中只看到 R 版本的上限和下限,但没有看到标准差。

标签: python r quantreg


【解决方案1】:

我猜这是一个参数没有很好识别的数据问题。 超过一半的观测值的响应值为零,而所有其他值都大得多。

据我所知,优化算法在 R 和 statsmodels 之间有所不同,尤其是在处理残差接近零的观察时。

如果参数没有很好地识别,也就是说,如果数据没有在相关范围内提供足够的信息,那么实现和优化算法的微小差异会对参数估计产生很大的影响。

这很可能意味着在这种情况下没有估计可以提供精确的参数估计。

【讨论】:

  • 好的,我明白了。是否有任何解决方法可以帮助我获得类似于 R 的 Python 结果?对于我的特定用例,R 结果对预测更有意义。
  • statsmodels 无法选择分位数回归中的优化算法。因此,没有选择为此类数据复制 R 结果。
  • 更一般的问题:为什么要对这个数据集使用分位数回归?也许它不是这个数据集的合适模型和估计器。
  • 重新调整变量可能也会有所帮助。第三列中的变量就像一个虚拟变量,点在 0 和 72000 左右。
  • 主要是为了比较,因为这个模型之前显示了很好的结果。我希望因此将其迁移到 Python 并与其他人进行苹果对苹果的比较。顺便说一句,statsmodels 版本的摘要显示了 95% CI 的上下限,但我不确定 R 摘要是否定义为相同?任何指向文档的指针都会非常有帮助,谢谢!
【解决方案2】:

R 和 Python 中的优化算法完全不同。 Python 中的QuanReg 使用迭代重加权最小二乘估计分位数回归模型,而 R 包quantreg 使用内点法、单纯形法和平滑法来解决优化问题。

结果必须不同,但它们总是彼此接近。也许您的数据不适合与模型或某种优化算法一起使用。

【讨论】:

    【解决方案3】:

    我注意到了同样的事情。对我来说,这似乎只是一个数字/比例问题。对于 Python 和 R,我将所有值转换为 z 分数,之后两组 beta 几乎相同,尽管 SE 仍然不同。在 Python 版本中我也有一个警告“条件数很大,5.66e+06。这可能表明存在强多重共线性或其他数值问题。”

    我意识到这个问题现在已经快 2 年了,但我认为其他任何答案都没有提到这一点,所以希望这对任何新读者都有帮助。

    【讨论】:

      【解决方案4】:

      您现在可能已经想通了,但是您需要自己在 python QuantReg 包中添加常量。 使用 sm.addconstant 后,您应该会得到相同的结果。

      【讨论】:

        猜你喜欢
        • 2020-01-01
        • 2021-07-11
        • 2016-10-18
        • 2017-07-05
        • 2021-12-31
        • 2023-03-13
        • 2019-01-31
        • 2021-09-28
        • 2020-08-26
        相关资源
        最近更新 更多