it-swarm.com.de

Führen Sie einen Shapiro-Wilk-Normalitätstest durch

Ich möchte einen Shapiro-Wilk-Normalitätstest durchführen. Meine Daten haben das Format csv. Es sieht aus wie das:

> heisenberg
    HWWIchg
1    -15.60
2    -21.60
3    -19.50
4    -19.10
5    -20.90
6    -20.70
7    -19.30
8    -18.30
9    -15.10

Wenn ich jedoch den Test durchführe, bekomme ich:

> shapiro.test(heisenberg)
Error in `[.data.frame`(x, complete.cases(x)) : 
  undefined columns selected

Warum wählt R nicht die rechte Spalte aus und wie geht das? Danke für Ihre Antwort !!!

28
maximus

Was macht shapiro.test?

shapiro.test testet die Nullhypothese dass "die Samples aus einer Normalverteilung stammen" gegen die alternative Hypothese "Die Stichproben stammen nicht aus einer Normalverteilung".

Wie wird shapiro.test in R ausgeführt?

Die R-Hilfeseite für ?shapiro.test gibt

x - a numeric vector of data values. Missing values are allowed, 
    but the number of non-missing values must be between 3 and 5000.

Das heißt, shapiro.test erwartet einen numerischen Vektor als Eingabe, der der Probe entspricht, die Sie testen möchten, und es ist die einzige erforderliche Eingabe. Da Sie ein data.frame haben, müssen Sie die gewünschte Spalte wie folgt als Eingabe an die Funktion übergeben:

> shapiro.test(heisenberg$HWWIchg)
#   Shapiro-Wilk normality test

# data:  heisenberg$HWWIchg 
# W = 0.9001, p-value = 0.2528

Interpretation der Ergebnisse von shapiro.test:

Zuerst empfehle ich Ihnen dringend , diese ausgezeichnete Antwort zu lesen von Ian Fellows bei testing for normality.

Wie oben gezeigt, testet der shapiro.test die NULL-Hypothese, dass die Stichproben aus einer Normalverteilung stammen. Dies bedeutet, wenn Ihr p-Wert <= 0,05 ist, würden Sie ablehnen die NULL-Hypothese, dass die Stichproben aus einer Normalverteilung stammen. Wie Ian Fellows es nett formulierte: Sie testen gegen die Annahme der Normalität ​​". Mit anderen Worten (korrigieren Sie mich, wenn ich bin falsch), wäre es viel besser, wenn man die NULL-Hypothese testet, dass die Stichproben nicht ​​aus einer Normalverteilung stammen. nicht dasselbe als Annahme der alternativen Hypothese.

Im Fall der Nullhypothese von shapiro.test würde ein p-Wert <= 0,05 die Nullhypothese verwerfen, dass die Stichproben aus der Normalverteilung stammen. Um es grob auszudrücken, es gibt eine seltene Chance, dass die Proben aus einer Normalverteilung stammten. Der Nebeneffekt dieser Hypothesentests ist, dass dies seltene Chance passiert sehr selten. Zur Veranschaulichung nehmen Sie zum Beispiel:

set.seed(450)
x <- runif(50, min=2, max=4)
shapiro.test(x)
#   Shapiro-Wilk normality test
# data:  runif(50, min = 2, max = 4) 
# W = 0.9601, p-value = 0.08995

Diese (bestimmte) Stichprobe runif(50, min=2, max=4) stammt also aus einer Normalverteilung nach diesem Test. Was ich damit sagen will, ist, dass es viele Fälle gibt, in denen die "extremen" Anforderungen (p <0,05) nicht erfüllt sind, was dazu führt, dass die "NULL-Hypothese" meistens akzeptiert wird, was irreführend sein könnte.

Ein weiteres Problem, das ich hier von @PaulHiemstra unter den Kommentaren zu den Auswirkungen auf große Stichproben zitieren möchte:

Ein weiteres Problem beim Shapiro-Wilk-Test besteht darin, dass die Wahrscheinlichkeit größer wird, dass die Nullhypothese verworfen wird, wenn Sie mehr Daten eingeben. Was also passiert, ist, dass für große Datenmengen selbst sehr kleine Abweichungen von der Normalität festgestellt werden können, was zur Zurückweisung des Nullhypothesenereignisses führt, obwohl die Daten für praktische Zwecke mehr als normal genug sind.

Obwohl er auch darauf hinweist, dass die Datengrößenbeschränkung von R dies ein wenig schützt:

Glücklicherweise schützt shapiro.test den Benutzer vor dem oben beschriebenen Effekt, indem die Datengröße auf 5000 begrenzt wird.

Wenn die NULL-Hypothese das Gegenteil ist, dh die Stichproben nicht ​​stammen aus einer Normalverteilung, und Sie erhalten einen p-Wert <0,05, dann schließen Sie, dass dies der Fall ist sehr selten dass diese Stichproben nicht ​​aus einer Normalverteilung stammen (lehnen Sie die NULL-Hypothese ab). Das bedeutet: Es ist sehr wahrscheinlich, dass die Stichproben normal verteilt sind (obwohl einige Statistiker diese Art der Interpretation möglicherweise nicht mögen). Ich glaube, das versuchte Ian Fellows auch in seinem Beitrag zu erklären. Bitte korrigieren Sie mich, wenn ich etwas falsch gemacht habe!

@PaulHiemstra kommentiert auch praktische Situationen (Beispiel einer Regression), wenn man auf dieses Problem des Testens auf Normalität stößt:

In der Praxis, wenn eine Analyse Normalität annimmt, z. lch würde diesen Shapiro-Wilk-Test nicht durchführen, sondern die Analyse durchführen und Diagnosediagramme des Analyseergebnisses betrachten, um zu beurteilen, ob Annahmen der Analyse zu stark verletzt wurden. Für die lineare Regression mit lm sehen Sie sich einige der Diagnosediagramme an, die Sie mit plot (lm ()) erhalten. Die Statistik besteht nicht aus einer Reihe von Schritten, die ein paar Zahlen auswerten (hey p <0,05!), Sondern erfordert viel Erfahrung und Geschick bei der Beurteilung der richtigen Analyse Ihrer Daten.

Hier finde ich die Antwort von Ian Fellows auf Ben Bolkers Kommentar unter der gleichen Frage, die bereits oben verlinkt wurde, gleichermaßen (wenn nicht mehr) informativ:

Für lineare Regression

  1. Sorgen Sie sich nicht viel um Normalität. Der CLT übernimmt schnell und wenn Sie nur die kleinsten Stichprobengrößen und ein sogar aus der Ferne vernünftig aussehendes Histogramm haben, sind Sie in Ordnung.

  2. Sorge um ungleiche Varianzen (Heteroskedastizität). Ich mache mir deswegen (fast) Sorgen, weil ich standardmäßig HCCM-Tests verwende. Ein Skalierungsplot gibt eine Vorstellung davon, ob dies fehlerhaft ist, aber nicht immer. Es gibt auch keinen a priori Grund, in den meisten Fällen von gleichen Abweichungen auszugehen.

  3. Ausreißer. Ein Kochabstand von> 1 gibt Anlass zur Sorge.

Das sind meine Gedanken (FWIW).

Hoffe, das klärt ein bisschen auf.

124
Arun

Sie wenden shapiro.test () auf einen Datenrahmen statt auf die Spalte an. Versuche Folgendes:

shapiro.test(heisenberg$HWWIchg)

Es ist nicht möglich, die genauen Spalten (Daten) anzugeben, um die Normalität zu testen

shapiro.test(heisenberg$HWWIchg)