非线性数据的逻辑回归

Logistic regression for non-linear data

我有一个具有连续自变量和二元相关的数据。因此,我试图应用逻辑回归来分析这些数据。然而,与具有 S 形过渡的经典案例相比,我有两个过渡。 这是我的意思的一个例子

library(ggplot)
library(visreg)

classic.data = data.frame(x = seq(from = 0, by = 0.5, length = 30),
                          y = c(rep(0, times = 14), 1, 0, rep(1, times = 14)))

model.classic = glm(formula = y ~ x,
                    data = classic.data,
                    family = "binomial")

summary(model.classic)

visreg(model.classic,
       partial = FALSE,
       scale = "response",
       alpha = 0)

my.data = data.frame(x = seq(from = 0, by = 0.5, length = 30),
                     y = c(rep(0, times = 10), rep(1, times = 10), rep(0, times = 10)))

model.my = glm(formula = y ~ x,
                    data = my.data,
                    family = "binomial")

summary(model.my)

visreg(model.my,
       partial = FALSE,
       scale = "response",
       alpha = 0)

两个图上的蓝线 - 它是 glm 的结果,而红线是我想要的。 有什么方法可以将逻辑回归应用于此类数据?或者我应该应用一些其他类型的回归分析?

在您的第二个模型中,y 不是 x 的线性函数。当您编写 y ~ x 时,您假设当 x 增加时,y 将 increase/decrease 取决于 positive/negative 系数。事实并非如此,它先增加后减少,使 x 的平均效应为零(因此是海峡线)。因此,您需要一个 non-linear 函数。您可以使用 mgcv 包中的 gam 来做到这一点,其中 x 的效果被建模为平滑函数:

library(mgcv)
my.data = data.frame(x = seq(from = 0, by = 0.5, length = 30),
                     y = c(rep(0, times = 10), rep(1, times = 10), rep(0, times = 10)))

m = gam(y ~ s(x), data = my.data, family = binomial)
plot(m)

这将导致以下符合原始比例:

my.data$prediction = predict(m, type = "response")
plot(my.data$x, my.data$y)
lines(my.data$x, my.data$prediction, col = "red")