bibliografia i dataset del corso studentiannoscorso.txt vaevt.txt swelling.txt tubi.txt |
::biodata:: | ::didattica:: | ::in regalo:: | ::utilità:: | ||
Facoltà di Medicina e Chirurgia a.a. 2009-2010 Corso di Laurea Magistrale in Biotecnologie Mediche Corso Integrato di Innovazione Biotecnologica Analisi Multivariata dei Dati Sperimentali La regressione logistica: introduzione ai modelli lineari generalizzati scegliere e diagnosticare la bontà di un modello per un fattore (es. outcome 0/1) vs. covariate continue e/o factor
# rm (list = ls() ) www <- "http://www.dmi.units.it/~borelli/biotec/vaevt.txt" vaevt <- read.table( www , header = TRUE ) attach(vaevt) deltavaevt <- quarantotto - basale deltapafi <- pafi48 - pafi0 vaevt[1:10,] # facciamo un po' di analisi esplorativa: sarà più "importante" deltapafi o deltavaevt? Vediamolo con i conditional density plot layout( matrix(1:2, ncol = 2)) cdplot( factor(outcome) ~ deltavaevt) cdplot( factor(outcome) ~ deltapafi) # ancora un po' di analisi esplorativa: la probabilità di avere outcome infausto? plot( deltapafi ~ deltavaevt, col = "white" ) points( deltapafi[outcome =="1"] ~ deltavaevt[outcome=="1"], col = "darkgreen", pch = 22 ) points( deltapafi[outcome =="0"] ~ deltavaevt[outcome=="0"], col = "red", pch = 19 ) # introduciamo un modello lineare generalizzato modello1 <- glm( outcome ~ deltavaevt, family = binomial() ) summary(modello1) # l'intercetta non è significativa, leviamola: modello2 <- glm( outcome ~ deltavaevt - 1 , family = binomial() ) summary(modello2) # vediamo se anche deltapafi è un valido predittore: modello3 <- glm( outcome ~ deltavaevt + deltapafi - 1 , family = binomial() ) summary(modello3) # a quanto pare, non serve aggiungere deltapafi nel modello. Lo controlliamo formalmente: anova( modello2, modello3, test = "Chisq" ) # cosa significano i coefficienti di modello2? Vediamolo graficamente modello2 plot( deltavaevt, outcome) b <- modello2$coef[[1]] probabilita <- exp ( 0 + b * deltavaevt) / ( 1 + exp( 0 + b * deltavaevt) ) probabilita plot( deltavaevt, outcome ) points( deltavaevt, probabilita, col = "red") min(deltavaevt) max(deltavaevt) x <- -285:405/100 lineacurva <- exp ( 0 + b * x ) / ( 1 + exp( 0 + b * x ) ) plot( deltavaevt , outcome) points( deltavaevt , probabilita, col = "red") points( x, lineacurva, col = "red", pch =".") lines ( c( min(deltavaevt) , max(deltavaevt) ) , c(0.5, 0.5) , col = "blue" ) # un aumento di 1 unità di deltavaevt aumenta il log-odds di modello2$coef[[1]] . Se invece della stima puntuale desideriamo una stima intervallare? confint(modello2, parm = "deltavaevt") # passiamo dai logit alle probabilità exp(coef(modello2)["deltavaevt"]) exp(confint(modello2, parm = "deltavaevt")) # l'intervallo di fiducia al 95% è molto ampio, e noninformativo. # Si noti però che il valore 1 non appartiene all'intervallo (descrizione equivalente di *) # Visualizziamo con un bubble plot il modello2 raffrontandolo con il plot esplorativo di poco fa prob2 <- predict (modello2, type = "response") prob2 plot( deltapafi ~ deltavaevt, xlim = c(-0.3, 0.5), ylim = c(-200,300), col = "white" ) points( deltapafi[outcome =="1"] ~ deltavaevt[outcome=="1"], col = "darkgreen", pch = 22 ) points( deltapafi[outcome =="0"] ~ deltavaevt[outcome=="0"], col = "red", pch = 19 ) symbols( deltavaevt , deltapafi , circles = prob2, add = TRUE) # si osservi infine il fenomeno della sovradispersione: la devianza residua è superiore ai gradi di libertà residui. Possiamo compensare questo fatto modificando il parametro di dispersione (cioè, la "forma" della variabile aleatoria che modella la componente casuale Y del glm. modello2bis <- glm( outcome ~ deltavaevt - 1 , family = quasibinomial() ) summary(modello2bis) # attenzione. Avremmo sbagliato di grosso a tentare un modello lineare .. modellosbagliato <- lm( outcome ~ deltavaevt) summary(modellosbagliato) plot(modellosbagliato)
|