Jak wykonać test przy użyciu R, aby sprawdzić, czy dane mają rozkład normalny

44

Mam zestaw danych o następującej strukturze:

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

Jak mogę wykonać test normalnej dystrybucji w R? Prawdopodobnie jest to łatwe pytanie, ale jestem początkującym R.

Skarab
źródło
5
@Skarab Może jestem całkowicie wyłączony, ale czy nie spodziewałbyś się, że częstotliwość dowolnego słowa będzie odwrotnie proporcjonalna do jego pozycji w tabeli częstotliwości słów, zgodnie z prawem Zipfa ( j.mp/9er2lv )? W takim przypadku sprawdź zipfRpaczkę.
chl
1
Zgadzam się z @chl - byłby drobny cud, gdyby twoje dane były normalnie dystrybuowane. Być może warto byłoby zadać kolejne pytanie o to, co chcesz zrobić z danymi. Nie wymyślaj koła na nowo!
csgillespie
3
Jak można dystrybuować dane zgodnie z modelem, który daje niezerowe prawdopodobieństwo wystąpienia negatywnego?
user603,
1
Jaki jest powód przeprowadzenia tego testu?
whuber
Chcę oszacować, czy ogromny wynik wyodrębnienia informacji jest poprawny. Chcę sprawdzić, czy rozkład bytów znalezionych w tekście jest zgodny z moimi oczekiwaniami (znam domenę i korpus tekstowy).
Skarab

Odpowiedzi:

47

Jeśli dobrze rozumiem twoje pytanie, to aby sprawdzić, czy występowanie słów w zestawie dokumentów ma rozkład normalny, możesz po prostu użyć testu shapiro-Wilka i niektórych qqplotów. Na przykład,

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

Polecenia qqplot dają: alternatywny tekst

Widzisz, że drugi zestaw danych wyraźnie nie jest normalny przy ciężkich ogonach ( więcej informacji ).

W teście normalności Shapiro-Walk wartość p jest duża dla pierwszego zestawu danych (> .9), ale bardzo mała dla drugiego zestawu danych (<.01). Doprowadzi cię to do odrzucenia hipotezy zerowej dla drugiej.

csgillespie
źródło
7
Dlaczego to wyraźnie nie jest normalne?
Herman Toothrot
Myślę, że narysowane punkty powinny leżeć na dwusiecznej ćwiartki I-III tak blisko, jak narysują rozkład normalny.
Campa
Mówiąc bardziej ogólnie (średnia! = 0), qqlinepowinny mieć 1 nachylenie i punkt przecięcia mu .
Campa
@HermanToothrot nie jest normalny, gdy patrzy się na drugi wykres, ponieważ istnieje bardzo duża rozbieżność w wartościach ogona. Wykres QQ jest wykresem kwantyla teoretycznego (jeśli był normalny) w porównaniu z próbką kwantową (z danych). Jeśli przykładowe dane są normalne, spodziewamy się, że obserwacje będą zbliżone do linii, tak jak w przypadku pierwszego wykresu. Zwróć także uwagę na samą różnicę skali na osi y dla tych wykresów.
Sheldon,
15

Zakładając, że Twój zestaw danych jest wywoływany wordsi ma countskolumnę, możesz wykreślić histogram, aby uzyskać wizualizację rozkładu:

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

gdzie 100 to liczba pojemników

Możesz również wykonać normalny wykres QQ, używając

qqnorm(words$counts)

Na koniec możesz także użyć testu Shapiro-Wilka dla normalności

shapiro.test(word$counts)

Chociaż spójrz na tę dyskusję: Testowanie normalności: „Zasadniczo bezużyteczne?”

Nico
źródło
14

Żaden test nie pokaże, że twoje dane mają rozkład normalny - będzie w stanie pokazać ci tylko, gdy dane będą wystarczająco niespójne z normalnym, że odrzucisz zero.

Ale w każdym razie liczby nie są normalne, są dodatnimi liczbami całkowitymi - jakie jest prawdopodobieństwo, że obserwacja z rozkładu normalnego przyjmie wartość, która nie jest liczbą całkowitą? (... to zdarzenie o prawdopodobieństwie 1).

Dlaczego miałbyś w tym przypadku testować normalność? To oczywiście nieprawda.

[W niektórych przypadkach niekoniecznie musi mieć znaczenie fakt, że można stwierdzić, że dane nie są normalne. Rzeczywiste dane nigdy (lub prawie nigdy) nie zostaną faktycznie wyciągnięte z normalnego rozkładu.]

Jeśli naprawdę musisz wykonać test, test Shapiro-Wilka ( ?shapiro.test) jest dobrym ogólnym testem normalności, który jest szeroko stosowany.

Glen_b
źródło
9

Bardziej formalnym sposobem patrzenia na normalność jest testowanie, czy kurtoza i skośność różnią się znacznie od zera.

Aby to zrobić, musimy uzyskać:

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 
}

w przypadku kurtozy i:

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
}

na skośność.

Oba te testy są jednostronne, więc musisz pomnożyć wartość p przez 2, aby stać się dwustronnym. Jeśli twoja wartość p stanie się większa niż jedna, musisz użyć 1-kurtosis.test () zamiast kurtosis.test.

Jeśli masz inne pytania, możesz wysłać do mnie e-mail na adres [email protected]

Joren Bredman
źródło
Jakie są różnice powyższych dwóch funkcji w odniesieniu do funkcji kurtosis()i skewness()z pakietu momentów ? Wyniki przy użyciu rnorm()próbek są różne.
Nikos Alexandris
5

Oprócz testu Shapiro-Wilka pakietu statystyk, najdalej wysunięty na północ pakiet (dostępny w CRAN) zapewnia inne testy normalności.

Laurent
źródło
4

Korzystając z nortestpakietu R, testy te można przeprowadzić:

  • Wykonaj test normalności Andersona-Darlinga

    ad.test(data1)
  • Wykonaj test Craméra-von Misesa na normalność

    cvm.test(data1)
  • Wykonaj test chi-kwadrat Pearsona dla normalności

    pearson.test(data1)
  • Wykonaj test Shapiro-Francia pod kątem normalności

    sf.test(data1)

Korzystając z normtestpakietu, można wykonać wiele innych testów . Zobacz opis na https://cran.r-project.org/web/packages/normtest/normtest.pdf

Dr Nisha Arora
źródło
@Nacięcie; Wspomniałem o tych testach z pakietu „nortest” znalezionego tutaj: ( cran.r-project.org/web/packages/nortest/nortest.pdf ). Innym przydatnym pakietem jest „test normalny”, jak wspomniano powyżej.
Dr Nisha Arora,
Ok dzięki. W mojej niewiedzy założyłem, że jedno imię jest literówką.
Nick Cox