numpy statsmodels OLS产生的结果与矩阵代数不同

x8goxv8g  于 2023-08-05  发布在  其他
关注(0)|答案(1)|浏览(87)

我需要使用numpy和矩阵代数在python上执行OLS回归。
我使用的代码如下:

import numpy as np
coeff = np.linalg.inv(X.T@X)@X.T@y

字符串
其中X是自变量的矩阵,y是因变量的向量。我将这些结果与statsmodels OLS获得的估计值进行了比较,如下所示:

import numpy as np
import statsmodels.api as sm
model = sm.OLS(y, X)
results = model.fit()
coeff = results.params


出于某种原因,我得到了不同的结果,我想知道为什么。我也试着用不同的方式写出矩阵代数形式,但它似乎总是产生与statmodels OLS不同的结果
下面是一个导致不同结果的示例:

data = np.array([
    [1, 2, 3, 14],
    [2, 4, 5, 25],
    [3, 6, 7, 36],
    [4, 8, 9, 47],
    [5, 10, 11, 58]
])

# Independent variables (X) - First three columns
X = data[:, :-1]

# Dependent variable (Y) - Last column
y = data[:, -1]


statmodels OLS产生系数向量,而矩阵代数形式导致误差,因为矩阵X.T@X不可逆。实际的数据集,我需要矩阵代数的方法,是显着更大,所以我宁愿包括这个较小的例子。对于我的特定情况,X.T@X矩阵是可逆的,但系数与statmodels OLS系数有很大不同。我假设它取决于X.T@X的逆和不同的过程来估计两种方法之间的系数,因此我的问题。

rsl1atfo

rsl1atfo1#

根据statsmodels.regression.linear_model.OLS.fit文档,使用的默认方法使用Moore–Penrose inverse计算逆。对于numpy方法,您使用numpy的精确逆方法np.linalg.inv计算逆。Moore-Penrose逆在np.linalg.pinv中实现。使用它,您的示例的结果匹配。

import numpy as np
import statsmodels.api as sm

data = np.array([[1, 2, 3, 14],
                 [2, 4, 5, 25],
                 [3, 6, 7, 36],
                 [4, 8, 9, 47],
                 [5, 10, 11, 58]])

# Independent variables (X) - First three columns
X = data[:, :-1]

# Dependent variable (Y) - Last column
y = data[:, -1:]

model = sm.OLS(y, X)
results = model.fit()
coeff_sm = results.params[:,None]

coeff_np = np.linalg.pinv(X.T@X)@X.T@y

print(coeff_np)
print(np.allclose(coeff_sm, coeff_np))

字符串
输出量:

[[1.]
 [2.]
 [3.]]
True

相关问题