在R中转换公司月度收益数据为长面板以执行MacBeth回归的问题
宽格式转面板数据+MacBeth回归解决方案
1. 加载必备工具包
先加载处理数据和面板回归的核心包:
library(tidyr) library(plm) library(dplyr)
2. 宽格式转长格式(自动生成面板结构)
你的数据集是宽格式:每行对应一个时间点(共144个月度观测),每列对应一家公司的收益(共244家公司+日期列=245变量)。直接用pivot_longer一键转成长格式,无需手动复制粘贴:
# 把除日期列外的所有公司列转成"公司名称"和"月度收益"两列 panel_data <- xsr %>% pivot_longer( cols = -Dates, # 排除日期列,其余列都是公司收益 names_to = "Company_Name", # 原列名作为公司名称 values_to = "Monthly_Return" # 原单元格值作为月度收益 )
如果还有其他控制变量(比如市场收益、风险因子),把它们也加入排除项:
panel_data <- xsr %>% pivot_longer( cols = c(-Dates, -Market_Return, -SMB, -HML), # 保留控制变量不转置 names_to = "Company_Name", values_to = "Monthly_Return" )
3. 转换为plm可识别的面板数据格式
用plm包的pdata.frame指定个体(公司)和时间(日期)维度:
# 先确保日期是标准格式(如果原数据是字符型) panel_data$Dates <- as.Date(panel_data$Dates, format = "%Y-%m-%d") # 格式根据你的数据调整 # 生成plm专属面板数据对象 pdata <- pdata.frame(panel_data, index = c("Company_Name", "Dates"))
4. 执行MacBeth回归
用pgm函数运行MacBeth回归,公式根据你的研究需求调整:
# 示例:月度收益对市场收益的MacBeth回归 macbeth_result <- pgm(Monthly_Return ~ Market_Return, data = pdata, model = "mg") # 查看回归结果 summary(macbeth_result)
额外提示
- 如果公司列名有特殊符号,可用
janitor包的clean_names()统一格式:
library(janitor) panel_data <- panel_data %>% clean_names()
- 若时间维度识别异常,可将日期转为年份-月份的数值格式(如
202301)再传入pdata.frame。
内容的提问来源于stack exchange,提问作者Christian Laely
相关产品推荐
相关产品推荐

