Como executar um teste usando R para ver se os dados seguem a distribuição normal


44

Eu tenho um conjunto de dados com a seguinte estrutura:

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

Como posso executar um teste para distribuição normal em R? Provavelmente é uma pergunta fácil, mas eu sou um novato em R.


5
@Skarab Talvez eu esteja totalmente de folga, mas você não espera que a frequência de qualquer palavra seja inversamente proporcional à sua classificação na tabela de frequência de palavras, de acordo com a lei de Zipf ( j.mp/9er2lv )? Nesse caso, confira o zipfRpacote.
chl

1
Concordo com @chl - seria um pequeno milagre se seus dados fossem normalmente distribuídos. Talvez outra pergunta sobre o que você deseja fazer com os dados valha a pena. Não reinvente a roda!
Csgillespie 28/09/10

3
Como seus dados podem ser distribuídos de acordo com um modelo que fornece probabilidade diferente de zero para ocorrência negativa?
user603

1
Qual é o motivo para fazer este teste?
whuber

Quero estimar se o enorme resultado da extração de informações está correto. Quero verificar se a distribuição das entidades encontradas no texto segue minhas expectativas (conheço o domínio e o corpus do texto).
Skarab 29/09/10

Respostas:


47

Se entendi sua pergunta corretamente, para testar se as ocorrências de palavras em um conjunto de documentos seguem uma distribuição Normal, basta usar um teste shapiro-Wilk e alguns qqplots. Por exemplo,

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

Os comandos qqplot fornecem: texto alternativo

Você pode ver que o segundo conjunto de dados claramente não é Normal pelas caudas pesadas ( Mais informações ).

No teste de normalidade Shapiro-Walk, o valor p é grande para o primeiro conjunto de dados (> .9), mas muito pequeno para o segundo conjunto de dados (<.01). Isso levará você a rejeitar a hipótese nula pelo segundo.


7
Por que claramente não é normal?
Herman Toothrot 16/01

Penso que os pontos plotados devem estar no bissetor I-III do quadrante o mais próximo possível da distribuição normal.
Campa

De maneira mais geral (média! = 0), o qqlinedeve ter 1 inclinação e mu interceptar.
Campa

@HermanToothrot não é normal quando se olha para o segundo gráfico, pois há uma divergência muito grande nos valores da cauda. O gráfico QQ é um gráfico do quantil teórico (se fosse normal) versus o quanti da amostra (a partir dos dados). Se os dados da amostra forem normais, esperamos que as observações estejam próximas da linha, como no primeiro gráfico. Observe também a escala de diferença no eixo y para esses gráficos.
Sheldon

15

Supondo que seu conjunto de dados seja chamado wordse tenha uma countscoluna, você pode plotar o histograma para ter uma visualização da distribuição:

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

onde 100 é o número de posições

Você também pode fazer um gráfico QQ normal usando

qqnorm(words$counts)

Por fim, você também pode usar o teste Shapiro-Wilk para normalidade

shapiro.test(word$counts)

Embora, observe esta discussão: Teste de normalidade: 'Essencialmente inútil?'


14

Nenhum teste mostrará que seus dados têm uma distribuição normal - somente será capaz de mostrar quando os dados forem suficientemente inconsistentes com o normal e você rejeitará o nulo.

Mas as contagens não são normais, são números inteiros positivos - qual é a probabilidade de uma observação de uma distribuição normal ter um valor que não é um número inteiro? (... esse é um evento de probabilidade 1).

Por que você testaria a normalidade neste caso? É obviamente falso.

[Em alguns casos, pode não ser necessariamente importante que você saiba que seus dados não são realmente normais. Dados reais nunca (ou quase nunca) serão realmente extraídos de uma distribuição normal.]

Se você realmente precisa fazer um teste, o teste Shapiro-Wilk ( ?shapiro.test) é um bom teste geral de normalidade, amplamente utilizado.


9

Uma maneira mais formal de observar a normalidade é testar se a curtose e a inclinação são significativamente diferentes de zero.

Para fazer isso, precisamos obter:

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 
}

para curtose e:

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
}

Skewness.

Ambos os testes são unilaterais, portanto, você precisará multiplicar o valor-p por 2 para se tornar bilateral. Se o seu valor p for maior que um, você precisará usar 1-kurtosis.test () em vez de kurtosis.test.

Se você tiver outras perguntas, envie um email para j.bredman@gmail.com


Quais são as diferenças, das duas funções acima, em relação às funções kurtosis()e skewness()do pacote momentos ? Os resultados usando rnorm()amostras são diferentes.
Nikos Alexandris

5

Além do teste de Shapiro-Wilk do pacote de estatísticas, o pacote nortest (disponível no CRAN) fornece outros testes de normalidade.


4

Usando o nortestpacote de R, esses testes podem ser realizados:

  • Realizar teste de normalidade Anderson-Darling

    ad.test(data1)
  • Realize o teste de Cramér-von Mises para normalidade

    cvm.test(data1)
  • Realize o teste qui-quadrado de Pearson para normalidade

    pearson.test(data1)
  • Realize o teste Shapiro-Francia para normalidade

    sf.test(data1)

Muitos outros testes podem ser feitos usando o normtestpacote. Veja a descrição em https://cran.r-project.org/web/packages/normtest/normtest.pdf


@Usuario; Mencionei esses testes no pacote 'nortest' encontrado aqui: ( cran.r-project.org/web/packages/nortest/nortest.pdf ). Outro pacote útil é 'normtest' como mencionado acima.
Dr. Nisha Arora

OK obrigado. Na minha ignorância, presumi que um nome era um erro de digitação.
Nick Cox
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.