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

为何fixest包无法处理滞后变量?R面板回归报错问询

fixest包中l()生成滞后项报错问题

我使用R的fixest包进行固定效应回归,目标模型为:
$$Y_{i, t} = \alpha + \beta X_{i, t-1} + u_{i, t}$$
即因变量对自变量的滞后一期值回归。我的代码如下:

library(tidyverse)
library(fixest)
library(here)

my_data <- read_csv("test_data.csv")
# 报错的模型
mod1 <- feols(short_disagreement ~ l(leverage, 1), 
             my_data, 
             panel.id = c("gvkey", "month"))

# 正常运行的模型
mod2 <- feols(short_disagreement ~ lagged_leverage, 
              my_data |> group_by(gvkey) |> mutate(lagged_leverage = lag(leverage, 1)),
              panel.id = c("gvkey", "month"))

其中gvkey是面板个体ID,month是时间变量。mod2可以正常估计,但mod1运行时fixest抛出错误:

Error in feols(short_disagreement ~ l(leverage, 1), my_data, panel.id = c("gvkey", :
All observations contain NAs. Estimation cannot be done. (Breakup: RHS: 39,803.)

问题原因

fixest的l()函数对面板数据要求严格:必须是严格平衡面板,且数据已按个体+时间排序。如果数据存在个体内时间不连续、未排序,或部分个体时间序列有缺失,l()会无法生成有效滞后项,导致所有观测的滞后变量变为NA,最终触发报错。而dplyr::lag()仅按分组后的当前顺序生成滞后,不要求严格平衡,因此mod2可以正常运行。

解决方案

  1. 整理为严格平衡面板并排序
    先对数据按个体和时间排序,补全缺失的时间点(业务允许的情况下):
my_data <- my_data %>% 
  arrange(gvkey, month) %>% 
  # 补全每个个体的所有月份,缺失值会被填充为NA
  complete(gvkey, month = full_seq(month, 1))

处理后再运行mod1即可正常生成滞后项。

  1. 使用fixest自带的lag()函数
    fixest提供了对非平衡面板更友好的lag()函数,直接替代l()即可:
mod1 <- feols(short_disagreement ~ lag(leverage, 1), 
              my_data, 
              panel.id = c("gvkey", "month"))
  1. 检查面板数据状态
    可以用以下代码验证数据的平衡性:
# 检查是否为有效面板
is.panel(my_data, panel.id = c("gvkey", "month"))
# 查看每个个体的观测数分布
table(my_data$gvkey)

内容的提问来源于stack exchange,提问作者Raul Guarini Riva

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 12:50:16