Sprawdzanie, czy dane są normalnie dystrybuowane w R

Czy ktoś może mi pomóc wypełnić następującą funkcję w R:

#data is a single vector of decimal values
normally.distributed <- function(data) {
if(data is normal)
return(TRUE)
else
return(NO)
}
Author: pnuts, 2011-10-16

8 answers

Testy normalności nie robią tego, co większość myśli. Test Shapiro, Anderson Darling i inni są testami hipotezy zerowej przeciwko założeniu normalności. Nie należy ich używać do określania, czy należy stosować zwykłe procedury statystyczne teorii. W rzeczywistości nie mają one praktycznie żadnej wartości dla analityka danych. Na jakich warunkach jesteśmy zainteresowani odrzuceniem hipotezy zerowej, że dane są normalnie dystrybuowane? Nigdy nie spotkałem się z sytuacją, w której normalny test jest słusznie. Gdy rozmiar próbki jest mały, nawet duże odstępstwa od normalności nie są wykrywane, a gdy rozmiar próbki jest duży, nawet najmniejsze odchylenie od normalności doprowadzi do odrzucenia null.

Na przykład:

> 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

Tak więc, w obu tych przypadkach (zmienność dwumianowa i lognormalna) wartość P wynosi > 0.05, co powoduje brak odrzucenia null (że dane są normalne). Czy to oznacza, że mamy stwierdzić, że dane są normalne? (podpowiedź: odpowiedź brzmi nie). Niepowodzenie odrzucenie to nie to samo, co akceptacja. To Test hipotezy 101.

Ale co z większymi rozmiarami próbek? Weźmy przypadek, w którym rozkład jest bardzo {[10] } prawie normalny.
> library(nortest)
> x <- rt(500000,200)
> ad.test(x)

    Anderson-Darling normality test

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

> qqnorm(x)

Tutaj wpisz opis obrazkaTutaj wpisz opis obrazka

Tutaj używamy rozkładu t o 200 stopniach swobody. Wykres qq pokazuje, że rozkład jest bliższy normalności niż jakakolwiek dystrybucja, którą można zobaczyć w świecie rzeczywistym, ale test odrzuca normalność z bardzo wysokim stopniem pewność siebie.

Czy znaczący test na normalność oznacza, że nie powinniśmy używać w tym przypadku statystyki normalnej teorii? (kolejna podpowiedź: odpowiedź brzmi NIE:))

 168
Author: Ian Fellows,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-07 22:07:57

Gorąco polecam również SnowsPenultimateNormalityTest w pakiecie TeachingDemos. Dokumentacja funkcji jest dla Ciebie o wiele bardziej przydatna niż sam test. Przeczytaj go dokładnie przed użyciem testu.

 22
Author: Brian Diggs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-26 22:44:32

SnowsPenultimateNormalityTest z pewnością ma swoje zalety, ale możesz również chcieć spojrzeć na qqnorm.

X <- rlnorm(100)
qqnorm(X)
qqnorm(rnorm(100))
 12
Author: 42-,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-16 03:49:09

Rozważ użycie funkcji shapiro.test, który wykonuje test Shapiro-Wilksa na normalność. Byłem z tego zadowolony.

 4
Author: Karl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-16 01:45:06

Biblioteka (DnE)

X

Jest.norm (x,10,0.05)

 2
Author: yuki,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-16 03:23:34

Test Andersona-Darlinga jest również przydatny.

library(nortest)
ad.test(data)
 1
Author: P Sellaz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-16 19:07:58

Kiedy wykonujesz test, kiedykolwiek masz probabilty odrzucić hipotezę zerową, gdy jest to prawda.

Zobacz kod nextt R:

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)

Wykres pokazuje, że Czy masz wielkość próbki małe lub duże 5% razy masz szansę odrzucić hipotezę zerową, gdy to prawda (błąd typu I)

 0
Author: user5807327,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-11 03:32:48

Oprócz qqplots i testu Shapiro-Wilka przydatne mogą być następujące metody.

Jakościowy:

  • histogram w porównaniu z normalnym
  • cdf w porównaniu do normalnego
  • opisy gg
  • ggqqplot

Ilość:

Metody jakościowe można wytworzyć stosując w R:

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)

A słowo ostrzeżenia - nie ślepo stosować testów. Posiadanie solidnego zrozumienia statystyk pomoże Ci zrozumieć, kiedy używać jakich testów i znaczenie założeń w testowaniu hipotez.

 0
Author: Anna,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-13 23:13:18