Teste de normalidade

A suposição de normalidade dos dados amostrais é uma condição exigida para a realização de muitas inferências válidas a respeito de parâmetros populacionais. Vários dos diferentes métodos de estimação e testes de hipóteses existentes foram formulados sob a suposição de que a amostra aleatória tenha sido extraída de uma população gaussiana.

Neste material vamos apresentar alguns testes que nos permitem verificar essa suposição. Também é importante salientar que além deles é fundamental observar a distribuição empírica dos dados por exemplo através do gráfico de densidade.

Será apresentados alguns exemplos resolvidos com o R. É fortemente sugerido a leitura das referências ao final deste matrial para melhor compreensão de cada teste apresentado.

Teste de Shapiro Wilk.

Aqui, para fins didáticos, vamos gerar uma amostra de tamanho 100 de uma variável aleatória \(X \sim N(\mu=1, \sigma^2=0.16)\). Neste caso a hipótese a ser testada é se os dados seguem uma distribuição gaussiana.

\(H_0:\) Os dados seguem uma distribuição gaussiana.

######### criando um vetor
set.seed(123399)
x <- rnorm(100,1,.4)

######### Teste de Shapiro Wilks

shapiro.test(x)

    Shapiro-Wilk normality test

data:  x
W = 0.99326, p-value = 0.9032

Segundo o resultado do teste, temos evidências para dizer que a amostra provém de uma distribuição gaussiana, o que já era de se esperar pois geramos a amostra utilizando a função qqnorm().

Agora vamos verificar o gráfico de densidade da amostra.

plot(density(x), ylab='Densidade', xlab='Amostra X', main='')

Realmente a amostra parece seguir uma distribuição gaussiana.

Teste Anderson-darling

Próximo teste a ser explorado é o de Anderson-darling. Para isso precisamos instalar no R o pacote nortest para usar a função ad.test(). Aqui vamos usar a mesma amostra do exercício anterior e será testada a mesma hipótese:

\(H_0:\) Os dados seguem uma distribuição gaussiana.

#install.packages('nortest',repos='http://cran-r.c3sl.ufpr.br/')
library(nortest)
ad.test(x)

    Anderson-Darling normality test

data:  x
A = 0.26261, p-value = 0.6959

Aqui também não rejeitamos a hipótese que os dados seguem uma distribuição gaussiana.

Teste Cramer-von Mises

O teste de Cramer-von Mises também necessita do pacote nortest para aplicar a função cvm.test() e novamente testamos:

\(H_0:\) Os dados seguem uma distribuição gaussiana.

cvm.test(x)

    Cramer-von Mises normality test

data:  x
W = 0.042458, p-value = 0.6324

Teste Lilliefors

\(H_0:\) Os dados seguem uma distribuição gaussiana. Utilizando a função lillie.test() do mesmo pacote.

lillie.test(x)

    Lilliefors (Kolmogorov-Smirnov) normality test

data:  x
D = 0.053479, p-value = 0.6869

E evidentemente para os testes de Lilliefors e Cramer-vos Mises, não rejeitamos a hipótese que os dados seguem uma distribuição gaussiana.

Teste de Kolmogorov-Smirnov

Este é um dos mais populares na Estatística. Ele tem o intuito de verificar se uma amostra tem aderência a uma determinada distribuição de probabilidade ou comparar duas distrições. A idéia por trás do teste é a comparação da função de distribuição empírica \(F(x)\) com uma função de ditribuição teórica, ou a comparação entre duas \(F(x)'s\) e verificar a distância entre as funções de distribuição.

Abaixo um exemplo comparando a mesma amostra aleatória anteior com a função de distribuição gaussiana.

  sd(x)
[1] 0.3977798
ks.test(x, "pnorm", 1, .16) 

    One-sample Kolmogorov-Smirnov test

data:  x
D = 0.23032, p-value = 4.934e-05
alternative hypothesis: two-sided

Aqui a hipótese testada é se a distribuição da variável aleatória \(X \sim N(\mu=1, \sigma^2=.4)\) Pelo resultado notamos que de fato \(X \sim N(\mu=1, \sigma^2=.4)\). Quanto menor for a estatística de teste \(D\), mais próxima da distribuição teórica assumida, está a distribuição empírica de \(X\). Neste caso \(D=\)0.2303247 .

Agora vamos comparar duas amostras e testar se ambas possuem distribuições iguais ou não. Para isso vamos gerar uma segunda amostra de mesmos tamanho de \(X\), \(Y \sim Gamma(\alpha = 1, \beta=4)\)

y <- rgamma(100,1, 4)

Além do teste Kolmogorov-Smirnov, vamos plotar o gráfico das duas distribuição e indicar a distância entre ambas. Este gráfico pode ser simplesmente chamado de gráfico \(KS\).

#===========
#Curva K-S
#===========
library(latticeExtra)
Loading required package: lattice
Loading required package: RColorBrewer
ks.cal <- function(x,lag){
  x <- sort(x); n <- length(x)
  X <- (1/n)*apply(outer(x, lag, function(z,w) z<=w), 2, sum)
  X
}



smir<-ks.test(x,y)
smir

    Two-sample Kolmogorov-Smirnov test

data:  x and y
D = 0.8, p-value < 2.2e-16
alternative hypothesis: two-sided
lag <- seq(min(x,y), max(x,y), l=length(unique(c(x,y))))
x.ks <- ks.cal(x, lag)
y.ks <- ks.cal(y, lag)

ks.max <- max(abs(x.ks-y.ks))
lagmax <- lag[which.max(abs(x.ks-y.ks))]
coomax <- which.max(abs(x.ks-y.ks))
abcmax <- c(x.ks[coomax], y.ks[coomax])

ecdfplot(~x+y,
         panel=function(x, ...){
           panel.ecdfplot(x, ...)
           panel.segments(lagmax, abcmax[1], lagmax, abcmax[2])
           panel.text(lagmax, min(abcmax)+ks.max/2, label=ks.max, pos=2, srt=18)
})

Notamos que pelo resultado do p-valor do teste, 0, rejeitamos a hipótese nula, ou seja, há evidências para dizer as duas distribuições são diferentes. Outro indicativo disso é o alto valor da estatística de teste \(D=\)0.8, que indica uma grande distância entre as duas distribuições, como podemos verificar na gráfico.

Verificação gráfica

Outra forma de vrificar se uma amostra segue uma distribuição gaussiana, é aatravés dos gráfico de envelope normal de probabilidade e seu envelope com intervalo de confiança simulado.

Podemos simplesmente fazer usando as funções qqnorm() e qqline() sem o envelope:

qqnorm(x)
qqline(x)

Mas também podemos fazer com o envelope simulado através da função qqPlot() do pacote car.

library(car)
qqPlot(x, dist='norm',envelope=.95)

Aplicando agora a função qqPlot() para a amostra \(Y\):

qqPlot(y, dist='norm',envelope=.95)

Notamos que para a amostra \(Y\), há vários pontos fora da banda do envelope simulado, indicando que há evidências que esta amostra não segue uma distribuição gaussiana, como já se esperava pois sabemos que \(Y \sim Gamma(\alpha=1, \beta=4)\).

Teste de homocedasticidade

Em análise de variância(ANOVA), há um pressuposto que deve ser atendido que é de os erros terem variância comum, ou seja, homocedasticidade. Isso implica que cada tratamento que se está sendo comparado pelo teste F, deve ter aproximadamente a mesma variância para que a ANOVA tenha validade. Quando este pressuposto não é atendido dizemos que as variâncias não são homogêneas, ou ainda, que existe heterocedasticidade.

A verificação deste pressuposto também pode ser verificado graficamente através do boxplot para os tratamentos vs resíduos. Se existir homocedasticidade espera-se que os boxplots sejam semelhantes.

Veja o seguinte exemplo, os dados abaixo são provenientes de um experimento em que se deseja verificar se há diferença entre as práticas parentais com relação a três grupos de crianças. O primeiro grupo são de crianças com síndrome de down, o segundo grupo são de crianças com síndrome de down em que os pais recebem orientção sobre prtáricas parentais para este grupo especial e o terciro grupo de crianças não possuem síndrome de down. Para medir as práticas parentais há um instrumento psicológico que gera um escore em que os resultados estão guardados na variável PP.

Primeiro carregamos os dados:

dados<-read.csv2('http://www.leg.ufpr.br/lib/exe/fetch.php/pessoais:total.csv', h=T)
str(dados)
'data.frame':   120 obs. of  27 variables:
 $ Grupo                   : int  1 1 1 1 1 1 1 1 1 1 ...
 $ SD                      : int  1 1 1 1 1 1 1 1 1 1 ...
 $ DI                      : int  0 0 0 0 0 0 0 0 0 0 ...
 $ Idade_da_crianca        : int  0 0 1 1 0 1 1 0 1 0 ...
 $ sexo                    : int  1 1 1 0 0 0 0 0 1 0 ...
 $ escola                  : int  1 1 1 1 1 1 1 1 1 1 ...
 $ ocupacao_da_mae         : int  1 1 1 3 1 3 1 3 1 1 ...
 $ ocupacao_da_mae_Trabalha: int  1 1 1 0 1 0 1 0 1 1 ...
 $ ocupacao_da_mae_Lar     : int  0 0 0 1 0 1 0 1 0 0 ...
 $ ocupacao_do_pai         : int  1 1 1 1 3 1 1 1 3 1 ...
 $ ocupacao_do_pai_Trabalha: int  1 1 1 1 0 1 1 1 0 1 ...
 $ ocupacao.do_pai_Lar     : int  0 0 0 0 1 0 0 0 1 0 ...
 $ idade_da_mae            : int  34 32 30 32 22 49 48 32 55 27 ...
 $ idade_do_pai            : int  36 36 31 47 25 47 50 50 59 27 ...
 $ situacao_conjugal       : int  3 1 1 3 4 2 1 1 1 1 ...
 $ casado                  : int  0 1 1 0 0 0 1 1 1 1 ...
 $ Numero_de_filhos        : int  2 1 2 1 1 2 2 3 5 2 ...
 $ Tipo_de_moradia         : int  1 0 1 1 1 1 1 1 1 1 ...
 $ Condicao_de_moradia     : int  1 1 1 1 2 1 1 1 1 3 ...
 $ Condicao_de_moradia.1   : int  1 1 1 1 2 1 1 1 1 3 ...
 $ Moradia_Propria         : int  1 1 1 1 0 1 1 1 1 0 ...
 $ Moradia_Alugada         : int  0 0 0 0 0 0 0 0 0 0 ...
 $ media_salarial          : int  5 5 2 2 2 2 6 6 2 2 ...
 $ PP                      : int  171 176 179 179 162 152 160 171 147 177 ...
 $ CP                      : int  171 197 175 201 164 183 203 179 188 208 ...
 $ PSI                     : int  132 124 80 128 107 101 94 103 105 130 ...
 $ FACES_IV                : int  201 200 220 227 222 219 205 233 211 226 ...
summary(factor(dados$Grupo))
 1  2  3 
45 41 34 

Agora vamos ajustar uma ANOVA:

mod<-aov(dados$PP~dados$Grupo)
summary(mod)
             Df Sum Sq Mean Sq F value Pr(>F)
dados$Grupo   1    262   261.8   1.006  0.318
Residuals   118  30709   260.2               

A análise de variância nos diz que não há diferença entre a média dos escores de práricas parentais entre os três grupo de crianças. Mas para que este resultados seja válido precisamo verificar alguns pressupostos tais como independência, normalidade, e homocedasticidade dos erros. Mas como aqui o foco é homocedasticidade, verificaremos apenas este último.

Como temos um número de crianças diferentes em cada grupo iremos usar o teste de Bartlett e de Cochran. Se houvesse número igual de crianças ou núemro de repetições iguais em cada tratamento, além o teste de Bartlett, poderíamos usar o teste de Hartley.

Lembrando que estamos testando a hipótese nula das variâncias serem iguais:

\[H_0: \sigma^2_1=\sigma^2_2=\sigma^2_3\]

Aqui vamos apresentar o boxplot e o teste de Bartlett:

boxplot(mod$res~dados$Grupo)

bartlett.test(mod$res~dados$Grupo)

    Bartlett test of homogeneity of variances

data:  mod$res by dados$Grupo
Bartlett's K-squared = 2.0255, df = 2, p-value = 0.3632

Notamos que o teste confirma o que o boxplot nos sugere, homogeneidade das variâncias.

Referências