为何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可以正常运行。
解决方案
- 整理为严格平衡面板并排序
先对数据按个体和时间排序,补全缺失的时间点(业务允许的情况下):
my_data <- my_data %>% arrange(gvkey, month) %>% # 补全每个个体的所有月份,缺失值会被填充为NA complete(gvkey, month = full_seq(month, 1))
处理后再运行mod1即可正常生成滞后项。
- 使用fixest自带的
lag()函数
fixest提供了对非平衡面板更友好的lag()函数,直接替代l()即可:
mod1 <- feols(short_disagreement ~ lag(leverage, 1), my_data, panel.id = c("gvkey", "month"))
- 检查面板数据状态
可以用以下代码验证数据的平衡性:
# 检查是否为有效面板 is.panel(my_data, panel.id = c("gvkey", "month")) # 查看每个个体的观测数分布 table(my_data$gvkey)
内容的提问来源于stack exchange,提问作者Raul Guarini Riva
相关产品推荐
相关产品推荐

