首页 > 解决方案 > Python中使用OLS的线性多元回归不起作用

问题描述

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

我希望你能帮助我。

给出以下模型:
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)

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

我知道也有可以为我执行此操作的功能,但我想手动执行以更好地理解材料。

谢谢!

标签: pythonlinear-regression

解决方案


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

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

印刷

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

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

当然,如果您不想了解更详细的信息,您可以修改代码以确保您的两个变量是线性独立的,例如,您可以将X2初始化替换为

X2 = np.linspace(0,10,n)**2

推荐阅读