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
相关产品推荐
相关产品推荐

