Curso Introducción R: Sesión 4 David V. Conesa Guillén Grup d’Estadística Espacial i Temporal en Epidemiologia i Medi Ambient Dept. d’Estadística i Investigació Operativa Universitat de València David Conesa, GEei t•E·ma (UV) Introducción a R: Sesión 4 1 / 38 Sesión 4: Análisis de datos con R En esta sesión: 1.- Introducción. 2.- Inferencia en problemas univariantes. 3.- Inferencia en problemas de dos muestras. 4.- Análisis de datos categóricos. 5.- Análisis de la Varianza. 6.- Regresión lineal simple. 7.- Análisis de supervivencia. David Conesa, GEei t•E·ma (UV) Introducción a R: Sesión 4 2 / 38 1.- Introducción. Aunque con R podemos realizar análisis estadísticos y numéricos de gran complicación, no tiene ningún sentido el llevar a cabo un análisis más complicado del estrictamente necesario. De acuerdo con el principio de la navaja de Occam, la elección un modelo estadístico debe ser siempre lo más simple posible. En esta sesión veremos los llamados test clásicos para algunos de los análisis de datos más habituales que involucran una y dos muestras. La primera parte del análisis de unos datos siempre involucra la descripción numérica y gráfica de los mismos. David Conesa, GEei t•E·ma (UV) Introducción a R: Sesión 4 3 / 38 Ejemplo library(foreign) ambiente<-read.spss(file="ambiente.sav", to.data.frame=TRUE) attach(ambiente) # Análisis descriptivo numérico summary(ambiente) by(OZONO,OZONO,length) # No de lugares clasf. por ozono by(SULFATO, OZONO, mean) # Media de sulfato por grupo de ozono by(PH, PROVIN, summary) # Est. resumen de PH por provincia # Diagrama de cajas por factores boxplot(SULFATO˜PROVIN) boxplot(PH˜OZONO) # Gráficos hist(SULFATO, main="Histograma del SULFATO") boxplot(PH, main="Diagrama de cajas del PH") #Gráficos por grupos par(mfrow=c(2,2)) hist(PH, main="Histograma del PH") by(PH, PROVIN, function(X, xlim){hist(X, xlim=xlim)},xlim=range(PH)) David Conesa, GEei t•E·ma (UV) Introducción a R: Sesión 4 4 / 38 Contrastes estadísticos ¿Cuando utilizamos los contrastes? Utilizamos un contraste estadístico para verificar si se cumple una hipótesis de trabajo a partir de unos datos o hay evidencias estadísticas de lo contrario. Elementos de un contraste Datos (obtenidos de forma muy diversa) Hipótesis nula (H0 ) Hipótesis alternativa (HA ) Estadístico de contraste T (y su distribución bajo H0 ) Valor observado del est. de contraste: t P-valor: Prob. si H0 es cierta de que el valor de T sea más extremo que t en la dirección de la hip. alternativa David Conesa, GEei t•E·ma (UV) Introducción a R: Sesión 4 5 / 38 Tipos de contrastes Contrastes Paramétricos Asumen que los datos tienen una determinada distribución El contraste es sobre alguno de los parámetros de una distribución Ejemplo: Test de la t de Student para una muestra Contrastes No Paramétricos No asumen ninguna distribución para los datos En principio, son más flexibles Entonces, ¿cuál usamos? Paramétricos, si se cumplen las hipótesis sobre los datos No paramétricos, en otro caso OJO: ¡¡Param./No param. no contrastan exactamente lo mismo!! David Conesa, GEei t•E·ma (UV) Introducción a R: Sesión 4 6 / 38 2.- Inferencia en problemas univariantes. Análisis de una muestra: Test de la t Contrastar la media de una población: obtenemos una muestra La distribución de los elementos de la pob. es X ∼ N(µ, σ 2 ) x = (x1 , . . . , xn ) es nuestra muestra (obs. independientes) σ 2 es desconocida Test ( H0 : µ = µ 0 HA : µ = 6 µ0 Estad. contraste: T = √ x −µ0 var (x)/n ∼ t(n − 1) Ejemplo t.test(PH, mu=4) t.test(SULFATO, mu=4) David Conesa, GEei t•E·ma (UV) Introducción a R: Sesión 4 7 / 38 Análisis no param. de una muestra: Test de Wilcoxon Descripción Contraste sobre la centralidad de una población (mediana) Observaciones independientes: x1 , . . . , xn Distribución simétrica de la población Contraste H0 : Mediana = µ0 HA : Mediana 6= µ0 Ejemplo x<-c(9,10,8,4,8,3,0,10,15,9) wilcox.test(x, mu=5) #¿Es la mediana 5? David Conesa, GEei t•E·ma (UV) Introducción a R: Sesión 4 8 / 38 3.- Inferencia en problemas de dos muestras. Test de correlación Contraste sobre la independencia (correlación cero) de dos variables Datos normales Si no lo son, utilizamos la opción method="kendall" Contraste H0 : ρ = 0 HA : ρ 6= 0 Ejemplo library(foreign) glucosa<-read.spss(file="glucosa.sav", to.data.frame=TRUE) attach(glucosa) cor(G1ANTES, G1DES) cor.test(G1ANTES, G1DES) David Conesa, GEei t•E·ma (UV) Introducción a R: Sesión 4 9 / 38 Test de igualdad de varianzas Descripción Contraste sobre el ratio de varianzas Poblaciones normales Contraste H0 : σ12 /σ22 = 1 HA : σ12 /σ22 6= 1 T = var (x1 ) var (x2 ) ∼ F (n1 − 1, n2 − 1) Ejemplo glucosa$DIF2<-G2DES-G2ANTES var.test(glucosa$DIF2 ˜ EMBARAZO) # test de Fisher David Conesa, GEei t•E·ma (UV) Introducción a R: Sesión 4 10 / 38 Análisis de 2 muestras: Test t Descripción Comparar la media de dos poblaciones cualesquiera La distribución de los elementos de la pob. es X ∼ N(µi , σ 2 ), i = 1, 2 x1 = (x11 , . . . , xn11 ) y x2 = (x12 , . . . , xn22 ), son nuestras muestras Se puede usar con datos no normales si la muestra es grande (n > 30) Test ( T = H0 : µ 1 = µ 2 HA : µ 1 = 6 µ2 x1 − x2 q var (x1 , x2 )( n1 1 var (x1 , x2 ) = + ∼ t(n1 + n2 − 2) + n2 − 1 var (x2 ) n1 + n2 − 2 1 ) n2 n1 − 1 var (x1 ) n1 + n2 − 2 Ejemplo x <- c(0.80,0.83,1.89,1.04,1.45,1.38,1.91,1.64,0.73,1.46) y <- c(1.15,0.88,0.90,0.74,1.21) var.test(x,y); t.test(x, y, alternative="greater") David Conesa, GEei t•E·ma (UV) Introducción a R: Sesión 4 11 / 38 Análisis de 2 muestras: Test Mann-Whitney Descripción Comparamos si dos poblaciones tienen la misma mediana Muestras: x1 = (x11 , . . . , xn11 ) y x2 = (x12 , . . . , xn22 ) Contraste H0 : Mediana1 = Mediana2 HA : Mediana1 6= Mediana2 Ejemplo x <- c(0.80,0.83,1.89,1.04,1.45,1.38,1.91,1.64,0.73,1.46) y <- c(1.15,0.88,0.90,0.74,1.21) wilcox.test(x, y) # opcional, alternative = "greater" David Conesa, GEei t•E·ma (UV) Introducción a R: Sesión 4 12 / 38 Análisis de 2 muestras emparejadas: Test t Descripción Comparar la media de dos poblaciones (p.ej., medidas al mismo individuo en dos tiempos distintos) La distribución de los elementos de la población es normal x1 = (x11 , . . . , xn1 ) y x2 = (x12 , . . . , xn2 ), son nuestras muestras Trabajamos con y = x1 − x2 y aplicamos Test t para una muestra Test ( H0 : µ 1 − µ 2 = 0 H1 : µ1 − µ2 6= 0 Estad. contraste: T = √ y −0 var (y)/n ∼ t(n − 1) Ejemplo x <- c(1.83, 0.50,1.62,2.48,1.68,1.88,1.55,3.06,1.30) y <- c(0.878,0.647,0.598,2.05,1.06,1.29,1.06,3.14,1.29) t.test(x, y, paired=TRUE, alternative="greater") David Conesa, GEei t•E·ma (UV) Introducción a R: Sesión 4 13 / 38 Análisis de 2 muestras emparejadas: Test Wilcoxon Descripción Comparamos si dos poblaciones tienen la misma distribución Muestras: x2 = (x11 , . . . , xn1 ) y x2 = (x12 , . . . , xn2 ) Trabajamos con y = x1 − x2 Utilizamos el Test de Wilcoxon para una muestra con y y µ0 = 0 Contraste H0 : Medianay = 0 HA : Medianay 6= 0 Ejemplo wilcox.test(x, y, paired = TRUE, alternative = "greater") David Conesa, GEei t•E·ma (UV) Introducción a R: Sesión 4 14 / 38 4.- Análisis de datos categóricos Contraste de independencia de dos variables Se utiliza para contrastar la independencia de variables categóricas Contamos el número de sucesos en cada categoría (o combinación) Comparamos el número de casos observados en cada grupo con el número de esperados Contraste H0 : Var. ind. HA : No H0 T = (Oij −Eij )2 Ei i,j P ∼ χ2 ((n1 − 1)(n2 − 1)) Ejemplo t<-table(ambiente[, c("OZONO", "PROVIN")]) # ¿Homogeneidad? chisq.test(t) David Conesa, GEei t•E·ma (UV) Introducción a R: Sesión 4 15 / 38 Otros análisis de datos categóricos. El test anterior también se puede entender como un problema de homogeneidad. Útil para valorar si en varias poblaciones se cumplen las mismas proporciones de una determinada característica. Si únicamente queremos comparar dos proporciones, podemos utilizar la función prop.test en el que especificamos dos vectores que contienen el número de éxitos sobre el total de pruebas. Ejemplo prop.test(c(4,196),c(40,3160)) Si en chisq.test(t) utilizamos la opción correct=F, no realiza la corrección de Yates (que es lo que hace por defecto). David Conesa, GEei t•E·ma (UV) Introducción a R: Sesión 4 16 / 38 Otros análisis de datos categóricos. Para realizar un test de Bondad de ajuste en el que contrastar si unas cantidades están de acuerdo con unas determinadas probabilidades: Ejemplo chisq.test(c(10,3,2,6), p=c(0.2,0.2,0.3,0.3)) Para tablas 2x2 es posible utilizar el test exacto de Fisher: Ejemplo x<-as.matrix(c(6,4,2,8)); dim(x)<-c(2,2); fisher.test(x) David Conesa, GEei t•E·ma (UV) Introducción a R: Sesión 4 17 / 38 5.- Análisis de la Varianza. Antes de comenzar un ANOVA es importante comprobar las condiciones de aplicabilidad. Homocesdasticidad: para comprobar si las varianzas de los grupos son homogéneas podemos utilizar el test de Bartlett (bartlett.test()) o el de Fligner-Killeen (fligner.test()). Normalidad: para comprobarla podemos utilizar el test de Kolmogorov Smirnov (ks.test()) o el de Shapiro Wilk (shapiro.test()). Ejemplo bartlett.test(PH˜PROVIN) fligner.test(PH˜PROVIN) by(PH,PROVIN,shapiro.test) David Conesa, GEei t•E·ma (UV) Introducción a R: Sesión 4 18 / 38 Análisis de varias muestras: ANOVA Descripción Comparamos la media de p grupos Asumimos distribución Normal con varianzas iguales: yij ∼ N(µi , σ 2 ) Equivale al Test t para dos muestras independientes cuando p = 2 Contraste H0 : µ 1 = µ 2 = . . . = µ p HA : No H0 ¿Cómo trabaja R? Toma como referencia un nivel del factor Utiliza variables dummy para el resto de niveles del factor Permite cambiar el nivel de referencia: relevel() David Conesa, GEei t•E·ma (UV) Introducción a R: Sesión 4 19 / 38 Análisis de varias muestras: ANOVA Tabla ANOVA de 1 via Variación Entre grupos Residual Total Suma P Cuadrados 2 SE = P i P ni (y i· − y ·· ) SR = i j (yij − y i· )2 P P (y − y ·· )2 i j ij g.l. p−1 n−p n−1 Varianza VE=SE/(p-1) VR=SR/(n-p) F VE/VR Ejemplo boxplot(PH ˜ PROVIN) anovaph<-lm(PH ˜ PROVIN) anova(anovaph); summary(anovaph) # también anovaph2 <- aov(PH ˜ PROVIN) summary(anovaph2) David Conesa, GEei t•E·ma (UV) Introducción a R: Sesión 4 20 / 38 Análisis de varias muestras: Test Kruskal-Wallis Descripción Extensión del Test de Mann-Whitney para 3 ó más grupos Comparamos las medianas de p grupos Contraste H0 : Mediana1 = . . . = Medianap HA : No H0 Ejemplo boxplot(SULFATO ˜ PROVIN) kruskal.test(SULFATO ˜ PROVIN) David Conesa, GEei t•E·ma (UV) Introducción a R: Sesión 4 21 / 38 6.- Regresión Lineal Simple Introducción Permite modelizar (y predecir) los valores de una variable respuesta en función de una serie de covariables Las covariables pueden ser de muy diverso tipo: continuas, categóricas, binarias, etc. Existen diversos procedimientos para la selección de las covariables más adecuadas: correlación, AIC, ... ¿Cuándo es adecuado este modelo? Las observaciones son independientes La relación entre la variable respuesta y las covariables es lineal A veces es posible transformar los datos para obtener una relación lineal David Conesa, GEei t•E·ma (UV) Introducción a R: Sesión 4 22 / 38 El modelo de regresión lineal simple Características yi , i = 1, . . . , n: variable respuesta xi , i = 1, . . . , n: covariable, variable explicativa εi ∼ N(0, σ 2 ), i = 1, . . . , n: error, variación aleatoria yi = α + βxi + εi , i = 1, . . . , n Entonces... yi y yj son independientes yi y xi tienen una relación lineal Los errores εi son independientes David Conesa, GEei t•E·ma (UV) Introducción a R: Sesión 4 23 / 38 Estimación en la regresión lineal simple Valores estimados P α̂ = y − β̂x 2 σ̂ = β̂ = X (yi − α̂ − β̂xi )2 i David Conesa, GEei t•E·ma (UV) n−2 i (xi − x )(yi − y ) cov (x , y ) = 2 var (x ) i (xi − x ) P = Suma Cuadrados Residual n−2 Introducción a R: Sesión 4 24 / 38 Modelo Lineal Simple: Ejemplo Relación entre el peso corporal y cerebral El fichero cerebros.sav contiene los sobre mediciones del peso del cuerpo y el cerebro de diversos animales. Ejemplo cerebros<-read.spss(file="cerebros.sav", to.data.frame=TRUE) attach(cerebros) # Análisis descriptivo numérico summary(cerebros) plot(CUERPO, CEREBRO) # regresión reglin<-lm(CEREBRO ˜ CUERPO) abline(reglin, col="red") summary(reglin) David Conesa, GEei t•E·ma (UV) Introducción a R: Sesión 4 25 / 38 El objecto lm El comando lm devuelve un objeto de tipo lm, que es una lista con diversos elementos Algunos elementos importantes coefficients: Valores de α̂ y β̂ fitted.values: Valores de ŷi residuals: Valores de los residuos (no tipificados) call: Llamada a la función lm que generó el objeto model: Información sobre el modelo (datos, etc.) Funciones para acceder a estos elementos R tiene una serie de funciones que permiten acceder a estos elementos individualmente: coef(lm, ...), fitted(lm, ...), residuals(lm, ...), vcov(lm, ...). David Conesa, GEei t•E·ma (UV) Introducción a R: Sesión 4 26 / 38 Validación del modelo Análisis de residuos El modelo asume que el error es Normal Residuos: ri = yi − α̂ − β̂xi La distribución ha de ser aproximadamente Normal Conviene tener en cuenta que P i ri =0 Residuos tipificados: ri0 = ri /sd(r ) Valores atípicos (outliers) A veces hay observaciones con residuos muy grandes Esto puede deberse a que el modelo no ajusta bien para algunos datos Otras veces hay errores en los datos Valores extremos alteran la estimación del modelo David Conesa, GEei t•E·ma (UV) Introducción a R: Sesión 4 27 / 38 Validación gráfica del Modelo R incluye una serie de gráficos que permiten hacer un diagnóstico del modelo ajustado Gráficas Valores ajustados vs Residuos Deberían ser independientes QQ-Plot de los Residuos tipificados Deberían ajustar a una línea recta Valores ajustados vs Raíz cuadrada residuos Permite localizar valores atípicos y ver si para valores ajustados grandes hay desviaciones grandes (p. ej.) Leverage vs Residuos tipificados Ejemplo plot(reglin) David Conesa, GEei t•E·ma (UV) Introducción a R: Sesión 4 28 / 38 Calidad del modelo: R cuadrado Definición El Coeficiente de determinación R 2 mide la proporción de variabilidad en los datos explicada por el modelo: R2 = 1 − 2 2 i (yi − α̂ − β̂xi ) i (ŷi − y ) P =P 2 2 i (yi − y ) i (yi − y ) P P Los valores de R 2 están entre 0 y 1 Valores cercanos a 1 indican buen ajuste a los datos David Conesa, GEei t•E·ma (UV) Introducción a R: Sesión 4 29 / 38 Predicción A veces interesa predecir la respuesta para cierto valor de una covariable La predicción es ypred ˆ = α̂ + β̂xpred ¡Ojo con la extrapolación! ¿Cuál es la incertidumbre acerca de la predicción? En general, mayor que la incertidumbre de los datos: s 1 ŷpred ± tn−2 σ̂ 2 1 + n Ejemplo ndatos<-data.frame(CUERPO=c(2, 25, 75, 1000)) #Nuevos datos ndatos$CEREBROpred<-predict(reglin, ndatos) David Conesa, GEei t•E·ma (UV) Introducción a R: Sesión 4 30 / 38 Transformaciones de datos Problemática A veces la relación entre las variables no es lineal O las varianzas no son iguales Por medio de una transformación podemos mejor la linealidad de los datos Hay que tener en cuenta que... La transformación ha de ser 1 a 1 Los resultados hay que interpretarlos en términos de las variables transformadas Ejemplo Transformar (log) los datos del banco de datos cerebros.sav y eliminar los datos aberrantes (identify(log(CUERPO), log(CEREBRO), labels=ANIMAL)) necesarios hasta conseguir un buen ajuste. David Conesa, GEei t•E·ma (UV) Introducción a R: Sesión 4 31 / 38 7.- Análisis de supervivencia Introducción Funciones para el análisis de supervivencia: paquete survival Cargarlo previamente: library{survival} Funciones Surv(time, event, ...): Genera un objeto supervivencia que recoge los tiempos observados y el indicador de estado (0=vivo, 1=muerto). survfit(formula, ...): Genera las curvas de supervivencia. El objeto resultante se puede pintar con plot. survdiff(formula, ...): Test de diferencias en las curvas de supervivencia. David Conesa, GEei t•E·ma (UV) Introducción a R: Sesión 4 32 / 38 Curvas de Kaplan-Meier Ejemplo # cargo paquete y datos library{survival} data(lung) attach(lung) # defino objeto de supervivencia lung.surv <- Surv(time, status) # calculo curvas KM lung.KM <- survfit(lung.surv ∼ 1) lung_sex.KM <- survfit(lung.surv ∼ sex) # pinto resultados plot(lung.KM) plot(lung_sex.KM, lty=2:3, , xlab="Tiempo (días)") title("Supervivencia por sexo") legend("topright", c("Hombres", "Mujeres"), lty=2:3) Para más control sobre la representación gráfica de las curvas, ver help("plot.survival") David Conesa, GEei t•E·ma (UV) Introducción a R: Sesión 4 33 / 38 Contrastes de supervivencia Función survdiff survdiff(formula, subset, rho, . . . ) Contrasta si hay diferencia entre dos o más curvas de supervivencia, determinadas por la formula Se puede restringir el conjunto de casos con subset El parámetro rho controla el tipo de test (def: 0 = log-rank test) Más ayuda: ?survdiff Ejemplo survdiff(lung.surv ∼ sex) survdiff(lung.surv ∼ sex, subset = meal.cal > 1000) David Conesa, GEei t•E·ma (UV) Introducción a R: Sesión 4 34 / 38 Trabajando con fechas En supervivencia es frecuente necesitar hacer operaciones con fechas. Típicamente, contar el número de días/semanas/meses entre dos fechas. R tiene un objeto de tipo date que facilita estas operaciones. Leyendo fechas Cuando importamos unos datos, las fechas suelen ser una cadena de caracteres con cierto formato. La función as.Date permite convertirlas, especificando el formato. Con la función difftime se pueden calcular intervalos de tiempo. Ejemplo dates.char <- c("1/3/2000", "1/3/2001") dates <- as.Date(dates.char, format=" %d/ %m/ %Y") difftime(dates, as.Date(c("1/1/00", "1/1/01"), format=" %d/ %m/ %y")) David Conesa, GEei t•E·ma (UV) Introducción a R: Sesión 4 35 / 38 Modelo de Cox Función coxph Ajusta un modelo de Cox de riesgos proporcionales. La función cox.zph contrasta la hipótesis de riesgos proporcionales. Se puede estratificar utilizando la función strata sobre la variable categórica correspondiente. Ejemplo # ajusto modelo de Cox lung.cox <- coxph(lung.surv ∼ age) summary(lung.cox) cox.zph(lung.cox) # Modelo de Cox estratificado lung.stcox <- coxph(lung.surv ∼ age + strata(sex)) summary(lung.stcox) cox.zph(lung.cox) David Conesa, GEei t•E·ma (UV) Introducción a R: Sesión 4 36 / 38 Modelo de Cox Curvas de supervivencia Al modelo ajustado se le puede aplicar directamente la función survfit, para calcular las curvas de supervivencia, para un “individuo medio” en las covariables. Para calcular las curvas en unos valores específicos, utilizar el parámetro newdata. Ejemplo plot(survfit(lung.cox)) # individuo medio plot(survfit(lung.cox, newdata = 60)) # individuo de 60 años plot(survfit(lung.cox, newdata = data.frame(age=c(35, 55))), lty=2:3) # individuos de 35 y 55 años legend("topright", c("35 años", "55 años"), lty=2:3) plot(survfit(lung.stcox, newdata = 40), lty=2:3) legend("topright", c("Hombres", "Mujeres"), lty=2:3) David Conesa, GEei t•E·ma (UV) Introducción a R: Sesión 4 37 / 38 Licencia de este material Más info: http://creativecommons.org/licenses/by-sa/3.0/es/ Usted es libre de: copiar, distribuir y comunicar públicamente la obra hacer obras derivadas Bajo las condiciones siguientes: Reconocimiento. Debe reconocer los créditos de la obra de la manera especificada por el autor o el licenciador (pero no de una manera que sugiera que tiene su apoyo o apoyan el uso que hace de su obra). Compartir bajo la misma licencia. Si transforma o modifica esta obra para crear una obra derivada, sólo puede distribuir la obra resultante bajo la misma licencia, una similar o una compatible. David Conesa, GEei t•E·ma (UV) Introducción a R: Sesión 4 38 / 38