使用plm替代biglm实现固定效应回归失败,寻求修改方案
解决plm运行面板固定效应回归的问题
首先,咱们先聊聊你当前代码里的核心问题:你把数据按FundId拆分后,每个子集里只有单个基金的时间序列数据——相当于每个子集是单个体的时间序列,但plm的固定效应模型需要的是多个体+多时间点的面板结构,单个个体根本没有“固定效应”可以估计,这就是plm没法正常运行的原因。
你原本用biglm是为了处理大数据,现在想转plm加固定效应,完全不需要拆分数据,直接在整个数据集上运行面板回归就好,下面是修改后的可行方案:
方法1:用plm正确实现个体固定效应回归
library(biglm) library(plm) library(data.table) # 你的样本数据 union_with_factors = data.table( t = c(1,2,3,4,5,1,2,3,4,5,1,2,3,4,5), excessr = c(10,23,13,53,43,76,34,12,45,13,42,31,4,53,64), FundId = c("x","x","x","x","x","y","y","y","y","y","z","z","z","z","z"), mkt_rf = c(1,1,2,1,3,1,1,2,1,3,1,1,2,1,3) ) # 直接在整个数据集上运行个体固定效应回归 # 指定index为个体(FundId)和时间(t),model="within"对应固定效应 fit_plm <- plm(excessr ~ mkt_rf, data = union_with_factors, index = c("FundId", "t"), # 告诉plm谁是个体、谁是时间维度 model = "within") # 个体固定效应模型 # 查看回归结果 summary(fit_plm) # 提取系数 coef(fit_plm)
这段代码的逻辑很清晰:把整个数据集当作面板数据,plm会自动识别每个FundId是一个独立个体,每个t是时间点,model="within"会帮你控制每个基金的个体固定效应,最终估计出mkt_rf对excessr的净影响。
针对大数据的优化建议
如果你的真实数据集体量特别大,plm在内存效率上可能不够理想,推荐试试fixest包的feols()函数——它专门针对大面板数据做了优化,运行速度更快、内存占用更低,语法也更直观:
library(fixest) # 用feols实现个体固定效应,|后面直接跟着要控制的固定效应变量 fit_fixest <- feols(excessr ~ mkt_rf | FundId, data = union_with_factors) summary(fit_fixest) coef(fit_fixest)
再说说你原来的代码为啥不行
你之前拆分数据后,每个子集只有一个FundId,plm的固定效应是用来捕捉个体间的差异的,单个个体没有差异可捕捉,自然没法正常估计,甚至会输出无意义的结果。
内容的提问来源于stack exchange,提问作者Rbeginner




