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

如何在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数值完全相同,错误结果示例:

yearsalessales.T.minus.1
6495.495.4

预期结果应为:

yearsalessales.T.minus.1
6495.493.9
6598.595.4

问题原因

  1. 代码顺序错误:先执行pdata.frame(Cigar)但此时数据还未加载,后续data("Cigar")重新加载了原始数据,导致之前的面板数据转换无效。
  2. 未考虑面板数据的个体分组: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)

输出将符合预期:

yearsalessales.T.minus.1
6495.493.9
6598.595.4

内容的提问来源于stack exchange,提问作者Viktor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 19:33:38