Ver si los datos se distribuyen normalmente en R


¿Puede alguien ayudarme a completar la siguiente función en R:

#data is a single vector of decimal values
normally.distributed <- function(data) {
if(data is normal)
return(TRUE)
else
return(NO)
}
Author: pnuts, 2011-10-16

8 answers

Las pruebas de normalidad no hacen lo que la mayoría piensa que hacen. La prueba de Shapiro, Anderson Darling, y otras son pruebas de hipótesis nula CONTRA la suposición de normalidad. Estos no deben usarse para determinar si se deben usar procedimientos estadísticos teóricos normales. De hecho, prácticamente no tienen ningún valor para el analista de datos. ¿En qué condiciones estamos interesados en rechazar la hipótesis nula de que los datos se distribuyen normalmente? Nunca me he encontrado con una situación en la que una prueba normal es la lo correcto. Cuando el tamaño de la muestra es pequeño, incluso grandes desviaciones de la normalidad no se detectan, y cuando el tamaño de la muestra es grande, incluso la desviación más pequeña de la normalidad dará lugar a un null rechazado.

Por ejemplo:

> set.seed(100)
> x <- rbinom(15,5,.6)
> shapiro.test(x)

    Shapiro-Wilk normality test

data:  x 
W = 0.8816, p-value = 0.0502

> x <- rlnorm(20,0,.4)
> shapiro.test(x)

    Shapiro-Wilk normality test

data:  x 
W = 0.9405, p-value = 0.2453

Por lo tanto, en ambos casos (variadas binomial y lognormal) el valor p es > 0.05 causando un error al rechazar el null (que los datos son normales). ¿Significa esto que debemos concluir que los datos son normales? (pista: la respuesta es no). Falta de rechazar no es lo mismo que aceptar. Esta es la prueba de hipótesis 101.

Pero, ¿qué pasa con los tamaños de muestra más grandes? Tomemos el caso donde la distribución es muy casi normal.

> library(nortest)
> x <- rt(500000,200)
> ad.test(x)

    Anderson-Darling normality test

data:  x 
A = 1.1003, p-value = 0.006975

> qqnorm(x)

introduzca la descripción de la imagen aquíintroduzca la descripción de la imagen aquí

Aquí estamos usando una distribución t con 200 grados de libertad. La gráfica qq muestra que la distribución está más cerca de lo normal que cualquier distribución que es probable que vea en el mundo real, pero la prueba rechaza la normalidad con un grado muy alto de confianza.

¿La prueba significativa contra la normalidad significa que no debemos usar estadísticas de teoría normal en este caso? (otra pista: la respuesta es no :) )

 168
Author: Ian Fellows,
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-11-07 22:07:57

También recomiendo encarecidamente el SnowsPenultimateNormalityTest en el paquete TeachingDemos. Sin embargo, la documentación de la función es mucho más útil para usted que la prueba en sí. Léalo detenidamente antes de usar la prueba.

 22
Author: Brian Diggs,
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
2018-01-26 22:44:32

SnowsPenultimateNormalityTest ciertamente tiene sus virtudes, pero es posible que también desee mirar qqnorm.

X <- rlnorm(100)
qqnorm(X)
qqnorm(rnorm(100))
 12
Author: 42-,
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
2011-10-16 03:49:09

Considere usar la función shapiro.test, que realiza la prueba de normalidad de Shapiro-Wilks. He sido feliz con él.

 4
Author: Karl,
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
2011-10-16 01:45:06

Biblioteca (DnE)

X

Es.norm (x,10,0.05)

 2
Author: yuki,
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
2014-11-16 03:23:34

La prueba Anderson-Darling también es útil.

library(nortest)
ad.test(data)
 1
Author: P Sellaz,
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
2011-10-16 19:07:58

Cuando se realiza una prueba, siempre se tiene la probabilidad de rechazar la hipótesis nula cuando es verdadera.

Véase el siguiente código R:

p=function(n){
  x=rnorm(n,0,1)
  s=shapiro.test(x)
  s$p.value
}

rep1=replicate(1000,p(5))
rep2=replicate(1000,p(100))
plot(density(rep1))
lines(density(rep2),col="blue")
abline(v=0.05,lty=3)

El gráfico muestra que si tiene un tamaño de muestra pequeño o grande, un 5% de las veces tiene la oportunidad de rechazar la hipótesis nula cuando es verdadera (un error de tipo I)

 0
Author: user5807327,
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-10-11 03:32:48

Además de qqplots y la prueba de Shapiro-Wilk, los siguientes métodos pueden ser útiles.

Cualitativo:

  • histograma comparado con el normal
  • cdf comparado con el normal
  • ggdensity plot
  • ggqqplot

Cuantitativo:

Los métodos qualitivos se pueden producir usando lo siguiente en R:

library("ggpubr")
library("car")

h <- hist(data, breaks = 10, density = 10, col = "darkgray") 
xfit <- seq(min(data), max(data), length = 40) 
yfit <- dnorm(xfit, mean = mean(data), sd = sd(data)) 
yfit <- yfit * diff(h$mids[1:2]) * length(data) 
lines(xfit, yfit, col = "black", lwd = 2)

plot(ecdf(data), main="CDF")
lines(ecdf(rnorm(10000)),col="red")

ggdensity(data)

ggqqplot(data)

A advertencia: no aplique pruebas a ciegas. Tener una sólida comprensión de las estadísticas le ayudará a entender cuándo usar qué pruebas y la importancia de las suposiciones en las pruebas de hipótesis.

 0
Author: Anna,
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
2018-03-13 23:13:18