You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 22:31:11