如果我的数据没有表现出线性分离,我怎么会在 glm/glm2 中得到这个逻辑回归错误?

How come I get this logistic regression error in glm/glm2 if I don't exhibit linear separation in my data?

我开始运行进入错误(由警告转换而来):

glm.fit (or glm.fit2): fitted probabilities numerically 0 or 1 occurred

我发现这个 link 引用数据的线性分离:

[R] glm.fit: "fitted probabilities numerically 0 or 1 occurr

所以我尝试搜索数据并从数据的一小部分(glm 和 glm2)中找到了一个小的可重现示例,我实际上没有看到线性分离,但我得到了错误:

response = c(0,1,0,1,0,0,0,0,0,0)
dependent = c(133,571,1401,4930,3134075,44357054,1718619387,1884020779,8970035092,9392823637)
foo = data.frame(y=response,x=dependent)
glm(y ~ x, family=binomial, data=foo)

我可以通过 log(x+1) 转换依赖项来避免这个问题,但是,这是单调的并且不会改变顺序,所以我不确定为什么这有帮助以及我是否应该这样做。依赖项是 "microseconds since the last time some event happened",这就是为什么某些值可能很大的原因。我尝试将其转换为(最近的,不是最近的)的两级因子,但这会丢失信息并且表现不及原始值。

我认为这只是数据的一个特征和最大似然函数优化中正在进行的浮点计算的舍入。

看看对数变换集的拟合值:

> response = c(0,1,0,1,0,0,0,0,0,0)
> dependent = c(133,571,1401,4930,3134075,44357054,1718619387,1884020779,8970035092,9392823637)
> 
> foo = data.frame(y=response,x=log(dependent))
> mlog <- glm(y ~ x, family=binomial, data=foo)
> mlog$fitted
          1           2           3           4 
0.584089292 0.484155299 0.422713978 0.340825478 
          5           6           7           8 
0.079815887 0.040011202 0.014931996 0.014562755 
          9          10 
0.009506656 0.009387457 

而未转换的集合会导致出现微小的拟合值:

> foo = data.frame(y=response,x=dependent)
> m <- glm(y ~ x, family=binomial, data=foo)
Warning message:
glm.fit: fitted probabilities numerically 0 or 1 occurred 
> m$fitted.values
           1            2            3 
5.007959e-01 5.005387e-01 5.000511e-01 
           4            5            6 
4.979784e-01 6.359085e-04 2.220446e-16 
           7            8            9 
2.220446e-16 2.220446e-16 2.220446e-16 
          10 
2.220446e-16 

似乎不​​是与数据完全(或准)分离相关的警告。我认为在这种情况下警告非常有用。

这不是错误,您声称系统将其标记为错误的说法具有误导性。这是一个警告,并清楚地标记为警告。首先绘制您的数据,然后回答问题:当 "dependent" 变量高于 1e+09 时,您估计的概率是多少?

如果您的答案不是零,我认为您需要解释为什么会这样。

 png(); plot(response~dependent); lines( seq(0, 1e10, length=100) , predict(fit,  list(x=seq(0, 1e10, length=100)), type="response"), col="red" ); dev.off()