面板数据清洗:移除存在数据间隔的企业样本
面板数据清洗解决方案(移除有间隔/解释变量缺失的企业)
你的原代码逻辑完全不对——它只是筛选出那些不是所有年份都覆盖2001-2019的企业,这和你要找的「数据存在间隔」完全不是一回事。下面是符合需求的代码实现:
步骤说明
我们需要两步筛选:
- 移除所有回归解释变量存在缺失的企业
- 移除所有数据年份存在间隔的企业(即年份序列不是连续的一段区间)
完整代码
假设你的回归解释变量是 var1、var2、var3(替换成你实际的变量名),代码如下:
library(dplyr) # 1. 找出需要移除的企业:解释变量有缺失 或 数据年份有间隔 firms_to_remove <- panel_data %>% group_by(company_id) %>% # 标记两类企业:一是解释变量有缺失;二是年份序列有间隔 mutate( has_missing = any(is.na(var1), is.na(var2), is.na(var3)), # 检查年份是否连续:排序后相邻年份差是否全为1 has_gap = { sorted_years <- sort(year) any(diff(sorted_years) > 1) } ) %>% # 只要满足其中一个条件,就标记该企业需要移除 filter(has_missing | has_gap) %>% pull(company_id) %>% unique() # 2. 清洗数据集:移除上述企业的所有观测 clean_panel <- panel_data %>% filter(!(company_id %in% firms_to_remove))
代码解释
- 解释变量缺失判断:用
any(is.na(...))检查该企业是否有任何一个解释变量存在缺失值,只要有就标记。 - 年份间隔判断:先对每个企业的年份排序,然后计算相邻年份的差值,如果有任何一个差值大于1,说明存在间隔(比如2003到2007差4,就是间隔)。
- 最后把两类企业的ID提取出来,从原数据中移除它们的所有观测。
特殊情况验证
- 若企业只有2003-2007的连续数据:
diff(sorted_years)结果全是1,has_gap为FALSE,只要解释变量无缺失就会保留。 - 若企业有2001-2003,然后缺3年再2007-2019:
diff(sorted_years)会出现4(2003到2007),has_gap为TRUE,会被移除。
内容的提问来源于stack exchange,提问作者elzet
相关产品推荐
相关产品推荐

