Regressione logistica per dati non lineari

Sep 17 2020

Ho un dato con variabile indipendente continua e dipendente binario. Pertanto stavo cercando di applicare la regressione logistica per l'analisi di questi dati. Tuttavia, a differenza del caso classico con transizione a forma di S, ho due transizioni. Ecco un esempio di cosa intendo

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)

Le linee blu su entrambi i grafici sono il risultato di glm, mentre la linea rossa è quello che voglio avere. C'è un modo per applicare la regressione logistica a tali dati? O dovrei applicare qualche altro tipo di analisi di regressione?

Risposte

2 J.C.Wahl Sep 17 2020 at 13:16

Nel tuo secondo modello, ynon è una funzione lineare di x. Quando scrivi y ~ xpresumi che quando xaumenta, yaumenterà / diminuirà a seconda di un coefficiente positivo / negativo. Non è così, sta aumentando e poi diminuendo, rendendo l'effetto medio pari a xzero (da qui la linea di stretto). È quindi necessaria una funzione non lineare. Puoi farlo con un gamdal mgcvpacchetto, dove l'effetto di xè modellato come una funzione liscia:

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)

Ciò porterebbe al seguente adattamento sulla scala originale:

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