Introducción a modelos lineales generalizados (GLM) en R Introducción En esta práctica vamos a analizar los principales modelos de regresión (logit, probit, poisson, etc) usando el programa R. Para ello, se va a seguir el documento de Altham ”Introduction to statistical modelling in R”. En los ficheros adjuntos están los datos y los diferentes programas que usaremos para esta practica. Cada una de las siguientes secciones expone un modelo distinto. En primer lugar veremos una regresión que con añadir un componente cuadrático podemos estimar correctamente la regresión. Regresión con un componente cuadrático En primer lugar cargamos los datos weldtable< − read.table(”weld”,header=F) Definimos las variables X e Y x< − weldtable[,1] y< −weldtable[,2] plot(x,y) teeny<-lm(y x) Este ultimo comando ajusta el siguiente modelo yi = α, βxi + ²i , 1 ≤ i ≤ n bajo el supuesto de que los errores ²i , 1 ≤ i ≤ n provienen de una distribución normal (0,σ 2 ). Para ver los resultados obtenidos summary(teeny) fv1< −teeny$fitted.values Ahora creamos dos gráficos, en el primero están las estimaciones para cada punto y en el segundo están los datos y la recta de regresión estimada. par(mfrow=c(2,1)) plot(x,fv1) plot(x,y) abline(teeny) Para dibujar los residuos de la regresión estimadas usamos par(mfrow=c(1,1)) 1 Y<-cbind(y,fv1) matplot(x,Y,type=”pl”) res<-teeny$residuals plot(x,res) Como vemos que los puntos para valores pequeños y grandes de x están por debajo de la linea de regresión estimada y el resto por encima es conveniente añadir un termino cuadrático a la regresión. Para ello introducimos los siguientes comandos xx<-x*x teeny2< −lm(y x+xx) summary(teeny2,cor=T) Para observar el nuevo ajuste dibujamos los puntos y los valores ajustados por la recta de regresión fv2<-teeny2$fitted.values plot(x,y) lines(x,fv2,lty=2) Análisis de normalidad en los residuos En este segundo análisis vamos a ver cómo es necesario transformar las variables para conseguir normalidad en los residuos y evitar el efecto de observaciones influyentes. Para ello usaremos la base de datos que relaciona el peso del cerebro y el peso corporal para diferentes especies de mamı́feros. En primer lugar cargamos los datos library(MASS) data(mammals) attach(mammals) species<-row.names(mammals) x<-body y<-brain plot(x,y) Localizamos a las dos especies de elefantes (pinchar con el botón izquierdo del ratón) identify(x,y,species) Ahora usamos los logaritmos en ambas variables y repetimos la operación plot(log(x),log(y)) identify(log(x),log(y),species) Estimamos la recta de regresión con las variables originales species.lm<-lm(y x) summary(species.lm) Ahora dibujamos los residuos y los valores ajustados par(mfrow(c(2,2)) plot(x,y) abline(species.lm) 2 r< −species.lm$residuals f<-species.lm$fitted.values qqnorm(r) qqline(r) Ahora hacemos el mismo análisis pero con las variables en logaritmos lx<-log(x) ly<-log(y) species.llm<-lm(ly lx) summary(species.llm) plot(lx,ly) abline(species.llm) rl<-species.llm$residuals fl<-species.llm$fitted.values qqnorm(rl) qqline(rl) Regresión logı́stica para la distribución binomial En esta sección vamos a ver varios ejemplos de modelos lineales generalizados, para el caso de la regresión logı́stica. En primer lugar vemos la ayuda que nos da el comando glm, Para ello introducimos help(glm) En este primer ejemplo se analizan cuantas piezas para un avion no pasaron el test que media la presión de ruptura. Para ello calculamos las tres funciones link posibles para este conjunto de datos, logit, probit y log-log. data6<-read.table(”alloyf.txt”,header=T) attach(data6) p< −r/n plot(Load,p) ex6.l<-glm(p Load,weights=n,family=binomial(link=logit)) ex6.p<-glm(p Load,weights=n,family=binomial(link=probit)) ex6.cll<-glm(p Load,weights=n,family=binomial(link=cloglog)) summary(ex6.l) summary(ex6.p) summary(ex6.cll) Para ver el ajuste del modelo logit realizamos el gráfico de puntos y de la recta de regresión estimada. Para ello usamos los comandos siguientes: x<-15:55 alpha<-ex6.l$coefficients[1] beta<-ex6.l$coefficients[2] y<-alpha + beta*x Y<-1/(1+exp(-y)) plot(x,Y,type=”l”,xlab=Load,ylab=”Probabilidad estimada de fallo”) abline(v=25) abline(v=43) points(Load,p) 3 title(”Ajuste de un modelo logı́stico”) En el siguiente ejemplo analizamos la influencia de la temperatura en la probabilidad de fallo en el conducto de trasmisión de combustible en lanzaderas espaciales. En primer lugar cargamos los datos: datos<-read.table(”nasa.txt”,header=T) attach(datos) Transformamos los datos para tener una variable binomial. Para ello six<-rep(6,times=23) pfail<-nfail/six first.glm<-glm(pfail temp,binomial,weights=six) fv< −first.glm$fitted.values plot(temp,fv,type=”l”,xlim=c(30,85),ylim=c(0,1),xlab=”temperatura”,ylab=”probabilidad de fallo”) points(temp,pfail) title(”datos de fallos de lanzamientos y curva estimada de fallo”) Regresión de Poisson En esta sección mostramos el uso de la distribución de Poisson para estimar una regresión log-lineal. y<-c(0,0,3,0,1,1,1,2,2,4,2,8,0,3,4,5,2,2,2,5,4,3,15,12,7,14,6,10,14,8,19,10,7,20,10,19) i=1:36 plot(i,y) aids.reg< −glm(y i,family=poisson) aids.reg summary(aids.reg) fv< − aids.reg$fitted.values points(i,fv,pch=”*”) lines(i,fv) El siguiente ejemplo muestra el número de dimisiones durante cada mandato, la duración de dicho mandato, ası́ como la ideologı́a del partido gobernante en el Reino Unido. En este ejemplo los datos se ajustan más a una distribución de Poisson que en el caso anterior. Resignations<-read.table(”Resignations.txt”,header=T) attach(Resignations) plot(Res log(years),pch=19,col=c(4,2)[Gov]) title(”Dimisiones ministeriales (años en logaritmos)”) legend(”topleft”,legend=c(”conservadores”,”laboristas”)mcik=c(4,2),pch=19) first.glm<-(Res Gov+log(years),poisson) summary(first.glm) next.glm< −glm(Res Gov+offset(log(years)),poisson) summary(next.glm) last.glm< −glm(Res log(years),poisson) summary(last.glm) l<-(0:25)/10 fv<-exp(0.3168+0.9654*l) lines(l,fv) 4 Hacer la regresión de Poisson para los datos del fichero ”autismo.txt”. La definición de las variables es: 1. Diag: año de diagnostico 2. Cases: casos detectados en ese año 3. Pyears: Numero de personas en situación de riesgo 4. Inc: Incidencia media para cada 10000 personas 5. Age: Mediana de edad de detección de la enfermedad Estimación bayesiana En la primera parte de la práctica hemos visto como se estiman los modelos lineales generalizados desde el punto de vista clásico. Ahora vamos a ver varios comandos de R para la estimación desde el punto de vista bayesiano a través de los ejemplos dentro de la librerı́a arm, que hay que cargar previamente. También necesitamos abrir el documento de ayuda del paquete que esta disponible en http://cran.r-project.org/ Pinchamos en Packages y posteriormente en arm (que estará en la parte derecha de la pantalla). En la nueva pantalla abrimos el fichero pdf que contiene la descripción del paquete. En la página 4, esta el comando ”bayesglm” el cual calcula un modelo lineal generalizado para distintas distribuciones a priori (normal, t, Cauchy). En la página 7 del documento tenemos varios ejemplos, el primero corresponde al modelo que hemos visto en la primera parte de la clase, y el resto son modelos con distintas distribuciones a priori. Describir brevemente la influencia de las distintas distribuciones a priori. Observar que son datos simulados y que si se repite el procedimiento dos veces los resultados pueden variar. En el caso de que tengamos variables categóricas en vez de continuas tenemos que usar el comando ”bayespolr”. Para ver el funcionamiento de este comando analizamos los diferentes ejemplos de la página 11 del documento. Al igual que en el caso anterior comentar brevemente los resultados obtenidos para los diferentes ejemplos usados para comentar este comando. Observar que en todos los ejemplos se usa el comando ”display(objeto)” para una mejor visualización de los resultados. 5