通过 group_id 仅使用特定估计 window 中的观察值进行循环回归,并将预测添加回 pandas 数据框
Looping regressions by group_id using only observations in a certain estimation window and adding back the predictions to the pandas dataframe
我正在尝试学习如何在 python 3.7 中执行我通常在 Stata 中轻松执行的一些操作。
我正在处理这样的数据框:
estimation_window group_id y x
0 1 3.17 23
1 1 4.76 26
1 2 4.17 73
1 2 8.70 72
0 2 11.45 16
我想要一个 for 循环来估计 group_id 中每个不同组的线性回归(y on x),仅使用虚拟 estimation_window 等于 1 的观察值。
然后,我想将三列添加回我的初始数据框:一列包含预测值,一列包含每个回归的 beta(x 系数),一列包含每个回归的截距。应该为所有观察值计算这些值,而不仅仅是虚拟 estimation_window 等于 1 的那些值。
生成的数据集应如下所示:
estimation_window group_id y x predicted_val beta_coeff alpha_coeff
0 1 3.17 23 3.10 0.32 1.43
1 1 4.76 26 4.00 0.32 1.43
1 2 4.17 73 4.10 0.75 0.95
1 2 8.70 72 8.50 0.75 0.95
0 2 11.45 16 10.30 0.75 0.95
我尝试使用 statsmodels,但无法弄明白。
假设您有数据框:
>>> data
estimation_window group_id y x
0 0 1 3.17 23.0
1 1 1 4.76 26.0
2 1 2 4.17 73.0
3 1 2 8.70 72.0
4 0 2 11.45 16.0
然后可以对group_id
进行分组,一个一个做线性回归,把参数存起来。如果您使用的是 statsmodels
,您可以这样做:
for groupid, grp in data.groupby('group_id'):
print(groupid)
model = sm.OLS(grp['y'], sm.add_constant(grp['x'])).fit()
data.loc[data['group_id'].eq(groupid), 'alpha'] = model.params['const']
data.loc[data['group_id'].eq(groupid), 'beta'] = model.params['x']
然后你可以手动重新计算预测值(只是因为线性模型很简单):
data['predicted_val'] = data['x'] * data['beta'] + data['alpha']
结果是:
estimation_window group_id y x alpha beta predicted_val
0 0 1 3.17 23.0 -9.020000 0.530000 3.170000
1 1 1 4.76 26.0 -9.020000 0.530000 4.760000
2 1 2 4.17 73.0 12.926162 -0.089804 6.370451
3 1 2 8.70 72.0 12.926162 -0.089804 6.460255
4 0 2 11.45 16.0 12.926162 -0.089804 11.489294
我正在尝试学习如何在 python 3.7 中执行我通常在 Stata 中轻松执行的一些操作。
我正在处理这样的数据框:
estimation_window group_id y x
0 1 3.17 23
1 1 4.76 26
1 2 4.17 73
1 2 8.70 72
0 2 11.45 16
我想要一个 for 循环来估计 group_id 中每个不同组的线性回归(y on x),仅使用虚拟 estimation_window 等于 1 的观察值。
然后,我想将三列添加回我的初始数据框:一列包含预测值,一列包含每个回归的 beta(x 系数),一列包含每个回归的截距。应该为所有观察值计算这些值,而不仅仅是虚拟 estimation_window 等于 1 的那些值。
生成的数据集应如下所示:
estimation_window group_id y x predicted_val beta_coeff alpha_coeff
0 1 3.17 23 3.10 0.32 1.43
1 1 4.76 26 4.00 0.32 1.43
1 2 4.17 73 4.10 0.75 0.95
1 2 8.70 72 8.50 0.75 0.95
0 2 11.45 16 10.30 0.75 0.95
我尝试使用 statsmodels,但无法弄明白。
假设您有数据框:
>>> data
estimation_window group_id y x
0 0 1 3.17 23.0
1 1 1 4.76 26.0
2 1 2 4.17 73.0
3 1 2 8.70 72.0
4 0 2 11.45 16.0
然后可以对group_id
进行分组,一个一个做线性回归,把参数存起来。如果您使用的是 statsmodels
,您可以这样做:
for groupid, grp in data.groupby('group_id'):
print(groupid)
model = sm.OLS(grp['y'], sm.add_constant(grp['x'])).fit()
data.loc[data['group_id'].eq(groupid), 'alpha'] = model.params['const']
data.loc[data['group_id'].eq(groupid), 'beta'] = model.params['x']
然后你可以手动重新计算预测值(只是因为线性模型很简单):
data['predicted_val'] = data['x'] * data['beta'] + data['alpha']
结果是:
estimation_window group_id y x alpha beta predicted_val
0 0 1 3.17 23.0 -9.020000 0.530000 3.170000
1 1 1 4.76 26.0 -9.020000 0.530000 4.760000
2 1 2 4.17 73.0 12.926162 -0.089804 6.370451
3 1 2 8.70 72.0 12.926162 -0.089804 6.460255
4 0 2 11.45 16.0 12.926162 -0.089804 11.489294