如何在R中对面板数据分时段执行Pooled OLS及DID回归?
面板数据分时段回归实现方案(plm包)
步骤1:预处理日期列
先确保Date列是R可识别的日期格式,若为字符型需转换:
# 转换日期格式(适配"YYYY.MM.DD"格式) df$Date <- as.Date(df$Date, format = "%Y.%m.%d")
步骤2:定义时段筛选条件
用逻辑向量直接标记四个分析时段:
# 全时段 period_full <- df$Date >= as.Date("2020-02-03") & df$Date <= as.Date("2020-05-29") # 子时段1:2020.02.03-2020.02.21 period1 <- df$Date >= as.Date("2020-02-03") & df$Date <= as.Date("2020-02-21") # 子时段2:2020.02.24-2020.04.10 period2 <- df$Date >= as.Date("2020-02-24") & df$Date <= as.Date("2020-04-10") # 子时段3:2020.04.13-2020.05.29 period3 <- df$Date >= as.Date("2020-04-13") & df$Date <= as.Date("2020-05-29")
步骤3:分时段执行Pooled OLS回归
方法1:逐个筛选数据执行
library(plm) # 全时段Pooled OLS model_full <- plm(因变量 ~ 自变量1 + 自变量2, data = df[period_full, ], index = c("ID", "Date"), model = "pooling") summary(model_full) # 子时段1回归 model_period1 <- plm(因变量 ~ 自变量1 + 自变量2, data = df[period1, ], index = c("ID", "Date"), model = "pooling") summary(model_period1) # 子时段2回归 model_period2 <- plm(因变量 ~ 自变量1 + 自变量2, data = df[period2, ], index = c("ID", "Date"), model = "pooling") summary(model_period2) # 子时段3回归 model_period3 <- plm(因变量 ~ 自变量1 + 自变量2, data = df[period3, ], index = c("ID", "Date"), model = "pooling") summary(model_period3)
方法2:函数批量处理(减少重复代码)
若回归公式统一,可写函数批量执行:
run_pooled_ols <- function(data, period_mask, formula) { model <- plm(formula, data = data[period_mask, ], index = c("ID", "Date"), model = "pooling") return(summary(model)) } # 定义统一回归公式 ols_formula <- 因变量 ~ 自变量1 + 自变量2 # 批量执行并输出结果 run_pooled_ols(df, period_full, ols_formula) run_pooled_ols(df, period1, ols_formula) run_pooled_ols(df, period2, ols_formula) run_pooled_ols(df, period3, ols_formula)
步骤4:分时段执行DID回归
假设数据包含treat列(1=处理组,0=控制组)和post列(政策实施后为1),分时段逻辑与OLS一致:
# 全时段DID did_full <- plm(因变量 ~ treat * post + 控制变量1 + 控制变量2, data = df[period_full, ], index = c("ID", "Date"), model = "pooling") summary(did_full) # 子时段DID(需确保时段内包含政策前后观测,否则交互项无统计意义) did_period1 <- plm(因变量 ~ treat * post + 控制变量1 + 控制变量2, data = df[period1, ], index = c("ID", "Date"), model = "pooling") summary(did_period1)
注意:若子时段仅为政策前/后单一阶段,需重新定义
post变量或调整分析逻辑,避免无效交互项。
内容的提问来源于stack exchange,提问作者genistae
相关产品推荐
相关产品推荐

