Curso R Biociencias: Sesión 4 — Relaciones, modelos lineales y ANOVAs
En la clase de hoy daremos un breve repaso a conceptos básicos de R que pudieran aun no estar del todo claros y posteriormente pasaremos veremos algunas maneras de explorar los datos en busca de posibles relaciones entre variables, evaluar esas relaciones, y aplicar modelos de regresiones lineales y de análisis de varianza.
Recordando
- R permite hacer análisis de datos de manera muy flexible por medio del uso de lenguaje de programación, objetos con información y datos guardados en la memoria, información y datos no guardados en la memoria, operaciones, funciones y sus argumentos, paquetes (grupos de funciones).
- Podemos seleccionar partes específicas que nos interesen de los objetos y usarlas en nuestros análisis de datos. Esto puede hacerse usando el símbolo $ para nombrar la parte que nos interesa (p ej. una columna de un data frame) o usando corchetes [] en los cuales se indicara la posición de los elementos de interés o proveer ahí criterios de selección de datos usando condicionantes.
- Los paquetes base de R (los que vienen incluidos con la instalación original) nos proveen una manera de traficar datos de manera muy flexible, usando funciones para crear gráficos (p ej. plot(), hist(), boxplot()), funciones para agregar elementos a gráficas ya hechas (p ej. points(), abline(), text()), y parámetros para modificar una amplia gama de aspectos de las gráficas.
Repaso de conceptos basicos
Pudieramos definir con palabras sencillas los siguientes conceptos:
- Objeto: Elemento de R almacenado en la memoria de la computadora, que tienen un nombre por el cual nos podemos referir a este, y puede contener datos en sus diversas estructuras (escalar, vector, data frame, etc.), resultados de modelos, formulas, gráficos, etc.
- Función: Una rutina informática, comando, que tiene nombre y hace algo. Ese algo pudiera ser cualquier cosa, desde definir estructuras de la información (vectores, data frames), algún proceso con la información, graficar, algún análisis estadístico, etc.
- Argumento: Dan las especificaciones de la función, es decir, detalles sobre cómo la función va hacer eso que hace. Los argumentos también tienen nombre y requieren forzosamente una respuesta. Toda función tiene argumentos. Hay argumentos que ya tienen una respuesta por default. En la sección Usage de la ayuda de las funciones, aparecen con una respuesta ya indicada (p ej. en función mean(), la respuesta default para el argumento na.rm es TRUE y aparece como na.rm = TRUE). Los argumentos mínimos que hay que introducir son los que no aparecen con una respuesta por default en la sección Usage de la ayuda y que no son opcionales (según lo mencione en su descripción).
Explorando posibles relaciones entre variables
Una manera de explorar los datos cuando tenemos varias variables es hacer una matriz de gráficos de dispersión, en donde se graficarán todas las posibles combinaciones de pares de variables. La función pairs() sirve para hacer eso. Tomate un momento pare leer la ayuda. Esta función es bastante flexible y tiene bastantes argumentos para personalizar las gráficas. Es de resaltar que la mayoría de sus argumentos tienen también valores por default. Te habrás dado cuenta que al menos necesitamos una matriz o un data frame con varias columnas (variables) para que la función funcione. Vamos a probarla con el set de datos de iris que tambien usamos en la sesión pasada. Si no viste la sesión anterior, puedes obtener mas información de este set de datos pidiéndola en la ayuda (p ej. ?iris o help(iris)).
# Vamos a usar solo las columnas con variables numericas de iris
pairs(x = iris[, 1:4])
# Podemos personalizar el nombre de las etiquetas con el argumento labels
pairs(x = iris[, 1:4], labels = c(“Longitud de sepalo”, “Ancho de sepalo”, “Longitud de petalo”, “Ancho de petalo”))Como vez, con este tipo de gráficos nos podemos dar un rápido panorama para indagar donde hay posibles relaciones.
Evaluando las relaciones
Pudiéramos evaluar las relaciones existentes entre las variables analizando su correlación. En R pudiera haber varias maneras de hacer esto.
La función cor() analiza la correlación entre variables, y da como resultado una matriz de correlaciones. Ademas permite seleccionar el método para estimar esta correlación. Checa la ayuda y vamos a probarla. La función requiere al menos el argumento x, que puede ser varios vectores, o un data frame o una matriz. Probémosla con iris.
cor(x = iris[, 1:4])¿Que tipo de correlación uso esta función (p ej. Pearson, Spearman o Kendall)? ¿cómo podemos saberlo?
Aunque con eso sabemos la correlación entre las variables, no tenemos aún manera de saber si estas correlaciones son estadísticamente significativas. El paquete Hmisc tiene la función rcorr() que puede ayudarnos con eso. Para instalar un paquete solo basta con usar la función install.packages(), y solo con el nombre del paquete entre comillas dentro del paréntesis. Es probable que te pida escoger un país de donde descargar el paquete, yo te sugiero escoger México. Cargaremos el paquete usando library(nombreDelPaquete), es decir, library(Hmisc) … sin comillas esta vez. Si ves la ayuda de la función rcorr(), te darás cuenta que solo acepta matrices como respuesta del argumento x. Vamos a usarlo.
# Hay que convertir el data frame a matriz usando as.matrix() y guardémoslo en un objeto
matrizDisp <- rcorr(x = as.matrix(iris[, 1:4]))La función str() nos permite visualizar qué contienen los objetos. Nos damos cuenta al aplicarla en iris que hay una matriz con los datos de R, con n y con el P valor, de las cuales podemos obtener la información que deseamos en este momento.
La función pairs.panels() del paquete psych nos da otra opción, agregar la significancia estadística en la matriz de gráficos (y otras coas). Instala el paquete y cárgalo (usa install.packages() y library()). Checa la ayuda de la función, es bastante parecida a la de pairs. Usémosla indicándole el argumento stars para especificar si queremos que nos señale las relaciones con relación significativa.
pairs.panels(x = iris[, 1:4], stars = TRUE)Con esta evidencia, ¿qué variables podemos decir que están relacionadas?
Formulas
Las formulas en R son muy usadas para describir el modelo de nuestros análisis estadísticos, e incluso como una manera diferente de seleccionar la manera en que se gráficas las variables en plot(), boxplot() y tal vez otras. Se indican de la siguiente forma:
variableDependiente ~ VarInd1 + Varind2 + Varind3 …El símbolo ese que parece la rayita de la ñ significa “depende de”, así la variable dependiente depende de varias variables independientes. Los principales símbolos usados en la parte de las variables independientes son (suponiendo que a y b son variables independientes):
- a + b que el factor/variable tiene un efecto aditivo
- a : b añadir la interacción de variables al modelo
- a * b añadir tanto efectos aditivos como las interacciones.
- b %in% a, indica que la variable en b esta anidada en a.
Modelos lineales
De manera similar a las funciones para gráficas en R, también hay funciones que ajustan modelos estadísticos a los datos y funciones que extraen información de dichos ajustes.
Funciones que ajustan modelos:
- lm(), ajusta modelos lineales
- aov(), similar a lm(), pero especializada para obtener los Análisis de Varianza.
Funciones que ayudan a obtener infor de los modelos ajustados.
- summary(), muestra un reporte detallado del modelo
- coef(), obtiene los coeficientes del modelo ajustado a los datos
- residuals(), obtiene los residuales del modelo con los datos
- fitted(), obtiene los valores predichos por el modelo
- anova(), devuelve una tabla de ANOVA para el modelo
- predict(), predice valores de la variable independiente para los valores particulares de las variables independientes.
- plot(), gráficos diagnósticos del modelo
- AIC(), calcula el Akaike Information Criterion para el modelo
- step(), aplica el ajuste del modelo paso a paso (stepwise)
Los modelos lineales, entre ellos la regresión linear simple, regresión múltiple, etc. se pueden ajustar con la función lm(), cuyo nombre son las siglas de linear models. El modelo estadístico se define con una formula, y se debe indicar de que objeto se tomaran los datos para esas variables. Por ejemplo, una regresión lineal simple solo tuviera una variable independiente y una regresión múltiple puede tener varias. El resultado se debe de guardar en un objeto para poder luego extraer mas información del análisis.
Ajustemos una regresión lineal simple a los datos de la variable dependiente Petal.Width y la independiente Sepal.Length de iris y guardemos los resultados en el objeto regPetSep.
regPetSep <- lm(formula = Petal.Width ~ Sepal.Length, data = iris)Si nombramos el objeto en la consola podemos tener información muy básica. Un reporte mas detallado nos lo da la función summary().
Prueba usando otra función sobre el objeto resultante de la regresión para obtener mas información. También como práctica, has una regresión múltiple para explicar la variable dependiente Petal.Width con las variables Sepal.Width y Sepal.Length. ¿Estas variables pueden predecir a Petal.Width?, ¿qué tan bien lo hacen? ¿Los dos factores fueron importantes en el modelo o solo uno o ninguno?. Ver respuesta al final del post.
ANOVAs
Los ANOVAs (análisis de varianza) son en general una extensión de la función lm(), y se usa la función aov() para realizarlos, también especificando un modelo estadístico mediante una formula y especificando el objeto de donde se tomaran los datos. Usando solo una variable independiente resultara en un ANOVA de una vía, y si añadimos mas variables independientes resultara en diferentes tipos de ANOVA y otros modelos estadísticos (p ej. ANCOVA). Vamos a probar haciendo un ANOVA de una vía para comparar la variable Petal.Length entre especies y guardaremos los resultados en un objeto llamado aovPLS.
aovPLS <- aov(formula = Petal.Length ~ Species, data = iris)
# Para ver un reporte usamos summary()
summary(aovPLS)¿Que significan los resultados? ¿Difiere la longitud del pétalo entre especies?. Ya podemos decir algo al respecto. Vamos a hacer ademas la prueba de posthoc de TukeyHSD.
TukeyHSD(aovPLS)Aparentemente todas las especies difieren entre si en la longitud del pétalo ¿verdad?.
Conclusiones
- R posee varias maneras de explorar y evaluar relaciones entre variables.
- Las funciones pairs() de los paquetes base de R, pairs.panels() del paquete psych, cor() de los paquetes base de R, y rcorr() del paquete Hmisc permiten explorar y evaluar la correlación entre variables.
- lm() y aov() son funciones similares que nos permiten ajustar un determinado modelo estadístico.
- El uso correcto de las formulas nos permiten hacer diferentes tipos de regresiones y análisis de varianza y otros modelos estadísticos relacionados.
Tarea
Hacer un ANOVA de dos vías con los datos que les mande al correo. Son datos de sodio en pacientes que infirieron dietas elaboradas por diferentes instructores y usando diferentes suplementos alimenticios.
Respuestas
# Regresión multiple
regPetWMult <- lm(formula = Petal.Width ~ Sepal.Width + Sepal.Length, data = iris)
# Podemos decir que las variables independientes si predicen a Petal.Width porque ambas tuvieron un efecto estadisticamente significativo. Ambas variables explican el 74% de la variabilidad de los datos (r2). Las dos variables fueron importantes en el modelo.