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



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

我希望你能帮助我。

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

β的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]

我知道也有一些功能可以为我做这件事,但我想手动做,以更好地理解材料。

谢谢!

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

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

打印

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

注意,第二个基本上是0。由于四舍五入等原因,不完全为零。但当你反转这个矩阵时,你基本上被这个非常小的数字整除,就会大大失去精度。有很多方法可以解决这个问题,例如查找Tikhonov正则化。在Python中,您可以使用sklearn工具包中的Ridge回归

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

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

最新更新