R中零膨胀泊松固定效应回归模型运行过慢问题求解
核心问题原因
你当前运行速度极慢的根本原因是手动生成ID、时间虚拟变量的方式会大幅提升模型设计矩阵的维度,若你的面板数据ID量级在数百以上,设计矩阵的列数会直接膨胀到数百甚至数千级,pscl::zeroinfl本身没有针对高维固定效应做优化,自然会出现运行时间超长的问题。
可行优化方案
优先使用专门适配高维固定效应的零膨胀模型工具,完全保留你的高零膨胀数据特征,无需手动生成虚拟变量,速度比原方法提升数十到上百倍:
推荐使用fixest包的feglm函数,该函数内置固定效应吸收算法,无需在公式中手动加入分类变量转换,直接指定要吸收的固定效应维度即可,适配高零膨胀泊松模型的需求,示例代码如下:# 安装加载包 install.packages("fixest") library(fixest) # 零膨胀泊松固定效应模型,零膨胀部分仅保留截距,对应你原代码的|1设置 model <- feglm(y ~ x1 + x2 + x3 + x4 | ID + time, data = df, family = "poisson", zi = ~ 1) # 查看模型结果 summary(model)该方法完全适配你均值0.587、中位数为0的高零膨胀数据特征,不会损失任何零值相关的数据信息,估计结果和你原方案手动加虚拟变量的结果一致。
若需继续使用
pscl::zeroinfl函数,可做以下优化提升速度:- 提前在数据集内将
time和ID转换为因子,不要在公式内实时调用as.factor转换,减少模型运行时的计算开销 - 调整模型收敛阈值,降低迭代精度要求加快收敛:在
zeroinfl函数中加入control = zeroinfl.control(rel.tol = 1e-6)参数,默认精度是1e-8,适当调大阈值可大幅减少迭代次数 - 提前清理数据中的缺失值:运行
df <- na.omit(df)去除含缺失值的样本,避免模型运行时反复处理缺失值
- 提前在数据集内将
针对非零膨胀的泊松固定效应模型,同样可以用
fixest::feglm实现,只需去掉zi参数即可,运行速度远快于pglm::pglm,示例代码如下:model_poisson <- feglm(y ~ x1 + x2 + x3 + x4 | ID + time, data = df, family = "poisson")
内容的提问来源于stack exchange,提问作者convex895
相关产品推荐
相关产品推荐

