Логистическая регрессия для нелинейных данных

#r #regression #logistic-regression

#r #регрессия #логистическая регрессия

Вопрос:

У меня есть данные с непрерывной независимой переменной и двоичной зависимостью. Поэтому я пытался применить логистическую регрессию для анализа этих данных. Однако, в отличие от классического случая с 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, а красная линия — это то, что я хочу иметь.
Есть ли какой-либо способ применить логистическую регрессию к таким данным? Или я должен применить какой-либо другой тип регрессионного анализа?

Ответ №1:

В вашей второй модели y это не линейная функция x . Когда вы пишете y ~ x , вы предполагаете, что при x увеличении y будет увеличиваться / уменьшаться в зависимости от положительного / отрицательного коэффициента. Это не так, оно увеличивается, а затем уменьшается, что делает средний эффект x равным нулю (отсюда прямая линия). Поэтому вам нужна нелинейная функция. Вы могли бы сделать это с помощью a gam из mgcv пакета, где эффект 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")
  

введите описание изображения здесь