python - 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]
我知道也有可以为我执行此操作的功能,但我想手动执行以更好地理解材料。
谢谢!
解决方案
你变量X
和X2
是共线的,即不是线性独立的。因此,您的矩阵Xt @ X
不是满秩的。特征值:
np.linalg.eig(Xt @ X)[0]
印刷
[4.65788929e+07, 3.72227442e-11, 1.87857084e+05]
请注意,第二个基本上是 0。由于舍入等原因,不完全为零。但是当你反转这个矩阵时,你基本上除以这个非常小的数字并大量失去精度。有很多方法可以解决它,例如查找Tikhonov regularization。在 Python 中,您可以使用Ridge
sklearn-kit 的回归
当然,如果您不想了解更详细的信息,您可以修改代码以确保您的两个变量是线性独立的,例如,您可以将X2
初始化替换为
X2 = np.linspace(0,10,n)**2
推荐阅读
- javascript - NextJS,导入样式,如果在子文件夹中无法解析
- mysql - 有没有办法在 MySQL 中使用 unix 时间戳按一分钟时间分组?
- javascript - 当我在 TFJS 中训练模型时,尽管损失减少,为什么我的模型的准确度不会超过 0.508?
- python - 为什么我们在 cross_val_score 之前使用' - '(负)号
- python - TypeError:不支持的操作数类型 -:LSTM 中的“float”和“tuple”问题
- android - Android:将带有可播放视频的意图发送到电报应用程序
- r - 替换列中的 -99
- android - 为什么这不能检索 Firebase 存储上图像的下载 URL?
- javascript - 如何获取页面上除div之外的所有元素
- grammar - 有没有办法消除这些减少/减少冲突?