6 min read

Testando normalidade multivariadas

Em diversas análises de dados quantitativos multivariados existe a premissa de que a distribuição dos dados segue uma normal multiviariada. Outras abordagens, mesmo não exigindo, são beneficiadas quando os dados são multinormais ou pelo menos, não assimétricos (distribuições com caudas longas).

Abaixo descrevo brevemente algumas formas de se testar e verificar graficamente a normalidade multivariada. Vale a pena ver o roteiro de deteção de valores extremos que irá ajudar a entender melhor os dados, já que muitas vezes a presença de outliers multivariados é responsável pela “não-normalidade” dos dados.

Nesse roteiro utilizarei principalmente o pacote MVN.

Testando normalidade em cada variável separadamente

Geralmente, a primeira inspeção dos dados é observar gráficos e testes de normalidade para cada variável separadamente.

Vamos usar os dados swiss do pacote datasets1.

O primeiro gráfico são os histogramas de frequência de cada variável. As curvas em vermelho indicam uma suposta distribuição normal ao qual os dados se ajustariam.

library(MVN)

uniPlot(swiss, "histogram")

Boxplots também ajudam a observar a distribuição dos dados e possíveis valores extremos (outliers).

uniPlot(swiss, "box")

Mas talvez o gráfico mais importante para observar normalidade é o gráfico quantil-quantil (qqplot).

uniPlot(swiss, "qqplot")

No qqplot, variáveis que seguem uma distribuição normal deveriam manter-se sobre a linha reta desenhada no gráfico.

Com todos estes gráficos, vemos que a variável Catholic está bem distante de uma normal pois tem uma distribuição muito achatada (“kurtosis”), e que Education tem uma cauda muito longa tornando a distribuição assimétrica (“skewness”).

Agora, vamos olhar os testes de normalidade de Shapiro-Wilk, que é um dos mais recomendáveis (P. Legendre and Legendre (2012)).

uniteste <- uniNorm(swiss)
uniteste$`Shapiro-Wilk's Normality Test`
##           Variable Statistic   p-value Normality
## 1    Fertility        0.9731    0.3449    YES   
## 2   Agriculture       0.9664    0.1930    YES   
## 3   Examination       0.9696    0.2563    YES   
## 4    Education        0.7482    0.0000    NO    
## 5     Catholic        0.7463    0.0000    NO    
## 6 Infant.Mortality    0.9776    0.4978    YES

Confirmando as observações gráficas, as duas variáveis identificadas como distantes da distribuição normal são Catholic e Education.

Entretanto, mostrar normalidade separadamente em cada variável não garante que haja normalidade multivariada quando consideramos todas as variáveis ao mesmo tempo. Se queremos usar os dados em análises multivariadas, precisamos testar a normalidade multivariada com todas as variáveis conjuntamente.

Normalidade multivariada

Existem diferentes testes para normalidade multivariada, e aqui vamos analisar 3 destes que são recomendáveis e disponíveis no pacote MVA. Para detalhes de como são calculados estes testes veja a publicação do pacote.

Teste de Mardia

É um teste baseado nas extensões multivariadas para assimetria (skewness) e curtose (“achatamento”, kurtosis) e foi recomendado por Shipley (2004) no contexto de análies de modelos de equações estruturais.

Usando a função mardiaTest, temos os resultados para a assimetria multivariada (primeiro conjunto de resultados), para a assimetria corrigida para pequeno tamanho amostral (último cojunto de dados) e para o achatamente (curtose). Aparentemente, o que mais “atrapalha” a multinormalidade é a assimetria.

library(MVN)
mardiaTest(swiss)
##    Mardia's Multivariate Normality Test 
## --------------------------------------- 
##    data : swiss 
## 
##    g1p            : 13.73383 
##    chi.skew       : 107.5817 
##    p.value.skew   : 4.165067e-05 
## 
##    g2p            : 49.6851 
##    z.kurtosis     : 0.5895342 
##    p.value.kurt   : 0.555503 
## 
##    chi.small.skew : 116.5295 
##    p.value.small  : 3.842232e-06 
## 
##    Result          : Data are not multivariate normal. 
## ---------------------------------------

Nos testes univariados vimos que Education era a variável com maior assimetria na distribuição. E se transformarmos apenas esta variável em seu log?

mardiaTest(cbind(swiss[,-4], log(swiss[,4])))
##    Mardia's Multivariate Normality Test 
## --------------------------------------- 
##    data : cbind(swiss[, -4], log(swiss[, 4])) 
## 
##    g1p            : 9.776641 
##    chi.skew       : 76.58368 
##    p.value.skew   : 0.03523741 
## 
##    g2p            : 45.78532 
##    z.kurtosis     : -0.7748081 
##    p.value.kurt   : 0.438453 
## 
##    chi.small.skew : 82.95331 
##    p.value.small  : 0.01113958 
## 
##    Result          : Data are not multivariate normal. 
## ---------------------------------------

Continuamos com assimetria multivariada!

Aparentemente não é só Education que está deixando os dados “não multinormais”. É preciso entender melhor a natureza dos dados e possíveis transformações para garantir a multinormalidade do conjunto de dados.

Apenas como exercício, vamos remover Education e Catholic para ver se estas variável são as “vilãs” da multinormalidade.

mardiaTest(swiss[,-c(4:5)])
##    Mardia's Multivariate Normality Test 
## --------------------------------------- 
##    data : swiss[, -c(4:5)] 
## 
##    g1p            : 3.110959 
##    chi.skew       : 24.36918 
##    p.value.skew   : 0.2266377 
## 
##    g2p            : 24.54781 
##    z.kurtosis     : 0.2710368 
##    p.value.kurt   : 0.7863627 
## 
##    chi.small.skew : 26.58939 
##    p.value.small  : 0.1472164 
## 
##    Result         : Data are multivariate normal. 
## ---------------------------------------

Bingo!

Teste de Henze-Zirklers

Este teste está baseado na distância de Mahalanobis entre cada observação e o centróide da distribuição e também na distância de Mahalanobis entre as observações (veja esse roteiro para mais detalhes).

hzTest(swiss)
##   Henze-Zirkler's Multivariate Normality Test 
## --------------------------------------------- 
##   data : swiss 
## 
##   HZ      : 1.206095 
##   p-value : 1.701432e-07 
## 
##   Result  : Data are not multivariate normal. 
## ---------------------------------------------

O resultado deste teste está de acordo com o resultado do teste de Mardia. Vejamos no exemplo em que excluímos as variáveis “problemáticas”.

hzTest(swiss[,-c(4:5)])
##   Henze-Zirkler's Multivariate Normality Test 
## --------------------------------------------- 
##   data : swiss[, -c(4:5)] 
## 
##   HZ      : 0.9210898 
##   p-value : 0.07180992 
## 
##   Result  : Data are multivariate normal. 
## ---------------------------------------------

Teste de Royston

O teste de Royston baseia-se na estatística de Shapiro-Wilk2 para testar a normalidade multivariada.

roystonTest(swiss)
##   Royston's Multivariate Normality Test 
## --------------------------------------------- 
##   data : swiss 
## 
##   H       : 44.76704 
##   p-value : 6.97814e-09 
## 
##   Result  : Data are not multivariate normal. 
## ---------------------------------------------
roystonTest(swiss[,-c(4:5)])
##   Royston's Multivariate Normality Test 
## --------------------------------------------- 
##   data : swiss[, -c(4:5)] 
## 
##   H       : 4.006097 
##   p-value : 0.2813429 
## 
##   Result  : Data are multivariate normal. 
## ---------------------------------------------

Conclusão

Em nosso exemplo, todos os 3 diferentes testes de normalidade multivariada convergiram em seus resultados, o que significa maior confiança nos resultados. Mas tão importante quanto fazer os testes é fazer o gráfico qqplot para a normalidade multivariada. Nas funções de testes usadas acima, temos a opção de visualização gráfica do qqplot com o argumento qqplot=TRUE.

#podemos usar qualquer uma das funções de teste para fazer o qqplot
hzTest(swiss, qqplot=T)
##   Henze-Zirkler's Multivariate Normality Test 
## --------------------------------------------- 
##   data : swiss 
## 
##   HZ      : 1.206095 
##   p-value : 1.701432e-07 
## 
##   Result  : Data are not multivariate normal. 
## ---------------------------------------------

Observando o plot, podemos supor que possam existir dados extremos que estejam levando à distribuição multivariada não se conformar com a normalidade, portanto, também é importante verificar nos dados os possíveis outliers multivariados na tentativa de entender melhor os dados em mãos para fazer melhores escolhas de análises.

Referências

Legendre, P, and L Legendre. 2012. Numerical Ecology 3rd. 3rd ed.

Shipley, Bill. 2004. Cause and Correlation in Biology: A User ’ S Guide to Path Analysis, Structural Equations and Causal Inference. Vol. 20. 2001.


  1. que não precisa ser carregado porque já vem junto como R base.

  2. ou Shapiro-Francia dependendo do valor de curtose.