So führen Sie einen Test mit R durch, um festzustellen, ob die Daten der Normalverteilung entsprechen

44

Ich habe einen Datensatz mit folgender Struktur:

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

Wie kann ich einen Test für die Normalverteilung in R durchführen? Wahrscheinlich ist es eine einfache Frage, aber ich bin ein R-Neuling.

Skarabäus
quelle
5
@ Karab Vielleicht bin ich total daneben, aber würden Sie nicht erwarten, dass die Häufigkeit eines Wortes umgekehrt proportional zu seinem Rang in der Häufigkeitstabelle der Wörter ist, gemäß Zipfs Gesetz ( j.mp/9er2lv )? In diesem Fall überprüfen Sie das zipfRPaket.
CHL
1
Ich bin mit @chl einverstanden - es wäre ein kleines Wunder, wenn Ihre Daten normal verteilt würden. Vielleicht lohnt sich eine weitere Frage, was Sie mit den Daten machen wollen. Das Rad nicht neu erfinden!
Csgillespie
3
Wie könnten Ihre Daten nach einem Modell verteilt werden, das ein negatives Auftreten mit einer Wahrscheinlichkeit ungleich Null ermöglicht?
user603
1
Was ist der Grund für diesen Test?
whuber
Ich möchte einschätzen, ob das große Ergebnis der Informationsextraktion korrekt ist. Ich möchte überprüfen, ob die Verteilung der im Text gefundenen Entitäten meinen Erwartungen entspricht (ich kenne den Bereich und das Textkorpus).
Skarab

Antworten:

47

Wenn ich Ihre Frage richtig verstehe, können Sie einen Shapiro-Wilk-Test und einige qqplots verwenden, um zu testen, ob Wortvorkommen in einer Reihe von Dokumenten einer Normalverteilung entsprechen. Zum Beispiel,

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

Die qqplot-Befehle geben Folgendes aus: Alt-Text

Sie können sehen, dass der zweite Datensatz durch die schweren Schwänze eindeutig nicht normal ist ( Weitere Informationen ).

Im Shapiro-Walk-Normalitätstest ist der p-Wert für den ersten Datensatz (> .9) groß, für den zweiten Datensatz (<.01) jedoch sehr klein. Dies führt dazu, dass Sie die Nullhypothese für die Sekunde ablehnen.

csgillespie
quelle
7
Warum ist es eindeutig nicht normal?
Herman Toothrot
Ich denke, die eingezeichneten Punkte sollten auf der I-III-Quadrantenhalbierenden so nahe liegen, wie sie eine Normalverteilung zeichnen.
Campa
Im Allgemeinen (Mittelwert! = 0) qqlinesoll das 1 Steigung und mu Achsenabschnitt haben.
Campa
@HermanToothrot es ist nicht normal, wenn man das zweite Diagramm betrachtet, da es eine sehr große Abweichung in den Endwerten gibt. Das QQ-Diagramm ist eine grafische Darstellung des theoretischen Quantils (wenn es normal war) gegenüber dem Stichprobenquantil (aus den Daten). Wenn die Probendaten normal sind, erwarten wir, dass die Beobachtungen nahe an der Linie liegen, wie bei der ersten Darstellung. Beachten Sie auch die Differenzskala auf der y-Achse für diese Diagramme.
Sheldon
15

Angenommen, Ihr Dataset heißt wordsund enthält eine countsSpalte, können Sie das Histogramm zeichnen, um eine Visualisierung der Verteilung zu erhalten:

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

Dabei ist 100 die Anzahl der Fächer

Sie können auch einen normalen QQ-Plot mit erstellen

qqnorm(words$counts)

Schließlich können Sie auch den Shapiro-Wilk-Test für die Normalität verwenden

shapiro.test(word$counts)

Schauen Sie sich diese Diskussion an: Normalitätstests: 'Im Wesentlichen nutzlos?'

nico
quelle
14

Kein Test zeigen Ihnen , dass Ihre Daten haben eine Normalverteilung - es wird nur in der Lage sein , Ihnen zu zeigen , wenn die Daten ausreichend nicht mit einem normalen ist , dass Sie die Null ablehnen würden.

Aber Zählungen sind in jedem Fall nicht normal, sondern positive ganze Zahlen - wie hoch ist die Wahrscheinlichkeit, dass eine Beobachtung aus einer Normalverteilung einen Wert annimmt, der keine ganze Zahl ist? (... das ist ein Ereignis der Wahrscheinlichkeit 1).

Warum sollten Sie in diesem Fall auf Normalität prüfen? Es ist offensichtlich falsch.

[In einigen Fällen ist es möglicherweise nicht unbedingt wichtig, dass Sie feststellen, dass Ihre Daten nicht normal sind. Echte Daten werden niemals (oder fast nie) tatsächlich aus einer Normalverteilung entnommen.]

Wenn Sie wirklich einen Test durchführen müssen, ist der Shapiro-Wilk-Test ( ?shapiro.test) ein guter allgemeiner Test für die Normalität, der häufig verwendet wird.

Glen_b
quelle
9

Eine formalere Art, die Normalität zu betrachten, besteht darin, zu testen, ob sich Kurtosis und Schiefe signifikant von Null unterscheiden.

Dazu benötigen wir:

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 
}

für Kurtosis und:

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
}

für Schiefe.

Beide Tests sind einseitig, sodass Sie den p-Wert mit 2 multiplizieren müssen, um zweiseitig zu sein. Wenn Ihr p-Wert größer als eins wird, müssen Sie 1-kurtosis.test () anstelle von kurtosis.test verwenden.

Wenn Sie weitere Fragen haben, senden Sie eine E-Mail an [email protected]

Joren Bredman
quelle
Was sind die Unterschiede der beiden oben genannten Funktionen in Bezug auf das kurtosis()und die skewness()Funktionen des Moments- Pakets? Ergebnisse mit rnorm()Stichproben sind unterschiedlich.
Nikos Alexandris
5

Neben dem Shapiro-Wilk-Test des Statistikpakets bietet das Nortest-Paket (verfügbar auf CRAN) weitere Normalitätstests.

Laurent
quelle
4

Mit dem nortestPaket von R können folgende Tests durchgeführt werden:

  • Führen Sie einen Anderson-Darling-Normalitätstest durch

    ad.test(data1)
  • Cramér-von-Mises-Test auf Normalität durchführen

    cvm.test(data1)
  • Führen Sie einen Pearson-Chi-Quadrat-Test für die Normalität durch

    pearson.test(data1)
  • Führen Sie einen Shapiro-Francia-Test auf Normalität durch

    sf.test(data1)

Mit dem normtestPaket können viele andere Tests durchgeführt werden . Siehe Beschreibung unter https://cran.r-project.org/web/packages/normtest/normtest.pdf

Dr. Nisha Arora
quelle
@Nick; Ich habe diesen Test aus dem 'Nortest'- Paket erwähnt, das hier zu finden ist: ( cran.r-project.org/web/packages/nortest/nortest.pdf ). Ein anderes nützliches Paket ist 'normtest', wie oben erwähnt.
Dr. Nisha Arora
OK danke. In meiner Unwissenheit nahm ich an, dass ein Name ein Tippfehler war.
Nick Cox