Cómo realizar una prueba usando R para ver si los datos siguen una distribución normal


45

Tengo un conjunto de datos con la siguiente estructura:

a word | number of occurrence of a word in a document | a document id 

¿Cómo puedo realizar una prueba de distribución normal en R? Probablemente sea una pregunta fácil, pero soy un novato de R.


55
@Skarab Tal vez estoy totalmente equivocado, pero ¿no esperarías que la frecuencia de cualquier palabra sea inversamente proporcional a su rango en la tabla de frecuencia de palabras, de acuerdo con la ley de Zipf ( j.mp/9er2lv )? En este caso, consulte el zipfRpaquete.
chl

1
Estoy de acuerdo con @chl: sería un milagro menor si sus datos se distribuyeran normalmente. Quizás valga la pena otra pregunta sobre lo que desea hacer con los datos. ¡No reinventes la rueda!
csgillespie

3
¿Cómo se podrían distribuir sus datos de acuerdo con un modelo que da probabilidad no nula de ocurrencia negativa?
user603

1
¿Cuál es la razón para hacer esta prueba?
whuber

Quiero estimar si el gran resultado de la extracción de información es correcto. Quiero verificar si la distribución de las entidades encontradas en el texto sigue mis expectativas (conozco el dominio y el corpus de texto).
Skarab

Respuestas:


48

Si entiendo su pregunta correctamente, para probar si las apariciones de palabras en un conjunto de documentos siguen una distribución Normal, puede usar una prueba de shapiro-Wilk y algunos qqplots. Por ejemplo,

## Generate two data sets
## First Normal, second from a t-distribution
words1 = rnorm(100); words2 = rt(100, df=3)

## Have a look at the densities
plot(density(words1));plot(density(words2))

## Perform the test
shapiro.test(words1); shapiro.test(words2)

## Plot using a qqplot
qqnorm(words1);qqline(words1, col = 2)
qqnorm(words2);qqline(words2, col = 2)

Los comandos qqplot dan: texto alternativo

Puede ver que el segundo conjunto de datos claramente no es Normal por las colas pesadas ( Más información ).

En la prueba de normalidad Shapiro-Walk, el valor p es grande para el primer conjunto de datos (> .9) pero muy pequeño para el segundo conjunto de datos (<.01). Esto lo llevará a rechazar la hipótesis nula para el segundo.


77
¿Por qué claramente no es normal?
Herman Toothrot

Creo que los puntos trazados deberían estar en la bisectriz del cuadrante I-III tan cerca como dibujan una distribución normal.
Campa

Más generalmente (¡media! = 0), qqlinetendrá 1 pendiente y la intersección mu .
Campa

@HermanToothrot no es Normal cuando se mira la segunda gráfica, ya que existe una gran divergencia en los valores de la cola. El gráfico QQ es un gráfico del cuantil teórico (si era normal) frente a la cantidad de muestra (a partir de los datos). Si los datos de la muestra son normales, esperamos que las observaciones estén cerca de la línea, como lo son para la primera gráfica. También tenga en cuenta la escala de diferencia en el eje y para esas parcelas.
Sheldon

15

Suponiendo que su conjunto de datos se llama wordsy tiene una countscolumna, puede trazar el histograma para tener una visualización de la distribución:

hist(words$counts, 100, col="black")

donde 100 es el número de contenedores

También puede hacer un diagrama QQ normal usando

qqnorm(words$counts)

Finalmente, también puede usar la prueba de Shapiro-Wilk para la normalidad

shapiro.test(word$counts)

Sin embargo, mire esta discusión: Prueba de normalidad: '¿Es esencialmente inútil?'


14

Ninguna prueba le mostrará que sus datos tienen una distribución normal; solo podrá mostrarle cuando los datos sean lo suficientemente inconsistentes con una normal que rechazaría el valor nulo.

Pero los recuentos no son normales en cualquier caso, son enteros positivos: ¿cuál es la probabilidad de que una observación de una distribución normal tome un valor que no sea un entero? (... ese es un evento de probabilidad 1).

¿Por qué probarías la normalidad en este caso? Obviamente es falso.

[En algunos casos, no necesariamente importa que puedas decir que tus datos no son realmente normales. Los datos reales nunca (o casi nunca) se extraerán de una distribución normal.]

Si realmente necesita hacer una prueba, la prueba de Shapiro-Wilk ( ?shapiro.test) es una buena prueba general de normalidad, muy utilizada.


9

Una forma más formal de ver la normalidad es probando si la curtosis y la asimetría son significativamente diferentes de cero.

Para hacer esto, necesitamos obtener:

kurtosis.test <- function (x) {
m4 <- sum((x-mean(x))^4)/length(x)
s4 <- var(x)^2
kurt <- (m4/s4) - 3
sek <- sqrt(24/length(x))
totest <- kurt/sek
pvalue <- pt(totest,(length(x)-1))
pvalue 
}

para curtosis y:

skew.test <- function (x) {
m3 <- sum((x-mean(x))^3)/length(x)
s3 <- sqrt(var(x))^3
skew <- m3/s3
ses <- sqrt(6/length(x))
totest <- skew/ses
pt(totest,(length(x)-1))
pval <- pt(totest,(length(x)-1))
pval
}

por sesgo.

Ambas pruebas son de una cola, por lo que deberá multiplicar el valor p por 2 para convertirse en dos colas. Si su valor p se vuelve mayor que uno, deberá usar 1-kurtosis.test () en lugar de kurtosis.test.

Si tiene alguna otra pregunta, puede enviarme un correo electrónico a j.bredman@gmail.com


¿Cuáles son las diferencias, de las dos funciones anteriores, con respecto a las funciones kurtosis()y skewness()del paquete de momentos ? Los resultados usando rnorm()muestras son diferentes.
Nikos Alexandris

5

Además de la prueba Shapiro-Wilk del paquete de estadísticas, el paquete del norte (disponible en CRAN) proporciona otras pruebas de normalidad.


5

Al usar el nortestpaquete de R, estas pruebas se pueden realizar:

  • Realizar la prueba de normalidad Anderson-Darling

    ad.test(data1)
  • Realizar la prueba de Cramér-von Mises para la normalidad

    cvm.test(data1)
  • Realizar la prueba de chi-cuadrado de Pearson para la normalidad

    pearson.test(data1)
  • Realizar la prueba de normalidad de Shapiro-Francia

    sf.test(data1)

Se pueden hacer muchas otras pruebas utilizando el normtestpaquete. Ver descripción en https://cran.r-project.org/web/packages/normtest/normtest.pdf


@Mella; He mencionado estas pruebas del paquete 'nortest' que se encuentra aquí: ( cran.r-project.org/web/packages/nortest/nortest.pdf ). Otro paquete útil es 'normtest' como se mencionó anteriormente.
Dra. Nisha Arora

OK gracias. En mi ignorancia asumí que un nombre era un error tipográfico.
Nick Cox
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.