在 python 中按组创建 bootstrap 个样本

Creating a bootstrap sample by group in python

我有一个看起来像这样的数据框:

         y   X1  X2  X3
ID year
1  2010  1   2   3   4
1  2011  3   4   5   6
2  2010  1   2   3   4
2  2011  3   4   5   6
2  2012  7   8   9  10
...

我想从原始 df 创建几个 bootstrap 样本,计算新 bootstrap 样本的固定效应面板回归,然后存储相应的 beta 系数。我为“正常”线性回归找到的方法如下

betas = pd.DataFrame()
for i in range(10):
    # Creating a bootstrap sample with replacement
    bootstrap = df.sample(n=df.shape[0], replace=True)
    # Fit the regression and save beta coefficients
    DV_bs = bootstrap.y
    IV_bs = sm2.add_constant(bootstrap[['X1', 'X2', 'X3']])
    fe_mod_bs = PanelOLS(DV_bs, IV_bs, entity_effects=True ).fit(cov_type='clustered', cluster_entity=True)
    b = pd.DataFrame(fe_mod_bs.params)
    print(b.head())
    betas = pd.concat([betas, b], axis = 1, join = 'outer')

不幸的是,面板回归需要按组选择 bootstrap 个样本,以便选择完整的 ID 而不是仅选择一行。我无法弄清楚如何扩展函数以那样创建示例。所以我基本上有两个问题:

  1. 整体方法对面板回归是否有意义?
  2. 如何调整 bootstrapping 以便考虑多级/面板结构并在 bootstrapping 期间“选择”完整的 ID 而不是单行?

我用下面的代码解决了我的问题:

companies = pd.DataFrame(df.reset_index().Company.unique())

betas_summary = pd.DataFrame()
for i in tqdm(range(1, 10001)):
    # Creating a bootstrap sample with replacement
    bootstrap = companies.sample(n=companies.shape[0], replace=True)
    bootstrap.rename(columns={bootstrap.columns[0]: "Company"}, inplace=True)
    Period = list(range(1, 25))
    list_of_bs_comp = bootstrap.Company.to_list()
    multiindex = [list_of_bs_comp, np.array(Period)]
    bs_df = pd.MultiIndex.from_product(multiindex, names=['Company', 'Period'])
    bs_result = df.loc[bs_df, :]
    
    betas = pd.DataFrame()
    
    # Fit the regression and save beta coefficients
    DV_bs = bs_result.y
    IV_bs = sm2.add_constant(bs_result[['X1', 'X2', 'X3']])
    fe_mod_bs = PanelOLS(DV_bs, IV_bs, entity_effects=True ).fit(cov_type='clustered', cluster_entity=True)
    b = pd.DataFrame(fe_mod_bs.params)
    b.rename(columns={'parameter':"b"}, inplace=True)
    betas = pd.concat([betas, b], axis = 1, join = 'outer')

其中 Company 是我的实体变量,Period 是我的时间变量