如何在R中创建滞后1期的sales.T.minus.1变量?
面板数据生成上一年sales滞后变量的问题解决
问题描述
想要创建变量sales.T.minus.1表示上一年的sales数值,编写的代码如下:
library(plm) library(dplyr) data <- pdata.frame(Cigar) data("Cigar") data <- data %>% mutate(sales.T.minus.1 = lag(sales, 1))
但代码运行后,sales.T.minus.1与sales数值完全相同,错误结果示例:
| year | sales | sales.T.minus.1 |
|---|---|---|
| 64 | 95.4 | 95.4 |
预期结果应为:
| year | sales | sales.T.minus.1 |
|---|---|---|
| 64 | 95.4 | 93.9 |
| 65 | 98.5 | 95.4 |
问题原因
- 代码顺序错误:先执行
pdata.frame(Cigar)但此时数据还未加载,后续data("Cigar")重新加载了原始数据,导致之前的面板数据转换无效。 - 未考虑面板数据的个体分组:
Cigar是美国各州的雪茄销售面板数据,每个州的时间序列需要单独计算滞后值。dplyr默认的lag()是全局滞后,不会按州(个体)分组处理,因此无法得到正确的上一年数值。
解决方案
方法1:dplyr分组滞后
修正代码顺序,先加载数据,再按state分组后计算滞后:
library(plm) library(dplyr) # 加载数据并转换为面板数据框 data("Cigar") data <- pdata.frame(Cigar) # 按州分组生成滞后变量 data <- data %>% group_by(state) %>% mutate(sales.T.minus.1 = lag(sales, 1)) %>% ungroup()
方法2:plm包专属滞后函数
plm包针对面板数据提供了专门的lag()方法,无需手动分组,直接对pdata.frame操作即可:
library(plm) data("Cigar") data <- pdata.frame(Cigar) # 使用plm的lag函数生成个体层面的1期滞后 data$sales.T.minus.1 <- lag(data$sales, 1)
结果验证
执行以下代码查看指定州的结果:
data %>% filter(state == "AL", year %in% c(64, 65)) %>% select(year, sales, sales.T.minus.1)
输出将符合预期:
| year | sales | sales.T.minus.1 |
|---|---|---|
| 64 | 95.4 | 93.9 |
| 65 | 98.5 | 95.4 |
内容的提问来源于stack exchange,提问作者Viktor
相关产品推荐
相关产品推荐

