Comment effectuer un test en utilisant R pour voir si les données suivent la distribution normale

45

J'ai un ensemble de données avec la structure suivante:

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

Comment puis-je tester une distribution normale dans R? C'est probablement une question facile mais je suis un novice.

Skarab
la source
5
@Skarab Peut-être que je suis totalement hors-jeu, mais ne pensez-vous pas que la fréquence d'un mot sera inversement proportionnelle à son rang dans le tableau de fréquence des mots, selon la loi de Zipf ( j.mp/9er2lv )? Dans ce cas, consultez le zipfRpackage.
chl
1
Je suis d'accord avec @chl - ce serait un miracle mineur si vos données étaient normalement distribuées. Peut-être une autre question sur ce que vous voulez faire avec les données vaudrait la peine. Ne réinventez pas la roue!
csgillespie le
3
Comment vos données pourraient-elles être distribuées selon un modèle qui donne une probabilité non nulle à une occurrence négative?
user603
1
Quelle est la raison de faire ce test?
whuber
Je veux estimer si le résultat énorme de l'extraction d'informations est correct. Je veux vérifier si la distribution des entités trouvées dans le texte correspond à mes attentes (je connais le domaine et le corpus de texte).
Skarab le

Réponses:

48

Si je comprends bien votre question, alors pour vérifier si les occurrences de mots dans un ensemble de documents suivent une distribution normale, vous pouvez simplement utiliser un test shapiro-wilk et quelques qqtrots. Par exemple,

## 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)

Les commandes qqplot donnent: texte alternatif

Vous pouvez voir que le second ensemble de données n'est clairement pas normal par les queues épaisses ( Plus d'infos ).

Dans le test de normalité Shapiro-Walk, la valeur p est grande pour le premier ensemble de données (> 0,9) mais très petite pour le deuxième ensemble de données (<0,01). Cela vous mènera à rejeter l'hypothèse nulle pour la seconde.

csgillespie
la source
7
Pourquoi est-ce clairement pas normal?
Herman Toothrot le
Je pense que les points tracés doivent se situer sur la bissectrice du quadrant I-III aussi près qu’ils dessinent une distribution normale.
Campa
Plus généralement (moyenne! = 0), le qqlinedoit avoir une pente et une interception mu .
Campa
@ HermanToothrot ce n'est pas normal quand on regarde le deuxième tracé car il y a une très grande divergence dans les valeurs de queue. Le graphique QQ est un graphique du quantile théorique (s'il était normal) par rapport à l'échantillon quantlie (à partir des données). Si les données de l'échantillon sont normales, nous nous attendons à ce que les observations soient proches de la ligne, comme pour le premier graphique. Notez également l’échelle de différence sur l’axe des y pour ces tracés.
Sheldon
15

En supposant que votre jeu de données s'appelle wordset ait une countscolonne, vous pouvez tracer l'histogramme pour avoir une visualisation de la distribution:

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

où 100 est le nombre de bacs

Vous pouvez également faire un tracé QQ normal en utilisant

qqnorm(words$counts)

Enfin, vous pouvez également utiliser le test de Shapiro-Wilk pour la normalité

shapiro.test(word$counts)

Bien que, regardez cette discussion: Test de normalité: «Essentiellement inutile?

Nico
la source
14

Aucun test ne vous montrera que vos données ont une distribution normale - il ne pourra vous montrer que lorsque les données sont suffisamment incohérentes avec une normale pour que vous rejetiez la valeur null.

Mais les comptages ne sont pas normaux dans tous les cas, ce sont des entiers positifs - quelle est la probabilité qu'une observation d'une distribution normale prenne une valeur qui n'est pas un entier? (... c'est un événement de probabilité 1).

Pourquoi voudriez-vous tester la normalité dans ce cas? C'est évidemment faux.

[Dans certains cas, il n’est pas forcément important que vous sachiez que vos données ne sont pas normales. Les données réelles ne seront jamais (ou presque jamais) réellement tirées d'une distribution normale.]

Si vous avez vraiment besoin de faire un test, le test Shapiro-Wilk ( ?shapiro.test) est un bon test général de normalité, largement utilisé.

Glen_b
la source
9

Une façon plus formelle de considérer la normalité consiste à vérifier si le kurtosis et l'asymétrie sont significativement différents de zéro.

Pour ce faire, nous devons obtenir:

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 
}

pour kurtosis, et:

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
}

pour Skewness.

Ces deux tests sont unilatéraux, vous devez donc multiplier la valeur p par 2 pour devenir bilatéral. Si votre valeur p dépasse 1, vous devrez utiliser 1-kurtosis.test () au lieu de kurtosis.test.

Si vous avez d'autres questions, vous pouvez m'envoyer un e-mail à l'adresse [email protected].

Joren Bredman
la source
Quelles sont les différences entre les deux fonctions ci-dessus en ce qui concerne les fonctions kurtosis()and skewness()du paquet moments ? Les résultats utilisant des rnorm()échantillons sont différents.
Nikos Alexandris
5

En plus du test Shapiro-Wilk du paquet de statistiques, le paquet le plus au nord (disponible sur CRAN) fournit d'autres tests de normalité.

Laurent
la source
5

En utilisant le nortestpackage de R, ces tests peuvent être effectués:

  • Effectuer le test de normalité Anderson-Darling

    ad.test(data1)
  • Effectuer un test de normalité avec Cramér-von Mises

    cvm.test(data1)
  • Effectuer le test du khi-deux de Pearson pour la normalité

    pearson.test(data1)
  • Effectuer un test Shapiro-Francia pour la normalité

    sf.test(data1)

De nombreux autres tests peuvent être effectués à l'aide du normtestpackage. Voir la description sur https://cran.r-project.org/web/packages/normtest/normtest.pdf

Dr Nisha Arora
la source
@Entaille; J'ai mentionné ces tests du paquet 'nortest' trouvé ici: ( cran.r-project.org/web/packages/nortest/nortest.pdf ). Un autre paquet utile est 'normtest' comme mentionné ci-dessus.
Dr Nisha Arora
OK merci. Dans mon ignorance, j'ai supposé qu'un nom était une faute de frappe.
Nick Cox