Usando a função mvrnorm da biblioteca MASS
do R, simule uma amostra de tamanho \(n =
20\) de uma distribuição normal trivariada, com vetor de médias
nulo e a seguinte matriz de covariância:
\[ X = \begin{pmatrix} 5 & 5 & 5 \\ 5 & 15 & 10 \\ 5 & 10 & 10 \end{pmatrix} \]
A. Aplique o teste de normalidade multivariada de Shapiro-Wilk à amostra simulada. A hipótese nula de normalidade multivariada foi ou não rejeitada ao nível de 5% de significância?
set.seed(123)
library(MASS)
library(mvShapiroTest)
Sigma <- matrix(c(5, 5, 5,
5, 15, 10,
5, 10, 10), nrow = 3, byrow = TRUE)
n <- 20
dados <- mvrnorm(n, mu = c(0, 0, 0), Sigma = Sigma)
print(dados)
## [,1] [,2] [,3]
## [1,] 0.02195241 3.4897823 0.4009528
## [2,] 0.24374035 1.1679466 0.3651576
## [3,] -2.99650442 -4.1693113 -6.3892085
## [4,] -2.67015573 -0.3713869 1.3455171
## [5,] -1.92498531 -0.3079708 0.3531939
## [6,] -4.23164697 -4.1059990 -7.1119545
## [7,] 0.64308360 -2.4306116 -1.2443903
## [8,] 2.62966300 4.7117358 3.4199892
## [9,] -0.94422907 3.4320583 2.0835057
## [10,] 2.45252398 0.3553763 1.9845516
## [11,] -1.63939496 -5.0876712 -3.1523805
## [12,] -0.96195921 -1.0080088 -1.2681047
## [13,] 0.55393936 -2.4151983 -0.7028250
## [14,] -0.02564120 -1.8975077 1.4394261
## [15,] 2.16731586 1.2793900 1.9272802
## [16,] -3.14681828 -7.9637189 -3.5143002
## [17,] 1.04745138 -1.8001584 -2.5689525
## [18,] 2.73027257 7.1097862 6.3380365
## [19,] -1.65095987 -2.3231778 -2.1493320
## [20,] 0.11794939 2.0660117 1.3776532
# Aplicar o teste de Shapiro-Wilk multivariado
teste <- mvShapiro.Test(dados)
print(teste)
##
## Generalized Shapiro-Wilk test for Multivariate Normality by
## Villasenor-Alva and Gonzalez-Estrada
##
## data: dados
## MVW = 0.94959, p-value = 0.3713
hist(dados, probability = TRUE, col = "lightblue", main = "Histograma com curva normal", xlab = "Valor")
curve(dnorm(x, mean = mean(dados), sd = sd(dados)),
col = "red", lwd = 2, add = TRUE)
set.seed(123)
n_simulacoes <- 1000
n <- 20
rejeicoes <- 0
for (i in 1:n_simulacoes) {
dados <- mvrnorm(n, mu = c(0, 0, 0), Sigma = Sigma)
teste <- mvShapiro.Test(dados)
if (teste$p.value < 0.05) {
rejeicoes <- rejeicoes + 1
}
}
taxa_rejeicao <- rejeicoes / n_simulacoes
print(taxa_rejeicao)
## [1] 0.056
- A pequena diferença (0.6%) pode ser atribuída à variabilidade amostral
- O teste não rejeita a normalidade com frequência maior que o esperado
e também não deixa de rejeitar quando deveria.
- Isso é importante porque, em amostras pequenas, muitos testes
multivariados podem ter baixo poder ou viés, mas o Shapiro-Wilk
multivariado mostrou-se robusto.
C. Repita os itens a) e b) para tamanhos de amostra n = 50, 100
e 500. Avalie as taxas de rejeição em cada
caso.
set.seed(2025)
sim2 <- function(n, n_simulacoes = 1000) {
rejeicoes <- 0
for (i in 1:n_simulacoes) {
dados <- mvrnorm(n, mu = c(0, 0, 0), Sigma = Sigma)
teste <- mvShapiro.Test(dados) # Transposta para formato p x n
if (teste$p.value < 0.05) {
rejeicoes <- rejeicoes + 1
}
}
taxa_rejeicao <- rejeicoes / n_simulacoes
return(taxa_rejeicao)
}
n_values <- c(50, 100, 500)
resultados <- sapply(n_values, sim2)
names(resultados) <- paste0("n = ", n_values)
print(resultados)
## n = 50 n = 100 n = 500
## 0.047 0.053 0.061
- Para n = 50 e n = 100, a taxa de erro está muito próxima de 5% (como
deveria).
- Para n = 500, o teste pode rejeitar um pouco mais (6.1%), mas ainda
dentro de um limite razoável.