Ver se os dados são normalmente distribuídos em R

Alguém por favor pode me ajudar a preencher a seguinte function em R:

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

Os testes de normalidade não fazem o que a maioria pensa que eles fazem. O teste de Shapiro, Anderson Darling e outros são testes de hipóteses nulos contra o pressuposto da normalidade. Estes não devem ser usados ​​para determinar se devem ser usados ​​procedimentos estatísticos teóricos normais. Na verdade, eles praticamente não têm valor para o analista de dados. Em que condições estamos interessados ​​em rejeitar a hipótese nula de que os dados são normalmente distribuídos? Eu nunca encontrei uma situação em que um teste normal é a coisa certa a fazer. Quando o tamanho da amostra é pequeno, até mesmo grandes desvios da normalidade não são detectados e, quando o tamanho da amostra é grande, até mesmo o menor desvio da normalidade levará a um valor nulo rejeitado.

Por exemplo:

 > 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 

Portanto, em ambos os casos (variables ​​binomiais e lognormais) o valor de p é> 0,05 causando uma falha na rejeição do nulo (que os dados são normais). Isso significa que devemos concluir que os dados são normais? (dica: a resposta é não). Não rejeitar não é o mesmo que aceitar. Este é o teste de hipóteses 101.

Mas e quanto aos tamanhos de amostra maiores? Vamos pegar o caso onde a distribuição é quase normal.

 > library(nortest) > x <- rt(500000,200) > ad.test(x) Anderson-Darling normality test data: x A = 1.1003, p-value = 0.006975 > qqnorm(x) 

insira a descrição da imagem aquiinsira a descrição da imagem aqui

Aqui estamos usando uma distribuição t com 200 graus de liberdade. O qq-plot mostra que a distribuição está mais próxima do normal do que qualquer distribuição que você possa ver no mundo real, mas o teste rejeita a normalidade com um alto grau de confiança.

O teste significativo contra a normalidade significa que não devemos usar statistics teóricas normais neste caso? (outra dica: a resposta é não :))

Eu também recomendo o SnowsPenultimateNormalityTest no pacote TeachingDemos . A documentação da function é muito mais útil para você do que o teste em si. Leia-o cuidadosamente antes de usar o teste.

SnowsPenultimateNormalityTest certamente tem suas virtudes, mas você também pode querer olhar para o qqnorm .

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

Considere usar a function shapiro.test , que realiza o teste de normalidade de Shapiro-Wilks. Eu fui feliz com isso.

biblioteca (DnE)

x <-rnorm (1000,0,1)

is.norm (x, 10,0.05)

O teste de Anderson-Darling também é útil.

 library(nortest) ad.test(data) 

Quando você executa um teste, você já tem a probabilidade de rejeitar a hipótese nula quando é verdade.

Veja o próximo código 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) 

O gráfico mostra que, se você tem um tamanho de amostra pequeno ou grande, 5% das vezes você tem a chance de rejeitar a hipótese nula quando ela é verdadeira (um erro do tipo I)

Além dos diagramas qq e do teste de Shapiro-Wilk, os seguintes methods podem ser úteis.

Qualitativo:

  • histograma comparado ao normal
  • cdf em comparação com o normal
  • trama ggdensity
  • ggqqplot

Quantitativo

  • testes de normalidade do pacote nortest
  • testes de normalidade do pacote normtest

Os methods qualitativos podem ser produzidos usando o seguinte em 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) 

Uma palavra de caucanvas - não aplique cegamente testes. Ter uma sólida compreensão das statistics ajudará você a entender quando usar os testes e a importância das hipóteses no teste de hipóteses.