使用以下代码中显示的数据,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
任何输入或提示都值得赞赏。
答案 0 :(得分:3)
我猜这是一个数据问题,无法正确识别参数。 超过一半的观测值的响应值为零,而其他所有值的响应值都大得多。
据我所知,R和stats模型之间的优化算法有所不同,尤其是在残差接近于零的观测值处理方面。
如果不能很好地识别参数,即,如果数据不能在相关范围内提供足够的信息,则实现和优化算法中的细微差异可能会对参数估计产生较大影响。
在这种情况下,这很可能意味着没有任何估计可以提供精确的参数估计。
答案 1 :(得分:1)
我注意到了同样的事情。对我来说,这似乎只是一个数字/缩放问题。对于 Python 和 R,我将所有值都转换为 z 分数,之后两组 beta 几乎相同,尽管 SE 仍然不同。在 Python 版本中我也有一个警告“条件数很大,5.66e+06。这可能表明存在很强的多重共线性或其他数值问题。”
我意识到这个问题已经问了将近 2 年了,但我认为其他任何答案都没有提到这一点,所以希望这对任何新读者都有帮助。
答案 2 :(得分:0)
R和Python中的优化算法完全不同。 Python中的QuanReg
使用迭代的加权最小二乘法估算分位数回归模型,而R包quantreg
使用内点法,单纯形法和平滑法来解决优化问题。
结果必须不同,但是它们总是彼此接近。也许您的数据不适合用于模型或特定的优化算法。
答案 3 :(得分:0)
您现在可能已经知道了,但是您需要在python QuantReg包中添加常量。 一旦使用sm.addconstant,您应该会得到相同的结果。