我需要使用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的逆和不同的过程来估计两种方法之间的系数,因此我的问题。
1条答案
按热度按时间rsl1atfo1#
根据
statsmodels.regression.linear_model.OLS.fit
文档,使用的默认方法使用Moore–Penrose inverse计算逆。对于numpy方法,您使用numpy的精确逆方法np.linalg.inv
计算逆。Moore-Penrose逆在np.linalg.pinv
中实现。使用它,您的示例的结果匹配。字符串
输出量:
型