在 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。
谢谢!
你的变量X
和X2
是共线的,即不是线性独立的。因此,您的矩阵 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
我正在学习计量经济学课程,但不幸的是我被卡住了。
希望你能帮帮我。
给出以下模型:
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。
谢谢!
你的变量X
和X2
是共线的,即不是线性独立的。因此,您的矩阵 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