Come eseguire un test usando R per vedere se i dati seguono una distribuzione normale


45

Ho un set di dati con la seguente struttura:

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

Come posso eseguire un test per la distribuzione normale in R? Probabilmente è una domanda facile ma io sono un principiante R.


5
@Skarab Forse sono totalmente fuori, ma non ti aspetteresti che la frequenza di una parola sarà inversamente proporzionale al suo rango nella tabella delle frequenze, secondo la legge di Zipf ( j.mp/9er2lv )? In questo caso, controlla il zipfRpacchetto.
— chl,

1
Sono d'accordo con @chl - sarebbe un miracolo minore se i tuoi dati fossero normalmente distribuiti. Forse sarebbe utile un'altra domanda su cosa vuoi fare con i dati. Non reinventare la ruota!
— csgillespie,

3
In che modo i dati potrebbero essere distribuiti secondo un modello che dà probabilità non nulle al verificarsi negativo?
— user603,

1
Qual è la ragione per fare questo test?
— whuber

Voglio stimare se l'enorme risultato dell'estrazione delle informazioni è corretto. Voglio verificare se la distribuzione delle entità trovate nel testo segue le mie aspettative (conosco il dominio e il corpus di testo).
— Skarab,

Risposte:


48

Se capisco correttamente la tua domanda, quindi per verificare se le occorrenze di parole in una serie di documenti seguono una distribuzione normale, puoi semplicemente usare un test shapiro-Wilk e alcuni qqplot. Per esempio,

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

I comandi qqplot danno: testo alternativo

Puoi vedere che il secondo set di dati non è chiaramente normale per le code pesanti ( Ulteriori informazioni ).

Nel test di normalità di Shapiro-Walk, il valore p è grande per il primo set di dati (> .9) ma molto piccolo per il secondo set di dati (<.01). Questo ti porterà a respingere l'ipotesi nulla per il secondo.


7
Perché chiaramente non è normale?
— Herman Toothrot,

Penso che i punti tracciati dovrebbero trovarsi sulla bisettrice del quadrante I-III tanto più vicino quanto disegnano una distribuzione normale.
— Campa

Più in generale (media! = 0), qqlinedevono avere 1 pendenza e intercettazione mu .
— Campa

@HermanToothrot non è normale quando si osserva la seconda trama in quanto vi è una grande divergenza nei valori di coda. Il diagramma QQ è un grafico del quantile teorico (se era normale) rispetto al quantlie campione (dai dati). Se i dati del campione sono normali, ci aspettiamo che le osservazioni siano vicine alla linea, come lo sono per il primo grafico. Nota anche la scala delle differenze stesse sull'asse y per quei grafici.
— Sheldon,

15

Supponendo che il set di dati sia chiamato wordse abbia una countscolonna, è possibile tracciare l'istogramma per visualizzare la distribuzione:

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

dove 100 è il numero di bin

Puoi anche fare un normale diagramma QQ usando

qqnorm(words$counts)

Infine, puoi anche usare il test Shapiro-Wilk per la normalità

shapiro.test(word$counts)

Tuttavia, guarda questa discussione: Test di normalità: "Essenzialmente inutile?"


14

Nessun test ti mostrerà che i tuoi dati hanno una distribuzione normale - sarà in grado di mostrarti solo quando i dati sono sufficientemente incoerenti con un normale da rifiutare il null.

Ma i conteggi non sono normali in ogni caso, sono numeri interi positivi: qual è la probabilità che un'osservazione da una distribuzione normale prenda un valore che non sia un numero intero? (... questo è un evento di probabilità 1).

Perché testeresti la normalità in questo caso? È ovviamente falso.

[In alcuni casi potrebbe non essere necessariamente importante sapere che i tuoi dati non sono effettivamente normali. I dati reali non verranno mai (o quasi mai) effettivamente estratti da una normale distribuzione.]

Se hai davvero bisogno di fare un test, il test Shapiro-Wilk ( ?shapiro.test) è un buon test generale di normalità, ampiamente utilizzato.


9

Un modo più formale di guardare alla normalità è testare se la curtosi e l'asimmetria sono significativamente diverse da zero.

Per fare questo, dobbiamo ottenere:

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 
}

per curtosi e:

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
}

per Skewness.

Entrambi questi test sono a una coda, quindi dovrai moltiplicare il valore p per 2 per diventare a due code. Se il tuo valore p diventa maggiore di uno, dovrai usare 1-kurtosis.test () invece di kurtosis.test.

Se hai altre domande puoi scrivermi a j.bredman@gmail.com


Quali sono le differenze, tra le due funzioni di cui sopra, rispetto al pacchetto di funzioni kurtosis()e momenti ? I risultati usando i campioni sono diversi. skewness()rnorm()
— Nikos Alexandris,

5

Oltre al test Shapiro-Wilk del pacchetto di statistiche, il pacchetto più conveniente (disponibile su CRAN) fornisce altri test di normalità.


5

Utilizzando il nortestpacchetto di R, questi test possono essere condotti:

  • Eseguire il test di normalità Anderson-Darling

    ad.test(data1)
  • Eseguire il test di Cramér-von Mises per la normalità

    cvm.test(data1)
  • Eseguire il test chi-quadrato di Pearson per la normalità

    pearson.test(data1)
  • Esegui il test Shapiro-Francia per la normalità

    sf.test(data1)

Molti altri test possono essere eseguiti utilizzando il normtestpacchetto. Vedere la descrizione su https://cran.r-project.org/web/packages/normtest/normtest.pdf


@ Nick; Ho citato questi test dal pacchetto 'nortest' trovato qui: ( cran.r-project.org/web/packages/nortest/nortest.pdf ). Un altro pacchetto utile è 'normtest' come menzionato sopra.
— Dr Nisha Arora,

Ok grazie. Nella mia ignoranza ho pensato che un nome fosse un errore di battitura.
— Nick Cox,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.