在R中复现Boons等研究:如何获取随企业-时间变化的β_{i,t}
问题:获取随企业-月度变动的β系数(复现Boons等人JFE 2020研究)
我试图在R中复现Boons等人(JFE, 2020)的研究。我拥有含企业-月度层面股票超额收益变动的面板数据集,以及仅含时间序列变动的通胀数据集。我将超额收益对通胀ARMA(1,1)的残差进行回归,模型为:
$R_{i,t}=a+β_{i,t}∗u_{t}+ε_{i,t}$
其中{i}代表企业,{t}代表月度。超额收益(R_{i,t})随企业和月度不同而变化,而u_t是通胀ARMA(1,1)的残差,仅存在时间序列变动。我希望β_{i,t}同时具备企业层面和时间序列层面的变动。
我运行了如下简单OLS回归:ols<-lm(ret~res, data=data)其中ret代表R_{i,t},res代表u_t。但得到的系数仅597个,仅显示时间序列变动,无企业层面变动。请问如何获取每个企业和月度均不同的β_{i,t}?
解决方案
你当前的lm()回归是全局回归,只能得到单一的整体β系数,无法生成随企业和时间变动的β_{i,t}。以下两种方法可以实现需求:
1. 构造企业-月度交互项回归(直接生成对应系数)
通过给每个企业-月度组合创建唯一标识,并与通胀残差项构造交互项,让模型为每个组合单独估计系数:
- 第一步:确保数据集中有明确的企业标识(如
firm_id)和月度标识(如month_id) - 第二步:生成企业-月度交互变量:
data$firm_month <- interaction(data$firm_id, data$month_id) - 第三步:运行不带全局截距的交互项回归:
回归结果中的系数即为每个企业-月度对应的β_{i,t},系数命名格式为model <- lm(ret ~ 0 + res:firm_month, data = data)res:firm_month[企业ID.月度ID],可提取后匹配回原数据集。
2. 使用面板时变系数模型(计量规范方案)
如果需要更严谨的时变系数估计(比如平滑性处理),可以用tvReg包的面板时变系数回归功能:
- 先安装并加载包:
install.packages("tvReg") library(tvReg) - 运行时变面板回归:
tv_model <- tvplm(ret ~ res, data = data, index = c("firm_id", "month_id"), method = "tvOLS") - 提取时变系数:
输出的beta_it <- coef(tv_model)beta_it是一个矩阵,每行对应企业,每列对应月度,直接包含所有β_{i,t}值。
注意事项
- 提前清理数据,确保
firm_id和month_id无缺失、无重复标识 - 若部分企业-月度组合无观测值,两种方法都会自动跳过这些组合,需提前处理缺失样本
- 第一种方法在企业和月度数量极大时会生成大量系数,可能占用较多内存,此时优先选择第二种方法
内容的提问来源于stack exchange,提问作者Liz An
相关产品推荐
相关产品推荐

