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

plm包lag函数返回同期值而非滞后值,增速计算异常求助

解决面板数据滞后计算异常的问题

你的问题核心是面板数据未按个体+时间维度排序,导致lag()取到的不是对应个体的上一期值,而是乱序后的相邻行(甚至是同一期数据),最终增速全为0。以下是针对性解决方案:

方案1:用dplyr正确处理(先排序再分组计算)

在分组前必须先按机构(Cod)和年份(假设年份列名为year,请替换为你实际的列名)排序,确保每个机构内的时间序列是连续的:

your_data %>%
  arrange(Cod, year) %>%  # 先按机构+年份排序,这是关键
  group_by(Cod) %>%
  mutate(
    orcam = orc * 100 / real,
    chg = (orcam - lag(orcam)) / lag(orcam)  # 此时lag会取到同机构的上一年值
  ) %>%
  ungroup()

方案2:用plm包原生面板滞后函数

如果你明确想用plm包的lag(),需要先将数据转为plm专属的面板数据对象(pdata.frame),它会自动识别个体和时间维度,无需手动分组:

library(plm)

# 将普通数据框转为面板数据,指定个体变量(Cod)和时间变量(year)
p_data <- pdata.frame(your_data, index = c("Cod", "year"))

# 计算指标和增速
p_data$orcam <- p_data$orc * 100 / p_data$real
p_data$chg <- (p_data$orcam - plm::lag(p_data$orcam)) / plm::lag(p_data$orcam)

额外排查点

如果以上操作后仍有问题,检查数据是否存在重复的机构-年份组合(同一个Cod+year有多行),这种情况会导致lag()取到同一期的重复值,差值为0。可以用distinct(Cod, year, .keep_all = TRUE)先去重再计算。

内容的提问来源于stack exchange,提问作者Pedro Camões

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 16:03:31