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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 02:20:25