You need to enable JavaScript to run this app. 如何筛选面板数据以仅保留参与全部三个调查年份的个体观测
优惠活动
大模型
产品
解决方案
定价
更多

如何筛选面板数据以仅保留参与全部三个调查年份的个体观测

三轮追踪面板数据筛选方法(仅保留全轮参与个体)

核心判定逻辑:同一个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.10 23:06:03