You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

pscl与countreg包中zeroinfl函数结果差异的原因探究

零膨胀负二项模型:pscl与countreg包zeroinfl结果差异解析

我以教学为目的,使用R语言COUNT包中的mdvis数据集,分别调用pscl和countreg包的zeroinfl函数拟合零膨胀负二项模型,但两者输出结果差异显著。其中Stata的拟合结果与pscl包的zeroinfl结果高度相似,尤其是计数部分。我已通过zeroinfl.control()设置相同参数,特询问产生该差异的原因。

pscl包zeroinfl拟合结果

mdvisit_zeroinf <- pscl::zeroinfl(numvisit ~ reform + badh + agegrp + educ + loginc | reform + badh + agegrp + educ + loginc, dist = "negbin", data = mdvis, control = zeroinfl.control(method = "BFGS", EM=F))
summary(mdvisit_zeroinf) 
Call:
pscl::zeroinfl(formula = numvisit ~ reform + badh + agegrp + educ + loginc | 
    reform + badh + agegrp + educ + loginc, data = mdvis, dist = "negbin")
Pearson residuals:
    Min      1Q  Median      3Q     Max 
-0.9667 -0.8037 -0.3597  0.3154  9.4878 

Count model coefficients (negbin with log link):
            Estimate Std. Error z value Pr(>|z|)    
(Intercept) -0.30316    0.56565  -0.536   0.5920    
reform      -0.09916    0.05543  -1.789   0.0736 .  
badh         1.11555    0.07517  14.841   <2e-16 ***
agegrp2      0.11376    0.06990   1.628   0.1036    
agegrp3      0.21126    0.08620   2.451   0.0143 *  
educ2        0.07605    0.07209   1.055   0.2914    
educ3       -0.03979    0.07295  -0.545   0.5854    
loginc       0.13209    0.07499   1.761   0.0782 .  
Log(theta)   0.04747    0.05815   0.816   0.4144    

Zero-inflation model coefficients (binomial with logit link):
            Estimate Std. Error z value Pr(>|z|)
(Intercept) -30.7110   772.2930  -0.040    0.968
reform       14.3274   763.7283   0.019    0.985
badh         -1.9503     3.5392  -0.551    0.582
agegrp2      10.9236   113.6292   0.096    0.923
agegrp3       9.7723   113.6558   0.086    0.931
educ2        -0.6632     1.9878  -0.334    0.739
educ3        -0.8743     1.3501  -0.648    0.517
loginc        0.5437     1.9718   0.276    0.783
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 

Theta = 1.0486 
Number of iterations in BFGS optimization: 106 
Log-likelihood: -4557 on 17 Df

countreg包zeroinfl拟合结果

mdvisit_zeroinf2 <- countreg::zeroinfl(numvisit ~ reform + badh + agegrp + educ + loginc | reform + badh + agegrp + educ + loginc, dist = "negbin", data = mdvis, control = zeroinfl.control(method = "BFGS", EM=F))
summary(mdvisit_zeroinf2)
Call:
countreg::zeroinfl(formula = numvisit ~ reform + badh + agegrp + educ + loginc | 
    reform + badh + agegrp + educ + loginc, data = mdvis, dist = "negbin", 
    control = zeroinfl.control(method = "BFGS", EM = F))
Pearson residuals:
    Min      1Q  Median      3Q     Max 
-0.9523 -0.8057 -0.3615  0.3106  9.6300 

Count model coefficients (negbin with log link):
            Estimate Std. Error z value Pr(>|z|)    
(Intercept) -0.44473    0.53752  -0.827  0.40803    
reform      -0.12962    0.05106  -2.538  0.01113 *  
badh         1.13558    0.07413  15.319  < 2e-16 ***
agegrp2      0.05851    0.06359   0.920  0.35756    
agegrp3      0.18678    0.07176   2.603  0.00925 ** 
educ2        0.06398    0.06621   0.966  0.33385    
educ3       -0.04825    0.07087  -0.681  0.49599    
loginc       0.15338    0.07056   2.174  0.02973 *  
Log(theta)   0.01232    0.04778   0.258  0.79652    

Zero-inflation model coefficients (binomial with logit link):
            Estimate Std. Error z value Pr(>|z|)  
(Intercept) -119.137     95.259  -1.251   0.2111  
reform         4.821      2.646   1.822   0.0684 .
badh         -21.461   4614.989  -0.005   0.9963  
agegrp2        9.261     28.341   0.327   0.7438  
agegrp3        3.502     27.984   0.125   0.9004  
educ2        -19.790    203.802  -0.097   0.9226  
educ3         -7.894      4.758  -1.659   0.0971 .
loginc        13.010     10.463   1.243   0.2137  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 
Theta = 1.0124 
Number of iterations in BFGS optimization: 197 
Log-likelihood: -4554 on 17 Df

差异原因分析

  • 负二项分布参数化差异:两个包对负二项分布的过度离散参数theta定义不同。pscl采用方差 = 均值 + 均值²/theta的参数化方式,countreg则使用方差 = 均值*(1 + theta*均值),这种参数化差异会直接导致计数模型系数、theta估计值及似然计算结果出现偏差。

  • 优化初始化策略不同:尽管都设置了BFGS优化方法且关闭EM算法,两个包的默认起始值选择逻辑不同。pscl的起始值更贴近Stata的拟合策略,易收敛到与Stata一致的局部最优解;而countreg的起始值可能引导优化过程收敛到另一个似然值略高的局部最优(从log-likelihood值-4554 vs -4557可看出)。

  • 零膨胀模型的数值稳定性差异:当前数据中零膨胀部分的系数估计极不稳定(两个结果中零膨胀截距都极大,标准误也异常大),说明零膨胀部分的识别性较弱。此时,两个包在似然函数梯度计算、数值优化精度控制(如收敛阈值、步长调整)上的细微差异,会被放大为显著的结果差异。

  • 底层实现逻辑差异:pscl的zeroinfl是较早实现的零膨胀模型工具,基于独立的优化逻辑;而countreg的zeroinfl基于广义线性模型框架扩展,两者在似然函数计算细节、优化算法底层实现上存在差异,即使设置了相同控制参数,默认的数值计算细节也会影响最终结果。

内容的提问来源于stack exchange,提问作者Ayalew A.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 09:37:00