viernes, 22 de abril de 2016

Probar la normalidad de una variable en R


Ya hemos aprendido algunos aspecto básicos de R como instalarlo y crear bases de datos. Así que ante de iniciar algunos análisis paramétricos y no paramétricos básico primero tendremos que intentar probar algunos supuestos que nos exigen las pruebas paramétricas, como el caso de la distribución normal.

Si bien pudiéramos intentar graficar un histograma para ver si nuestra variable parece distribuirse normal, ésta no es la opción más idónea. Para probar la normalidad idealmente utilizaremos algun método gráfico diseñado para probar distribuciones, o bien un método estadístico con prueba de hipótesis.

Método gráfico: Gráfico Q-Q


Si decidiéramos utilizar el primer caso, lo ideal sería utilizar un gráfico Q-Q, que permite contrastar la distribución empírica (la que en realidad tienen mis datos) con una distribución teórica (la normal, por ejemplo). En caso de que ambas distribuciones coincidan, la gráfica quedará igual a la línea diagonal. Evidentemente en datos reales no siempre se logra un ajuste perfecto, pero mientras más similar sea a la línea diagonal, más seguros podemos estar que mis datos se distribuyen normal.

Para crear un gráfico Q-Q debemos tener instalado el paquete llamado "ggplot2", que nos permite realizar gráficas de alto nivel, y mucho más versátiles en R (sino lo tienen instalado, aquí les dejo un enlace donde pueden ver como instalarlo "como instalar ggplot2"). Una vez instalado, cargamos el paquete con el comando:
library("ggplot2")
Éste comando me permite cargar cualquier paquete instalado que no venga por defecto en la instalación de R.

Posteriormente, debemos utilizar el comando qplot() para realizar el gráfico Q-Q. Una forma fácil de realizar el graficado es asignar el comando a un nuevo objeto. Para ello simplemente eljimos un nombre del objeto (por ejemplo, llamemoslo jocosamente pepe.el.graficoQQ) y la asignamos la función mediante el operador <- (es decir, como si escribiéramos una flechita). Posteriormente ingresamos la función que deseamos asignar, en este caso qplot(), y dentro de los paréntesis colocamos la variable que no interesa analizar. Por ejemplo, retomemos el ejemplo de la entrada anterior, y usemos la variable "Ansiedad" de la base de datos "Aracnofobia". De tal forma, que el comando queda de la siguiente forma:
pepe.el.graficoQQ <- qplot(sample=Aracnofobia$Ansiedad, stat="qq")
pepe.el.graficoQQ
En ésta función observarán que dentro del paréntesis esta el operador sample=Aracnofobia$Ansiedad. No se asusten, lo explicaré un poco, sample hace referencia a la muestra que utilizaran para el análisis, en nuestro caso, usaremos la variable Ansiedad de la muestra Aracnofobia. Es por ello que debo poner sample=Aracnofobia$Ansiedad, en el cual el símbolo de pesos $ le dice a R que la variable Ansiedad están dentro del dataframe Aracnofobia. Adicionalmente, le agregamos el operador stat="qq", en donde simplemente le decimos que realice un gráfico de tipo QQ. Si le damos correr al comando, obtendremos el siguiente resultado:



Y listo! podemos observar que nuestro gráfico parece ser similar a una línea diagonal, lo que sugiere que la variable ansiedad, se distribuye normal.

Método estadístico: la prueba de Shapiro-Wilk


Pero ¿Qué tal si no estoy conforme con realizar un simple gráfico?, ¿Que tal si lo que yo quiero es una estadístico que me diga, con cierto nivel de probabilidad, si es probable que mis datos se distribuyen normal o no?

Si lo que desean es ello, podrían utilizar algún estadístico para realizar éste análisis, como por ejemplo la prueba de Kolmogorov-Smirnov con corrección de Liliefors, o bien la prueba de Shapiro-Wilk. En mi caso, les enseñaré a utilizar la prueba de Shapiro-Wilk en R.

No me adentraré explicar el cálculo matemático a través del cual funciona la prueba, si desean saber como funciona les invito a leer algún artículo académico que lo explique más detalladamente de lo que yo podría hacer, como el de Royston (1982), y que sino me equivoco es en el que se basa la función que utilizaremos en R. Así que para propósitos prácticos, diremos que la prueba de Shapiro simplemente prueba la hipótesis nula de que los datos de distribuyen normal, versus la alternativa de que se distribuyen diferente a la normal. La función que usaremos en R simplemente es del tipo shapiro.test(variable), en donde shapiro.test() es la función, y en variable colocamos la variable que deseamos probar normalidad. En nuestro ejemplo, probaremos si la variable ansiedad se distirbuye normal, por lo que incluiremos el comando Aracnofobia$Ansiedad, que nuevamente, simplemente le estamos diciendo que use la variable Ansiedad del dataframe Aracnofobia.

De tal forma, simplemente tendremos el siguiente comando:
shapiro.test(Aracnofobia$Ansiedad)
Lo que nos dará el siguiente resultado:
> shapiro.test(Aracnofobia$Ansiedad)
Shapiro-Wilk normality test
data:  Aracnofobia$Ansiedad
W = 0.96282, p-value = 0.4977
Donde podemos ver que el estadístico es W=0.96282, con un valor-p de 0.49, es decir, no podemos rechazar la hipótesis nula de que nuestra variable se distribuye normal. ¡Hurra!

Seguramente en este punto algunos que quizás tengan un poco más de conocimiento estadístico se digan: "Pero Julio, en una prueba t para muestras independiente me interesa ver si mi variable se distribuye normal en ambas muestras, no en toda la muestra, ¿Cómo puedo lograr eso?"... La respuesta se sencilla, simplemente recurrimos a la función by(), en donde simplemente le digo a la función que me realice la operación por -o como diríamos en inglés by- cada muestra. En nuestro ejemplo, tendríamos un comando igual al siguiente:
by(Aracnofobia$Ansiedad, Aracnofobia$Araña, shapiro.test)
En donde simplemente ponemos de primero mi variable de interés (en este caso Ansiedad), posteriormente la variable por la que me dividirá el análisis (es este caso por Araña), y finalmente la función que quiero aplicar (shapiro.test). Al correr el análisis obtendremos un resultado similar a éste:
> by(Aracnofobia$Ansiedad, Aracnofobia$Araña, shapiro.test)
Aracnofobia$Araña: Foto
Shapiro-Wilk normality test
data:  dd[x, ]
W = 0.96502, p-value = 0.8523
---------------------------------------------------------------------
Aracnofobia$Araña: Real
Shapiro-Wilk normality test
data:  dd[x, ]
W = 0.94887, p-value = 0.6206
Y listo!, ya tenemos el prueba Shapiro-Wilk por cada muestra que me interesa, y donde podemos observar que la variable Ansiedad se distribuye normal en ambos grupos.

Sobre la función by()


Solo para aclarar, la función by() no simplemente es para shapiro-wilk, en realidad la puedo utilizar con cualquier otra función en la que desee dividir mis análisis por una variable en particular. Por ejemplo, si yo quisiera obtener media de la ansiedad por cada grupo, bien podría usar lo mismo solo sustituyendo la función shapiro.test por la de mean (que me brinda medias). De tal forma, usaría un comando de tipo:
by(Aracnofobia$Ansiedad, Aracnofobia$Araña, mean)
Y que me daría como resultado la media por cada grupo tal como se ve a continación.
> by(Aracnofobia$Ansiedad, Aracnofobia$Araña, mean)
Aracnofobia$Araña: Foto
[1] 40
---------------------------------------------------------------------
Aracnofobia$Araña: Real
[1] 47
Donde observamos que la media con una foto es de 40, mientras que con una araña real es de 47.

Por hoy es todo, espero que sea de utilidad este post, y cualquier pregunta o comentario que tengan, no duden publicarlo en los comentarios.




0 comentarios:

Publicar un comentario