Neste experimento, estudamos empiricamente a distribuição da estatística média amostral a partir de uma população que segue uma distribuição Normal \(\mathcal{N}(10, 2)\). Para isso, simulamos 1000 amostras para diferentes tamanhos \(n = 20, 50, 100, 200, 500\). Para cada amostra, calculamos a média e analisamos a distribuição dessas 1000 médias.
Como a população é Normal, a teoria nos garante que a distribuição da média amostral também será Normal, com:
\[ \bar{X} \sim \mathcal{N}\left(10, \frac{2}{n} \right) \]
set.seed(123)
mu <- 10
sigma2 <- 2
sigma <- sqrt(sigma2)
ns <- c(20, 50, 100, 200, 500)
B <- 1000
simular_medias <- function(n) {
replicate(B, mean(rnorm(n, mean = mu, sd = sigma)))
}
medias_df <- lapply(ns, function(n) {
data.frame(media = simular_medias(n), n = factor(n))
}) %>% bind_rows()
densidades_df <- lapply(ns, function(n_val) {
x_seq <- seq(
min(medias_df$media[medias_df$n == n_val]),
max(medias_df$media[medias_df$n == n_val]),
length.out = 100
)
data.frame(
n = factor(n_val),
x = x_seq,
dens = dnorm(x_seq, mean = mu, sd = sqrt(sigma2 / n_val))
)
}) %>% bind_rows()
ggplot(medias_df, aes(x = media)) +
geom_histogram(aes(y = after_stat(density)), bins = 30, fill = "lightblue", color = "black") +
geom_line(data = densidades_df, aes(x = x, y = dens), color = "red", linewidth = 1) +
geom_vline(xintercept = mu, linetype = "dashed", color = "darkgreen") +
facet_wrap(~n, scales = "free", labeller = label_both) +
labs(
title = "Distribuição das Médias Amostrais com Densidade Teórica",
x = "Média Amostral",
y = "Densidade"
) +
theme_minimal()
medias_df %>%
group_by(n) %>%
summarise(
Média = mean(media),
Desvio_Padrão = sd(media),
Assimetria = skewness(media),
Curtose = kurtosis(media)
)
## # A tibble: 5 × 5
## n Média Desvio_Padrão Assimetria Curtose
## <fct> <dbl> <dbl> <dbl> <dbl>
## 1 20 9.99 0.311 -0.0473 2.99
## 2 50 10.0 0.187 -0.0109 2.97
## 3 100 10.0 0.140 -0.0752 3.09
## 4 200 10.0 0.100 -0.0842 2.85
## 5 500 10.0 0.0627 0.108 2.91
medias_df %>%
group_by(n) %>%
summarise(p_valor_Shapiro = shapiro.test(media)$p.value)
## # A tibble: 5 × 2
## n p_valor_Shapiro
## <fct> <dbl>
## 1 20 0.381
## 2 50 0.976
## 3 100 0.568
## 4 200 0.443
## 5 500 0.457
medias_df %>%
group_by(n) %>%
summarise(p_valor_AD = ad.test(media)$p.value)
## # A tibble: 5 × 2
## n p_valor_AD
## <fct> <dbl>
## 1 20 0.964
## 2 50 0.956
## 3 100 0.353
## 4 200 0.918
## 5 500 0.551