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.
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.
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.
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
\(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.
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.
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)\).
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.
Patrick Royston (1982). An extension of Shapiro and Wilk’s W test for normality to large samples. Applied Statistics, 31, 115-124.
Patrick Royston (1982). Algorithm AS 181: The W test for Normality. Applied Statistics, 31, 176-180.
Patrick Royston (1995). Remark AS R94: A remark on Algorithm AS 181: The W test for normality. Applied Statistics, 44,547-551.
Z. W. Birnbaum and Fred H. Tingey (1951), One-sided confidence contours for probability distribution functions. The Annals of Mathematical Statistics, 22/4, 592-596.
William J. Conover (1971), Practical Nonparametric Statistics. New York: John Wiley & Sons. Pages 295-301 (one-sample Kolmogorov test), 309-314 (two-sample Smirnov test).
Durbin, J. (1973), Distribution theory for tests based on the sample distribution function. SIAM. George Marsaglia, Wai Wan Tsang and Jingbo Wang (2003), Evaluating Kolmogorov’s distribution. Journal of Statistical Software,8/18. http://www.jstatsoft.org/v08/i18/.
https://cran.r-project.org/web/packages/SuppDists/SuppDists.pdf