web-dev-qa-db-de.com

Prüfen, ob Daten normalerweise in R verteilt sind

Kann mir bitte jemand helfen, die folgende Funktion in R auszufüllen:

#data is a single vector of decimal values
normally.distributed <- function(data) {
if(data is normal)
return(TRUE)
else
return(NO)
}
53
CodeGuy

Normalitätstests machen nicht das, was die meisten denken. Shapiros Test, Anderson Darling und andere, sind Nullhypothesen gegen die Annahme von Normalität. Diese sollten nicht verwendet werden, um zu bestimmen, ob statistische Verfahren der normalen Theorie verwendet werden. Tatsächlich sind sie für den Datenanalysten praktisch wertlos. Unter welchen Bedingungen sind wir daran interessiert, die Nullhypothese, dass die Daten normal verteilt sind, abzulehnen? Ich bin noch nie auf eine Situation gestoßen, in der ein normaler Test das Richtige ist. Wenn die Stichprobengröße klein ist, werden selbst große Abweichungen von der Normalität nicht erkannt, und wenn Ihre Stichprobengröße groß ist, führt selbst eine kleinste Abweichung von der Normalität zu einer abgelehnten Null.

Zum Beispiel:

> set.seed(100)
> x <- rbinom(15,5,.6)
> shapiro.test(x)

    Shapiro-Wilk normality test

data:  x 
W = 0.8816, p-value = 0.0502

> x <- rlnorm(20,0,.4)
> shapiro.test(x)

    Shapiro-Wilk normality test

data:  x 
W = 0.9405, p-value = 0.2453

In beiden Fällen (binomische und lognormale Variationen) ist der p-Wert> 0,05, was dazu führt, dass der Nullwert nicht zurückgewiesen wird (dass die Daten normal sind). Müssen wir daraus schließen, dass die Daten normal sind? (Hinweis: Die Antwort ist nein). Versagens ablehnen ist nicht das Gleiche wie Akzeptieren. Dies ist Hypothesentest 101. 

Aber was ist mit größeren Stichprobengrößen? Nehmen wir den Fall, wo die Verteilung sehr fast normal ist.

> library(nortest)
> x <- rt(500000,200)
> ad.test(x)

    Anderson-Darling normality test

data:  x 
A = 1.1003, p-value = 0.006975

> qqnorm(x)

enter image description hereenter image description here

Hier verwenden wir eine T-Verteilung mit 200 Freiheitsgraden. Das qq-Diagramm zeigt, dass die Verteilung näher an der Normalität liegt als jede Verteilung, die Sie in der realen Welt wahrscheinlich sehen werden. Der Test lehnt jedoch die Normalität mit einem sehr hohen Maß an Vertrauen ab.

Bedeutet der signifikante Test gegen die Normalität, dass wir in diesem Fall keine normalen theoretischen Statistiken verwenden sollten? (Noch ein Hinweis: Die Antwort ist nein :))

175
Ian Fellows

Ich würde auch die SnowsPenultimateNormalityTest im TeachingDemos-Paket wärmstens empfehlen. Die Dokumentation der Funktion ist jedoch für Sie weitaus nützlicher als der Test selbst. Lesen Sie es sorgfältig durch, bevor Sie den Test verwenden.

22
Brian Diggs

SnowsPenultimateNormalityTest hat sicherlich seine Vorzüge, aber Sie möchten vielleicht auch qqnorm betrachten.

X <- rlnorm(100)
qqnorm(X)
qqnorm(rnorm(100))
12
42-

Verwenden Sie die Funktion shapiro.test , die den Shapiro-Wilks-Test auf Normalität durchführt. Ich war glücklich damit.

4
Karl

bibliothek (DnE)

x <-rnorm (1000,0,1)

is.norm (x, 10,0.05)

2
yuki

Der Anderson-Darling-Test ist auch nützlich.

library(nortest)
ad.test(data)
1
P Sellaz

wenn Sie einen Test durchführen, haben Sie die Wahrscheinlichkeit, die Nullhypothese abzulehnen, wenn sie wahr ist.

Siehe nächster R-Code:

p=function(n){
  x=rnorm(n,0,1)
  s=shapiro.test(x)
  s$p.value
}

rep1=replicate(1000,p(5))
rep2=replicate(1000,p(100))
plot(density(rep1))
lines(density(rep2),col="blue")
abline(v=0.05,lty=3)

Die Grafik zeigt, dass Sie, wenn Sie eine kleine oder große Stichprobengröße haben, 5% der Fälle die Chance haben, die Nullhypothese zurückzuweisen, wenn sie wahr ist (ein Typ-I-Fehler)

0
user5807327

Zusätzlich zu qqplots und dem Shapiro-Wilk-Test können die folgenden Methoden nützlich sein.

Qualitativ:

  • histogramm im Vergleich zum Normalen
  • cdf im Vergleich zum normalen
  • ggdensity plot
  • ggqqplot

Quantitativ:

Die qualitativen Methoden können mit folgendem in R erzeugt werden:

library("ggpubr")
library("car")

h <- hist(data, breaks = 10, density = 10, col = "darkgray") 
xfit <- seq(min(data), max(data), length = 40) 
yfit <- dnorm(xfit, mean = mean(data), sd = sd(data)) 
yfit <- yfit * diff(h$mids[1:2]) * length(data) 
lines(xfit, yfit, col = "black", lwd = 2)

plot(ecdf(data), main="CDF")
lines(ecdf(rnorm(10000)),col="red")

ggdensity(data)

ggqqplot(data)

Ein Wort der Vorsicht - Tests nicht blind durchführen. Wenn Sie über ein solides Verständnis der Statistiken verfügen, können Sie besser verstehen, wann Sie welche Tests verwenden und wie wichtig Annahmen beim Testen von Hypothesen sind.

0
Anna