如何筛选面板数据以仅保留参与全部三个调查年份的个体观测
三轮追踪面板数据筛选方法(仅保留全轮参与个体)
核心判定逻辑:同一个
pid对应的不重复syear数量为3时,才认定该个体参与了2008、2012、2016全部三轮调查,需要保留该个体的所有观测记录。不要直接按单条观测的年份条件做筛选,很容易出现匹配错位。
不同分析工具的具体实现
Stata 操作
- 代码适配你提到的变量名可直接运行:
* 按个体分组,统计每个pid覆盖的不同调查年份数量 bysort pid: egen wave_count = nvals(syear) * 仅保留参与全部3轮的个体观测 keep if wave_count == 3 * 删除临时生成的计数变量,保持原数据集结构 drop wave_count
- 注意事项:这里用
nvals(syear)统计不重复年份数,而不是简单数观测条数,是为了避免同一个体同一年份有重复录入、凑够3条观测但实际没参与全部轮次的统计偏差。
Python Pandas 操作
- 先筛选出符合条件的个体ID列表,再回原数据集做批量匹配筛选:
# 统计每个pid对应的不重复syear数量 pid_wave_stat = df.groupby('pid')['syear'].nunique() # 提取所有满足“参与3轮”条件的pid valid_pid = pid_wave_stat[pid_wave_stat == 3].index.tolist() # 回原数据集筛选合格个体的全部观测 df_filtered = df[df['pid'].isin(valid_pid)].copy()
R(dplyr语法)操作
- 直接通过分组判断一步完成筛选,代码更简洁:
library(dplyr) df_filtered <- df %>% group_by(pid) %>% filter(n_distinct(syear) == 3) %>% ungroup()
实操避坑提示
- 不要拆分单年观测再拼接合并,这类操作很容易因为个体单年存在重复录入记录,导致不同轮次的观测错配到同一ID下,最终数据失真
- 判定样本合格性时,必须以不重复的syear计数为标准,不能直接用个体下的观测条数判断——毕竟同一年份录3条的个体,观测数也是3,但根本没参与全部三轮调查
- 筛选完成后可以做快速校验:重新按pid分组统计syear数量,确认所有个体的覆盖年份数都是3,总观测数等于合格个体数乘以3,和示例里pid=901、pid=1501各带3条观测的判定逻辑一致
内容的提问来源于stack exchange,提问作者Scasto
相关产品推荐
相关产品推荐

