如果我的数据中没有线性分离,为什么我在glm / glm2中得到这个逻辑回归误?

时间:2015-08-10 20:47:39

标签: r glm logistic-regression

我开始遇到错误(从警告转换):

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

我发现此链接引用了数据的线性分离:

[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)

我可以通过转换依赖的via log(x+1)来避免这个问题,但是,这是单调的并且不会改变顺序,因此我不确定为什么这会有所帮助以及我是否应该这样做。依赖性是“自上次发生某些事件以来的微秒”,这就是为什么某些值可能很大的原因。我尝试将其转换为(最近的,不是最近的)两级因素,但是丢失了信息并且表现不佳。

2 个答案:

答案 0 :(得分:2)

我认为这只是数据的一个特征,也是最大似然函数优化中浮点计算的四舍五入。

查看对数转换集的拟合值:

> 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 

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

答案 1 :(得分:1)

这不是一个错误,并且您声称它被系统标记为错误会产生误导。这是一个警告,并清楚地标明了这一点。首先绘制数据,然后回答问题:当&#34;依赖&#34;变量高于1e + 09时,您对概率的估计是多少? enter image description here

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

 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()

enter image description here