在 Python 中使用 OLS 的线性多元回归不起作用

Linear multiple regression with OLS in Python does not work

我正在学习计量经济学课程,但不幸的是我被卡住了。

希望你能帮帮我。

给出以下模型:
https://i.stack.imgur.com/DfYCN.png

beta 的 OLS 估计量由下式给出: https://i.stack.imgur.com/r7bHD.png

但是当我 运行 以下 python 脚本具有非常大的样本量时,估计量很糟糕并且不会收敛到真实值。谁能给我解释一下吗?

'''

n = 100000
beta1 = 5.
beta2 = -.02
beta3 = .2


constant_term = np.ones(n)
X1 = np.linspace(10,30,n)
X2 = np.linspace(0,10,n)

X = np.column_stack((constant_term, X1, X2))

Y = np.zeros(n)
for i in range(n):
    u = np.random.normal(0.,1.)
    Y[i] = beta1 + beta2 * X[i,1] + beta3 * X[i,2] + u

Xt = np.transpose(X)

beta_ols = np.linalg.inv(Xt @ X) @ Xt @ Y

print(beta_ols)

''' 它 returns 例如 [ 4.66326351 -0.32281745 0.87127398] 但真实值为 [5., -.02, .2]

我知道还有一些功能可以为我做这件事,但我想手动完成以更好地理解 material。

谢谢!

你的变量XX2是共线的,即不是线性独立的。因此,您的矩阵 Xt @ X 不是满秩的。特征值:

np.linalg.eig(Xt @ X)[0]

打印

[4.65788929e+07, 3.72227442e-11, 1.87857084e+05]

请注意,第二个基本上是 0。由于四舍五入等原因不完全为零。但是当你反转这个矩阵时,你基本上除以这个非常小的数字并且大量失去精度。有很多方法可以解决它,例如查找Tikhonov regularization。在 Python 中,您可以使用来自 sklearn-kit

Ridge 回归

当然,如果你不想深入细节,你可以只修改你的代码以确保你的两个变量是线性独立的,例如你可以用

替换 X2 初始化
X2 = np.linspace(0,10,n)**2