如何在R中构建银行并购事件前后3年的时间序列用于回归分析
处理银行并购事件前后时间序列并用于回归分析的R实现
1. 数据准备与预处理
假设你的数据集存储为数据框bank_data,包含bank_name(银行名称)、t(年份)、Operation(并购虚拟变量)、asset_tot(总资产)字段。先加载常用工具包:
library(dplyr) library(ggplot2) library(fixest) # 用于固定效应回归,可选
处理多并购场景(按需选择)
如果部分银行存在多次并购,需先明确分析目标:
- 仅分析首次并购:
# 提取每家银行的首次并购年份 first_merger <- bank_data %>% filter(Operation == 1) %>% group_by(bank_name) %>% summarise(merger_year = min(t)) %>% ungroup() # 合并回原数据集 bank_data <- bank_data %>% left_join(first_merger, by = "bank_name")
- 分析所有并购事件(每个事件单独拆分):
# 为每个并购事件生成唯一标识 bank_data <- bank_data %>% filter(Operation == 1) %>% group_by(bank_name) %>% mutate(event_id = row_number()) %>% ungroup() %>% right_join(bank_data, by = c("bank_name", "t", "Operation", "asset_tot")) %>% tidyr::fill(event_id, .direction = "downup")
2. 构建事件时间变量
计算每个观测值相对于并购年份的时间点:并购当年标记为0,并购前1-3年依次为-1/-2/-3,并购后1-3年依次为1/2/3,同时筛选事件前后3年的有效样本:
# 针对首次并购的场景 bank_data <- bank_data %>% mutate(event_time = t - merger_year) %>% filter(event_time >= -3 & event_time <= 3) # 针对多事件场景 bank_data <- bank_data %>% group_by(bank_name, event_id) %>% mutate(event_time = t - t[Operation == 1]) %>% filter(event_time >= -3 & event_time <= 3) %>% ungroup()
3. 可视化并购前后总资产变化
用折线图直观展示趋势:
# 单银行个体趋势图 ggplot(bank_data, aes(x = event_time, y = asset_tot, group = bank_name)) + geom_line(alpha = 0.6) + geom_vline(xintercept = 0, linetype = "dashed", color = "red") + labs(x = "事件时间(并购当年=0)", y = "总资产", title = "银行并购前后3年总资产变化") + theme_minimal() # 整体平均趋势图(带95%置信区间) bank_data %>% group_by(event_time) %>% summarise(mean_asset = mean(asset_tot, na.rm = TRUE), se_asset = sd(asset_tot, na.rm = TRUE)/sqrt(n())) %>% ggplot(aes(x = event_time, y = mean_asset)) + geom_line(color = "blue") + geom_ribbon(aes(ymin = mean_asset - 1.96*se_asset, ymax = mean_asset + 1.96*se_asset), alpha = 0.2) + geom_vline(xintercept = 0, linetype = "dashed", color = "red") + labs(x = "事件时间(并购当年=0)", y = "平均总资产", title = "并购前后3年总资产平均变化趋势") + theme_minimal()
4. 回归分析实现
处理后的asset_tot可直接作为因变量,核心自变量可选择连续型event_time或分组虚拟变量:
示例1:线性固定效应回归
# 控制银行和年份固定效应,分析总资产随事件时间的线性变化 model <- feols(asset_tot ~ event_time | bank_name + t, data = bank_data) summary(model)
示例2:分组虚拟变量回归(捕捉非线性趋势)
先生成事件前后的分组虚拟变量(以并购当年为基准组):
bank_data <- bank_data %>% mutate( pre3 = ifelse(event_time == -3, 1, 0), pre2 = ifelse(event_time == -2, 1, 0), pre1 = ifelse(event_time == -1, 1, 0), post1 = ifelse(event_time == 1, 1, 0), post2 = ifelse(event_time == 2, 1, 0), post3 = ifelse(event_time == 3, 1, 0) ) # 回归分析各时间点与并购当年的总资产差异 model <- feols(asset_tot ~ pre3 + pre2 + pre1 + post1 + post2 + post3 | bank_name + t, data = bank_data) summary(model)
注意事项
- 若部分银行并购前后不足3年,
filter步骤会自动剔除超出范围的观测;若需保留,可移除filter但需注意样本偏差。 - 存在缺失值时,可通过
na.omit(bank_data)或dplyr::drop_na()处理。
内容的提问来源于stack exchange,提问作者Daniele
相关产品推荐
相关产品推荐

