在R中实现Stata的l(1/4)与f(1/4)算子处理面板数据遇问题
在R中实现Stata的
l(1/4)和f(1/4)面板算子 问题根源
你的代码仅将year设为面板数据索引,但面板数据需要个体(如国家)+ 时间双索引,否则Lag()和lead()会对整个数据集全局计算,而非按每个国家单独处理,这就是只有国家A结果正确的核心原因。
正确实现方案
1. 初始化正确的面板数据索引
首先确认数据包含个体列(如country)和时间列(year),用双索引构建面板数据:
library(plm) library(dplyr) # 关键:设置个体+时间双索引 crisisdata <- pdata.frame(crisisdata, index = c("country", "year")) # 可选:确保数据按个体和时间排序 crisisdata <- crisisdata %>% arrange(country, year)
2. 批量生成滞后项(对应Stata的l(1/4))
使用plm包的小写lag()函数,它会自动按面板个体分组处理,批量生成1-4期滞后项:
# 循环生成l1_ltd到l4_ltd for (i in 1:4) { crisisdata <- crisisdata %>% mutate(!!paste0("l", i, "_ltd") := lag(ltd, i)) }
3. 批量生成领先项(对应Stata的f(1/4))
dplyr的lead()需要手动按个体分组后计算,确保每个国家内部单独生成领先项:
# 按国家分组,生成f0-f4领先项 crisisdata <- crisisdata %>% group_by(country) %>% mutate( f0_ltd = ltd, f1_ltd = lead(ltd, 1), f2_ltd = lead(ltd, 2), f3_ltd = lead(ltd, 3), f4_ltd = lead(ltd, 4) ) %>% ungroup()
更简洁的批量写法
如果追求高效,可结合purrr批量处理:
library(purrr) # 批量生成滞后项 crisisdata <- crisisdata %>% mutate( across(ltd, ~set_names(map(1:4, lag, x = .), paste0("l", 1:4, "_ltd"))) ) %>% unnest_wider(ltd) # 批量生成领先项 crisisdata <- crisisdata %>% group_by(country) %>% mutate( across(ltd, ~set_names(map(0:4, lead, x = .), paste0("f", 0:4, "_ltd"))) ) %>% unnest_wider(ltd) %>% ungroup()
内容的提问来源于stack exchange,提问作者Tanja
相关产品推荐
相关产品推荐

