R语言面板数据:OP=1时删除该国后续观测的实现方法
面板数据按国家截断后续观测的实现方案
依赖包准备
新手优先用dplyr的分组逻辑处理面板操作,代码可读性强,不容易写错:
- 首次运行先安装需要的包:
install.packages(c("dplyr", "haven"))
- 加载包并导入原始面板数据:
library(dplyr) library(haven) # 导入示例面板数据 Panel <- read_dta("http://dss.princeton.edu/training/Panel101.dta")
核心实现逻辑
完全匹配需求规则:
- 按
country字段对样本拆分,每个国家单独处理 - 定位每个国家对应的
op=1的年份:因为提到每个国家仅出现一次op=1,直接提取该值即可 - 对该国样本做筛选:保留
op=1年份及之前的所有观测(包含op=0和op=1的样本,满足logit建模的样本要求),删除该年份之后的所有观测 - 对从未出现
op=1的国家,默认保留全部样本,避免误删
可直接运行的清洗代码
Panel_clean <- Panel %>% # 按国家分组单独处理 group_by(country) %>% # 计算每个国家的样本截断年份 mutate( cutoff_year = case_when( # 如果该国存在op=1,截断年份就是op=1对应的年份 any(op == 1) ~ year[op == 1], # 如果该国从来没有op=1,截断年份设为该国最大年份(等于全保留) TRUE ~ max(year) ) ) %>% # 筛选出截断年份及之前的观测 filter(year <= cutoff_year) %>% # 取消分组 ungroup() %>% # 删除临时生成的截断年份列,还原原始数据结构 select(-cutoff_year)
结果校验(新手必须做,避免错删样本)
跑清洗代码后必须手动核对结果,避免逻辑偏差:
- 第一步:汇总查看每个国家的保留区间,确认没有提前截断的情况
# 查看每个国家的样本保留范围 Panel_clean %>% group_by(country) %>% summarise( 起始年份 = min(year), 截止年份 = max(year), op为1的样本数 = sum(op == 1) )
- 第二步:抽选单个国家对比原始数据和清洗后的数据,确认
op=1年份之后的观测已经全部删除
# 例如对比A国的原始、清洗后样本 Panel %>% filter(country == "A") Panel_clean %>% filter(country == "A")
注意:如果实际数据集里某个国家存在多次
op=1的情况,只要把year[op ==1]改成min(year[op ==1]),就会自动从最早的op=1年份开始截断,适配常规事件研究类数据的处理要求。
内容的提问来源于stack exchange,提问作者Thierno Bocar Diop
相关产品推荐
相关产品推荐

