【问题标题】:why does logistic regression still work when # failures is negative?为什么当 # failures 为负数时逻辑回归仍然有效?
【发布时间】:2016-11-04 02:19:02
【问题描述】:

我在 R 中运行二项式 glm,并且在某些情况下失败次数为负数。 (发生这种情况是因为数据中存在一些测量误差)。我希望 glm 函数不适用于这些情况,因为 log(#successes/#failures) 未定义。令我惊讶的是,glm 运行并提供了回归系数的估计值。我不明白为什么 glm 有效,也不明白如何解释结果。

例如:

succ=c(3,0,1,4,2,4,4,7,15,4);
fail=c(1016,1506,1285,1152,868,610,432,211,129,-4);
x_age=c(42.5,47.5,52.5,57.5,62.5,67.5,72.5,77.5,82.5,87.5);

glm(cbind(succ,fail) ~ x_age, family=binomial);

Call:  glm(formula = cbind(succ, fail) ~ x_age, family = binomial)

Coefficients:
(Intercept)        x_age  
     -14.15         0.14  

Degrees of Freedom: 8 Total (i.e. Null);  7 Residual
Null Deviance:      105 
Residual Deviance: 17.7         AIC: 47.3

【问题讨论】:

  • succ 中的最后一个数字是 4 很重要,因为成功和失败的总和为 0。相比之下,这不起作用:> succ=c(3,0,1,4,2,4,4,7,15,1) > fail=c(1016,1506,1285,1152,868,610,432,211,129,-4); x_age=c(42.5,47.5,52.5,57.5,62.5,67.5,72.5,77.5,82.5,87.5); > glm(cbind(succ,fail) ~ x_age, family=binomial); Error in family$linkfun(mustart) : Value -0.75 out of range (0, 1)
  • 我几乎可以肯定它只是忽略了成功+失败
  • @Sycorax 最后的评论,正如在别处讨论的那样,逻辑 glm 似乎适合伯努利 (0,1) 结果,并且不采用实际数据的 logits。所以#success 和#failures 格式是底层伯努利结果的综合表示。因此,这里的基本问题是 R 如何将负数的失败重新编码为伯努利结果?似乎当#success + #failure=0(和#failure
  • 我不认为这是题外话。这不是关于 R 或 glm() 的实现细节,而是关于理论上理解一个令人惊讶的结果。投票保持开放。
  • 我不清楚这是一个有意义的统计问题。 “如何正确处理负数的失败”不是一个有意义的统计问题。相反,在我看来,问题是“R 的开发人员如何决定处理用户输入无意义数据的情况”。他们也可以选择返回一个错误,从统计的角度来看,这同样可以辩护。

标签: r regression


【解决方案1】:

基本上,我不认为包作者预期失败或成功的负数作为输入。这没有意义,你不应该这样做。

浏览R源码:

每个案例的观察次数是成功次数+失败次数。

n <- y[, 1] + y[, 2]

那么y被赋值为成功的概率:

 y <- ifelse(n == 0, 0, y[, 1]/n)

设$s_i$ 为成功次数。 设 $f_i$ 为失败次数。

在 $s_i + f_i \neq 0$ 的情况下,我们有 $ y_i = \frac{s_i}{s_i + f_i}$。

在 $s_i + f_i = 0$ 的情况下,我们有 $y_i = 0$。

观察它的作用!在您有 4 次成功和 -4 次失败的情况下,成功的概率设置为零!

然后设置mustart:

mustart <- (n * y + 0.5)/(n + 1)

设$s_i$ 为成功数,$f_i$ 为失败数。总之,我们有:

如果 $s_i + f_i \neq 0$ 我们有:

$$ \mu^{开始}_i = \frac{s_i + .5}{s_i + f_i + 1}$$

如果 $s_i + f_i = 0$ 我们有: $$ \mu^{开始}_i = \frac{1}{2}$$

然后c functionlogit_link 会检查 mustart 是否在 (0,1) 范围内。所以如果你传递了 4 个成功和 -2 个失败,这将抛出一个错误,但它不会抛出一个成功 + 失败 = 0 的错误。

if (x < 0 || x > 1)
error(_("Value %g out of range (0, 1)"), x);

无论如何,我看不出这与统计数据有什么关系。在我看来,这个 R 代码似乎有一些不完善的错误检查。

【讨论】:

    猜你喜欢
    • 2017-03-06
    • 2015-08-10
    • 2021-03-11
    • 2017-08-16
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-01
    • 2018-03-10
    相关资源
    最近更新 更多