如何替换面板数据缺失值?用疫情前收入填充疫情后缺失值的代码实现
同个体历史值匹配填充面板缺失值实现方案
你的填充逻辑属于面板数据中基于个体自身历史观测的冷填充,不需要复杂模型拟合,按个体ID做分组匹配即可,下面提供两种量化研究最常用工具的可直接运行代码:
Python(pandas)实现
- 提前确认数据集必备字段:唯一
个体ID、周收入、疫情阶段标签(取值区分疫情前/疫情后即可,比如pre/post)、观测周次(可选,如果你需要取特定时间点的历史收入) - 填充基准可根据研究需求选择:疫情前多周平均收入、疫情前最后一周收入、疫情前收入中位数都可,示例默认用疫情前平均周收入做填充值
import pandas as pd # 若你已经拆分了两个独立子集,直接从疫情前子集计算个体收入基准即可 # 未拆分的全量数据集用下面这行计算基准 pre_income_ref = ( df.query("疫情阶段 == 'pre'") .groupby("个体ID", as_index=False)["周收入"] .mean() # 要替换为疫情前最后一期收入,把.mean()改成.last()即可 .rename(columns={"周收入": "个体_pre收入基准"}) ) # 把基准值匹配合并到原数据集 df = df.merge(pre_income_ref, on="个体ID", how="left") # 核心规则:仅替换疫情后观测周期内的收入缺失值,疫情前本身的缺失值不做改动 df.loc[(df["疫情阶段"] == "post") & (df["周收入"].isna()), "周收入"] = df["个体_pre收入基准"] # 清理临时字段 df.drop(columns="个体_pre收入基准", inplace=True)
注意:如果部分个体疫情前完全没有收入观测,填充后对应位置会保留空值,这类样本可以根据你的研究规则单独剔除或做其他处理。
Stata实现
做微观面板常用的Stata实现代码更简洁,逻辑和pandas版本完全一致:
* 按个体分组,计算每个个体疫情前的平均周收入作为填充基准 bysort 个体ID: egen pre_inc_ref = mean(cond(疫情阶段 == "pre", 周收入, .)) * 仅替换疫情后周期的收入缺失值 replace 周收入 = pre_inc_ref if 疫情阶段 == "post" & missing(周收入) * 清理临时生成的基准变量 drop pre_inc_ref
如果需要用疫情前最后一期收入做填充,把计算基准的代码替换为以下内容即可:
* 按个体和周次排序,标记疫情前的收入观测 gsort 个体ID -观测周次 bysort 个体ID: gen pre_last_inc = 周收入 if 疫情阶段 == "pre" * 取每个个体排序后第一个非空的疫情前收入(也就是最近一期的疫情前收入) bysort 个体ID: replace pre_last_inc = pre_last_inc[_n-1] if missing(pre_last_inc) * 后续替换逻辑和之前一致 replace 周收入 = pre_last_inc if 疫情阶段 == "post" & missing(周收入) drop pre_last_inc
内容的提问来源于stack exchange,提问作者Saima Samantha
相关产品推荐
相关产品推荐

