面板数据集与R语言滚动窗口回归实现问题
面板数据分组滚动窗口回归实现
需求说明
针对面板数据中的每个国家,执行4年滚动窗口回归:以连续4年为窗口,将log_gdp对窗口内的相对时间索引T_i=[1,2,3,4](而非原始年份)进行回归,提取回归的斜率系数,最终将所有系数存入原数据集的新列roll_beta中。每个国家的窗口依次为2000-2003、2001-2004…直到2006-2009,窗口不足4个有效观测时返回NA。
示例数据集
set.seed(123) x=c(NA,NA,NA,5.1,5.2,5.3,5.15,4.9,5,5.01) df=data.frame(country = c(replicate(10,"Germany"),replicate(10, "USA"),replicate(10,"Zimbabwe ")), year=c(replicate(3,2000:2009)), log_gdp=c(sample(runif(10,9.8,10.7)),sample(runif(10,11,12)),x))
原尝试代码
library(zoo) rollapply(zoo(df), width=4, FUN = function(Z) { t = lm(formula=log_gdp~year, data = as.data.frame(Z), na.rm=T); return(t$coef) }, by.column=FALSE, align="right")
问题分析
原代码存在几个关键问题:
- 未按
country分组,导致跨国家计算滚动窗口,不符合面板数据的分析逻辑 - 回归使用原始
year变量,而非需求中的窗口内相对时间索引T_i lm函数的na.rm=T参数无效,无法正确处理窗口内的缺失值- 返回截距+斜率两个系数,未提取所需的单一斜率,且结果无法直接匹配原数据集的行数
修正后的解决方案
方案1:使用dplyr + slider(语法直观,推荐)
library(dplyr) library(slider) # 分组执行滚动窗口回归 df_result <- df %>% group_by(country) %>% mutate( roll_beta = slide_dbl( .x = log_gdp, .f = function(window_vals) { # 窗口内有效观测不足4个时返回NA if(sum(!is.na(window_vals)) < 4) return(NA_real_) # 创建窗口内的相对时间索引T_i=1-4 t_i = 1:length(window_vals) # 拟合回归并提取斜率系数 coef(lm(window_vals ~ t_i))[["t_i"]] }, .before = 3, # 窗口包含当前行及前3行,共4个观测 .complete = TRUE # 仅返回完整窗口的计算结果 ) ) %>% ungroup() # 查看结果 print(df_result)
方案2:使用dplyr + zoo(兼容原工具链)
library(zoo) library(dplyr) df_result_zoo <- df %>% group_by(country) %>% mutate( roll_beta = rollapply( data = log_gdp, width = 4, FUN = function(window_vals) { if(sum(!is.na(window_vals)) < 4) return(NA_real_) t_i = 1:4 # 提取斜率系数(第2个回归系数) coef(lm(window_vals ~ t_i))[2] }, align = "right", # 窗口结束于当前行 fill = NA # 不完整窗口填充NA ) ) %>% ungroup()
内容的提问来源于stack exchange,提问作者Maximilian
相关产品推荐
相关产品推荐

