Realizar una Prueba de Normalidad Shapiro-Wilk


Quiero realizar una prueba de Normalidad de Shapiro-Wilk. Mis datos tienen el formato csv. Se ve así:

> heisenberg
    HWWIchg
1    -15.60
2    -21.60
3    -19.50
4    -19.10
5    -20.90
6    -20.70
7    -19.30
8    -18.30
9    -15.10

Sin embargo, cuando realizo la prueba, obtengo:

> shapiro.test(heisenberg)
Error in `[.data.frame`(x, complete.cases(x)) : 
  undefined columns selected

¿Por qué no está R seleccionando la columna correcta y cómo hacerlo? Thx para su respuesta!!!

Author: Arun, 2013-03-15

3 answers

¿Qué hace Shapiro?¿prueba?

shapiro.test prueba la Hipótesis nula de que "las muestras provienen de una distribución normal" contra la hipótesis alternativa "las muestras no provienen de una distribución Normal".

Cómo realizar shapiro.prueba en R?

La página de ayuda de R para ?shapiro.test da,

x - a numeric vector of data values. Missing values are allowed, 
    but the number of non-missing values must be between 3 and 5000.

Es decir, shapiro.test espera un vector numérico como entrada, que corresponde a la muestra que como para probar y es la única entrada requerida. Ya que tienes un datos.frame , tendrá que pasar la columna deseada como entrada a la función de la siguiente manera:

> shapiro.test(heisenberg$HWWIchg)
#   Shapiro-Wilk normality test

# data:  heisenberg$HWWIchg 
# W = 0.9001, p-value = 0.2528

Interpretación de los resultados de shapiro.prueba:

Primero, yo fuertemente te sugiero lea esta excelente respuesta de Ian Fellows en testing for normality.

Como se muestra arriba, el shapiro.test prueba la hipótesis NULA de que las muestras provenían de una distribución Normal. Esto significa que si su valor de p , entonces rechazaría la hipótesis NULA de que las muestras provenían de una distribución Normal. Como bien dijo Ian Fellows, estás probando contra la suposición de Normalidad ". En otras palabras (corrígeme si me equivoco), sería mucho mejor si se prueba la hipótesis NULA de que las muestras no provienen de una distribución Normal. ¿Por qué? Porque, rechazar una hipótesis NULA no es el lo mismo que aceptar la hipótesis alternativa.

En el caso de la hipótesis nula de shapiro.test, un valor de p una rara posibilidad de que las muestras provengan de una distribución normal. El efecto secundario de esta prueba de hipótesis es que esta rara oportunidad sucede muy raramente. Para ilustrar, tome por ejemplo:

set.seed(450)
x <- runif(50, min=2, max=4)
shapiro.test(x)
#   Shapiro-Wilk normality test
# data:  runif(50, min = 2, max = 4) 
# W = 0.9601, p-value = 0.08995

Entonces, esto (particular) la muestra runif(50, min=2, max=4) proviene de una distribución normal según esta prueba. Lo que estoy tratando de decir es que, hay muchos muchos casos en los que los requisitos "extremos" (p

Otro tema que me gustaría citar aquí de @PaulHiemstra de debajo de comentarios sobre los efectos en el tamaño de muestra grande:

Un problema adicional con la prueba de Shapiro-Wilk es que cuando usted alimenta más datos, las posibilidades de que la hipótesis nula sea rechazada se hace más grande. Entonces, lo que sucede es que para grandes cantidades de datos, incluso se pueden detectar desviaciones muy pequeñas de la normalidad, lo que lleva al rechazo del evento de hipótesis nula, aunque para fines prácticos los datos son más de lo normal.

Aunque también señala que el límite de tamaño de datos de R protege esto un poco:

Afortunadamente shapiro.prueba protege al usuario de lo anterior efecto descrito limitando el tamaño de los datos a 5000.

Si la hipótesis NULA fuera lo contrario, es decir, las muestras no provienen de una distribución normal, y obtienes un valor de p , entonces concluyes que es muy raro que estas muestras no provienen de una distribución normal (rechaza la hipótesis NULA). Esto se traduce en: Es muy probable que las muestras se distribuyan normalmente (aunque algunos estadísticos puede que no le guste esta forma de interpretar). Creo que esto es lo que Ian Fellows también trató de explicar en su post. Por favor, corrígeme si he conseguido algo mal!

@PaulHiemstra también comenta sobre situaciones prácticas (ejemplo de regresión) cuando uno se encuentra con este problema de probar la normalidad:

En la práctica, si un análisis asume normalidad, por ejemplo, lm, no haría esta prueba de Shapiro-Wilk, sino que haría el análisis y miraría las gráficas diagnósticas del resultado de el análisis para juzgar si las suposiciones del análisis fueron violadas demasiado. Para la regresión lineal usando lm, esto se hace mirando algunas de las gráficas de diagnóstico que se obtienen usando plot(lm()). Estadísticas no es una serie de pasos que tos hasta unos pocos números (hey p

Aquí, encuentro la respuesta de Ian Fellows al comentario de Ben Bolker bajo la misma pregunta ya vinculada arriba igualmente (si no más) informativo:

Para la regresión lineal,

  1. No te preocupes mucho por la normalidad. El CLT se hace cargo rápidamente y si tiene todos los tamaños de muestra menos los más pequeños y un histograma de aspecto remotamente razonable, está bien.

  2. Preocúpate por las varianzas desiguales (heterocedasticidad). Me preocupa esto hasta el punto de (casi) usar pruebas de HCCM por defecto. Una parcela de ubicación a escala dará una idea de si esto está roto, pero no siempre. Además, no hay ninguna razón a priori para suponer diferencias iguales en la mayoría de los casos.

  3. Valores atípicos. Una distancia de cocineros de > 1 es motivo razonable de preocupación.

Esos son mis pensamientos (FWIW).

Espero que esto aclare un poco las cosas.

 114
Author: Arun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:47:14

Está aplicando shapiro.test() a un marco de datos en lugar de la columna. Prueba lo siguiente:

shapiro.test(heisenberg$HWWIchg)
 7
Author: stackoverflowuser2010,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-15 15:24:29

No pudo especificar las columnas exactas (datos) para probar la normalidad. Use esto en su lugar

shapiro.test(heisenberg$HWWIchg)
 1
Author: Samuel Terkper Ahuno,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-29 08:55:20