Vraag:
Hoe u een test uitvoert met R om te zien of de gegevens de normale distributie volgen
Skarab
2010-09-28 13:29:33 UTC
view on stackexchange narkive permalink

Ik heb een dataset met de volgende structuur:

  een woord | aantal keren dat een woord in een document voorkomt | een document-id 

Hoe kan ik een test uitvoeren voor normale distributie in R? Waarschijnlijk is het een gemakkelijke vraag, maar ik ben een R-newbie.

@Skarab Misschien ben ik er helemaal naast, maar zou je niet verwachten dat de frequentie van een woord omgekeerd evenredig zal zijn met de rangschikking in de frequentietabel van woorden, volgens de wet van Zipf (http://j.mp/9er2lv)? Bekijk in dit geval het `zipfR`-pakket.
Ik ben het eens met @chl - het zou een klein wonder zijn als uw gegevens normaal werden verspreid. Misschien is een andere vraag over wat u met de gegevens wilt doen de moeite waard. Vind het wiel niet opnieuw uit!
Hoe kunnen uw gegevens worden gedistribueerd volgens een model dat een kans op een negatieve gebeurtenis niet nul geeft?
Wat is de reden om deze test te doen?
Ik wil inschatten of het enorme resultaat van de informatie-extractie correct is. Ik wil controleren of de verdeling van de entiteiten in de tekst overeenkomt met mijn verwachtingen (ik ken het domein en het tekstcorpus).
@chi Ik moest de gegevens met betrekking tot informatie-extractie controleren, voor dit doel had ik de test nodig. Natuurlijk volgt het woord frequentie Zipf.
Zes antwoorden:
#1
+50
csgillespie
2010-09-28 14:13:07 UTC
view on stackexchange narkive permalink

Als ik je vraag goed begrijp, kun je, om te testen of woordoccurrences in een set documenten een normale distributie volgen, gewoon een shapiro-Wilk-test en enkele qqplots gebruiken. Bijvoorbeeld:

  ## Genereer twee gegevenssets ## First Normal, second from a t-distributionwords1 = rnorm (100); words2 = rt (100, df = 3) ## Bekijk de densitiesplot (dichtheid (woorden1)); plot (dichtheid (woorden2)) ## Voer de testshapiro.test (woorden1) uit; shapiro.test (woorden2) ## Plot met een qqplotqqnorm (woorden1); qqline (woorden1, col = 2) qqnorm (woorden2); qqline (woorden2, col = 2)  

De qqplot commando's geven: alt text

Je kunt zien dat de tweede dataset duidelijk niet normaal is door de zware staarten ( Meer informatie).

In de Shapiro-Walk normaliteitstest is de p-waarde groot voor de eerste dataset (> .9) maar erg klein voor de tweede dataset (<.01). Dit zal ertoe leiden dat je de nulhypothese voor de tweede verwerpt.

Waarom is het duidelijk niet normaal?
Ik denk dat de geplotte punten op de middelloodlijn van het kwadrant I-III zo dicht mogelijk bij elkaar moeten liggen als ze een normale verdeling tekenen.
Meer in het algemeen (gemiddelde! = 0), zal de `qqline` 1 helling hebben en * mu * intercept.
@HermanToothrot het is niet normaal als je naar de tweede plot kijkt, omdat er een zeer grote divergentie is in de staartwaarden.De QQ-plot is een grafiek van het theoretische kwantiel (als het normaal was) versus het monsterquantiel (uit de gegevens).Als de voorbeeldgegevens normaal zijn, verwachten we dat de waarnemingen dicht bij de lijn liggen, net als voor de eerste plot.Let ook op het verschil in schaal op de y-as voor die plots.
#2
+16
nico
2010-09-28 14:10:34 UTC
view on stackexchange narkive permalink

Ervan uitgaande dat uw dataset woorden heet en een counts -kolom heeft, kunt u het histogram plotten om een ​​visualisatie van de distributie te hebben:

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

waarbij 100 het aantal bakken is

Je kunt ook een normale QQ-plot maken met

qqnorm(words$counts)

Ten slotte kun je ook de Shapiro-Wilk-test gebruiken voor normaliteit

  shapiro.test (word $ counts)  

Hoewel, kijk eens naar deze discussie: Normaliteitstesten: 'Essentieel nutteloos?'

#3
+14
Glen_b
2010-09-29 03:12:46 UTC
view on stackexchange narkive permalink

Geen enkele test zal u laten zien dat uw gegevens hebben een normale verdeling hebben - het zal u alleen kunnen laten zien wanneer de gegevens voldoende inconsistent zijn met een normale dat u de nul zou verwerpen.

Maar tellingen zijn in ieder geval niet normaal, het zijn positieve gehele getallen - hoe groot is de kans dat een waarneming van een normale verdeling een waarde aanneemt die geen geheel getal is? (... dat is een gebeurtenis met kans 1).

Waarom zou je in dit geval testen op normaliteit? Het is duidelijk niet waar.

[In sommige gevallen maakt het niet per se uit dat u weet dat uw gegevens niet echt normaal zijn. Echte gegevens zullen nooit (of bijna nooit) daadwerkelijk uit een normale distributie worden gehaald.]

Als je echt een test moet doen, gebruik dan de Shapiro-Wilk-test (? Shapiro.test ) is een goede algemene test van normaliteit, een die veel wordt gebruikt.

#4
+9
Joren Bredman
2012-09-14 08:43:38 UTC
view on stackexchange narkive permalink

Een meer formele manier om naar de normaliteit te kijken, is door te testen of de kurtosis en scheefheid significant verschillen van nul.

Om dit te doen, hebben we het volgende nodig:

  kurtosis.test <- function (x) {m4 <- sum ((x-mean (x)) ^ 4) / lengte (x) s4 <- var (x) ^ 2kurt <- (m4 / s4) - 3sek <- sqrt (24 / lengte (x)) totest <- kurt / sekpvalue <- pt (totest, (length (x) -1)) pvalue}  

voor kurtosis, en:

  skew.test <- functie (x) {m3 <- som ( (x-gemiddelde (x)) ^ 3) / lengte (x) s3 <- sqrt (var (x)) ^ 3skew <- m3 / s3ses <- sqrt (6 / lengte (x)) totest <- scheef / sespt (totest, (length (x) -1)) pval <- pt (totest, (length (x) -1)) pval}  

voor Skewness.

Beide tests zijn eenzijdig, dus u moet de p-waarde met 2 vermenigvuldigen om tweezijdig te worden. Als uw p-waarde groter wordt dan één, moet u 1-kurtosis.test () gebruiken in plaats van kurtosis.test.

Als je nog andere vragen hebt, kun je me mailen op [email protected]

Wat zijn de verschillen tussen de bovenstaande twee functies met betrekking tot de functies `kurtosis ()` en `skewness ()` van het pakket * moments *?Resultaten met behulp van `rnorm ()` -samples zijn anders.
#5
+5
Laurent
2010-09-28 19:30:30 UTC
view on stackexchange narkive permalink

Naast de Shapiro-Wilk-test van het stats-pakket, biedt het meest noordelijke pakket (beschikbaar op CRAN) andere normaliteitstests.

#6
+5
Dr Nisha Arora
2016-06-09 15:34:57 UTC
view on stackexchange narkive permalink

Door het nortest -pakket van R te gebruiken, kunnen deze tests worden uitgevoerd:

  • Voer de normaliteitstest van Anderson-Darling uit

     ad.test(data1)
  • Voer Cramér-von Mises-test uit voor normaliteit

      cvm.test (data1 )  
  • Voer Pearson chikwadraattest uit voor normaliteit

      pearson.test (data1)  
  • Voer Shapiro-Francia-test uit voor normaliteit

      sf.test (data1)  

Veel andere tests kunnen worden gedaan door het normtest -pakket te gebruiken. Zie omschrijving op https://cran.r-project.org/web/packages/normtest/normtest.pdf

@Nick;Ik heb deze test genoemd van ** 'nortest' ** pakket hier gevonden: (https://cran.r-project.org/web/packages/nortest/nortest.pdf).Een ander handig pakket is ** 'normtest' ** zoals hierboven vermeld.
OK bedankt.In mijn onwetendheid nam ik aan dat een naam een typefout was.


Deze Q&A is automatisch vertaald vanuit de Engelse taal.De originele inhoud is beschikbaar op stackexchange, waarvoor we bedanken voor de cc by-sa 2.0-licentie waaronder het wordt gedistribueerd.
Loading...