r语言 - 为什么泊松回归的似然/AIC是无限的



我正试图评估R中几个回归的模型拟合,并且我遇到了一个问题,我现在已经多次遇到:泊松回归的对数似然是无限的。

我正在使用一个非整数因变量(注意:我知道我在这方面做什么),我想知道是否可能这就是问题所在。然而,当运行与glm.nb的回归时,我没有得到无限的对数似然。

重现此问题的代码如下。

编辑:当我将DV强制为整数时,问题似乎消失了。有人知道如何从非整数dv的泊松中得到对数似然吗?

# Input Data
so_data <- data.frame(dv = c(21.0552722691125, 24.3061351414885, 7.84658638053276, 
25.0294679770848, 15.8064731063311, 10.8171744654056, 31.3008088413026, 
2.26643928259238, 18.4261153345417, 5.62915828161753, 17.0691184593063, 
1.11959635820499, 30.0154935602592, 23.0000809735738, 28.4389825676123, 
27.7678405415711, 23.7108405071757, 23.5070651053276, 14.2534787168392, 
15.2058525068363, 19.7449094187771, 2.52384709295823, 29.7081691356397, 
32.4723790240354, 19.2147002673637, 61.7911384519901, 10.5687170234821, 
23.9047421013736, 18.4889651451222, 13.0360878554798, 15.1752866581849, 
11.5205948111817, 31.3539840929108, 31.7255952728076, 25.3034625215724, 
5.00013988265465, 30.2037887018226, 1.86123112349445, 3.06932041603219, 
22.6739418581257, 6.33738321053804, 24.2933951601142, 14.8634827414491, 
31.8302947881089, 34.8361908525564, 1.29606416941288, 13.206844629927, 
28.843579313401, 25.8024295609021, 14.4414831628722, 18.2109680632694, 
14.7092063453463, 10.0738043919183, 28.4124482962025, 27.1004208775326, 
1.31350378236957, 14.3009307888745, 1.32555197766214, 2.70896028922312, 
3.88043749517381, 3.79492216916016, 19.4507965653633, 32.1689088941444, 
2.61278585713499, 41.6955885902228, 2.13466761675063, 30.4207256294235, 
24.8231524369244, 20.7605955978196, 17.2182798298094, 2.11563574288652, 
12.290778250655, 0.957467139696772, 16.1775287334746))
# Run Model
p_mod <- glm(dv ~ 1, data = so_data, family = poisson(link = 'log'))
# Be Confused
logLik(p_mod)

详细说明@ekstroem的评论:泊松分布只支持非负整数(0,1,…)。因此,从技术上讲,任何非整数值的概率都是零——尽管R允许一点模糊,以允许舍入/浮点表示问题:

> dpois(1,lambda=1)
[1] 0.3678794
> dpois(1.1,lambda=1)
[1] 0
Warning message:
In dpois(1.1, lambda = 1) : non-integer x = 1.100000
> dpois(1+1e-7,lambda=1)  ## fuzz
[1] 0.3678794

理论上可以计算非整数值的泊松对数似然:

my_dpois <- function(x,lambda,log=FALSE) {
   LL <- -lambda+x*log(lambda)-lfactorial(x)
   if (log) LL else exp(LL)
}

但我会非常小心 - integrate的一些快速测试表明它集成到1(在我修复了它的错误之后),但我还没有更仔细地检查这真的是一个很好的概率分布。(另一方面,CrossValidated上一些看似合理的帖子表明这并不疯狂…)

你说"我知道我在这方面做什么";你能多说一些背景吗?一些替代的可能性(虽然这是转向交叉验证领域)——最好的答案取决于你的数据真正来自哪里(例如,为什么你有非整数的"计数"数据,但你认为应该被视为泊松)。

  • 为准泊松模型(family=quasipoisson)。(在这种情况下,R仍然不会给你对数似然值或AIC值,因为从技术上讲它们不存在——你应该根据参数的Wald统计量进行推断;更多信息请参见此处)
  • Gamma模型(可能带有日志链接)
  • 如果数据一开始是计数数据,你已经通过一些努力或暴露的措施进行缩放),使用适当的补偿模型…
  • 具有适当异方差规格的广义最小二乘模型(nlme::gls)

泊松对数似然包括计算log(阶乘(x)) (https://www.statlect.com/fundamentals-of-statistics/Poisson-distribution-maximum-likelihood)。对于大于30的值,必须使用斯特林近似公式,以避免超出计算机运算的极限。Python示例代码:

# define a likelihood function. https://www.statlect.com/fundamentals-of- statistics/Poisson-distribution-maximum-likelihood
def loglikelihood_f(lmba, x):
    #Using Stirling formula to avoid calculation of factorial.
    #logfactorial(n) = n*ln(n) - n
    n = x.size
    logfactorial = x*np.log(x+0.001) - x #np.log(factorial(x))
    logfactorial[logfactorial == -inf] = 0
    result =
        - np.sum(logfactorial) 
        - n * lmba 
        + np.log(lmba) * np.sum(x)
    return result

最新更新