Introducción a modelos lineales generalizados (GLM) en R

Anuncio
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
Descargar