# 1. Parâmetros fixos da simulação
p_valores <- c(0.01, 0.05, 0.1, 0.2, 0.5, 0.8, 0.95, 0.99)
n_valores <- c(10, 30, 50, 100, 500)
M <- 10000 # Número de simulações
confianca <- 0.95
z_critico <- qnorm(1 - (1 - confianca) / 2) # Aprox. 1.96
# Criar uma grade com todas as combinações de parâmetros (p, n)
param_grid <- expand.grid(p_true = p_valores, n = n_valores)
# Inicializar um data.frame para armazenar os resultados
resultados_finais <- data.frame()
# Mostrar início da simulação
print(paste("Iniciando Simulação: M =", M, "repetições para", nrow(param_grid), "cenários."))
## [1] "Iniciando Simulação: M = 10000 repetições para 40 cenários."
# Loop principal (passando por cada cenário p, n)
for (i in 1:nrow(param_grid)) {
p_true <- param_grid$p_true[i]
n <- param_grid$n[i]
# Vetores para armazenar os resultados das M simulações
cobertura_wald <- logical(M)
cobertura_arcsin <- logical(M)
cobertura_conserv <- logical(M)
largura_wald <- numeric(M)
largura_arcsin <- numeric(M)
largura_conserv <- numeric(M)
# Loop interno (M repetições)
for (j in 1:M) {
# 1. Gerar amostra Bernoulli(p)
x_soma <- rbinom(n = 1, size = n, prob = p_true)
# 2. Calcular p_hat
p_hat <- x_soma / n
# 3. Construir os três intervalos de confiança
# (a) Intervalo de Wald (Normal clássico)
se_wald <- sqrt(p_hat * (1 - p_hat) / n)
me_wald <- z_critico * se_wald
if (is.na(me_wald)) {
me_wald <- 0
}
wald_lim_inf <- p_hat - me_wald
wald_lim_sup <- p_hat + me_wald
# (b) Intervalo com Transformação Arcseno
p_hat_transf <- asin(sqrt(p_hat))
me_arcsin <- z_critico / (2 * sqrt(n))
transf_inf <- p_hat_transf - me_arcsin
transf_sup <- p_hat_transf + me_arcsin
transf_inf_cap <- max(0, transf_inf)
transf_sup_cap <- min(pi/2, transf_sup)
arcsin_lim_inf <- (sin(transf_inf_cap))^2
arcsin_lim_sup <- (sin(transf_sup_cap))^2
# (c) Intervalo Conservador
me_conserv <- z_critico / (2 * sqrt(n))
conserv_lim_inf <- p_hat - me_conserv
conserv_lim_sup <- p_hat + me_conserv
# --- Análise dos Resultados ---
# Garantir que os limites de Wald e Conservador fiquem em [0, 1]
wald_lim_inf_cap <- max(0, wald_lim_inf)
wald_lim_sup_cap <- min(1, wald_lim_sup)
conserv_lim_inf_cap <- max(0, conserv_lim_inf)
conserv_lim_sup_cap <- min(1, conserv_lim_sup)
# Calcular Larguras
largura_wald[j] <- wald_lim_sup_cap - wald_lim_inf_cap
largura_arcsin[j] <- arcsin_lim_sup - arcsin_lim_inf
largura_conserv[j] <- conserv_lim_sup_cap - conserv_lim_inf_cap
# Calcular Cobertura (Verificar se p_true está no intervalo)
cobertura_wald[j] <- (p_true >= wald_lim_inf_cap) & (p_true <= wald_lim_sup_cap)
cobertura_arcsin[j] <- (p_true >= arcsin_lim_inf) & (p_true <= arcsin_lim_sup)
cobertura_conserv[j] <- (p_true >= conserv_lim_inf_cap) & (p_true <= conserv_lim_sup_cap)
}
# Calcular métricas para o cenário (p, n)
cob_wald <- mean(cobertura_wald, na.rm = TRUE)
cob_arcsin <- mean(cobertura_arcsin, na.rm = TRUE)
cob_conserv <- mean(cobertura_conserv, na.rm = TRUE)
larg_wald <- mean(largura_wald, na.rm = TRUE)
larg_arcsin <- mean(largura_arcsin, na.rm = TRUE)
larg_conserv <- mean(largura_conserv, na.rm = TRUE)
# Armazenar resultados
resultados_cenario <- data.frame(
p_true = p_true,
n = n,
metodo = c("Wald", "Arcseno", "Conservador"),
cobertura = c(cob_wald, cob_arcsin, cob_conserv),
largura_media = c(larg_wald, larg_arcsin, larg_conserv),
vies_cobertura = c(cob_wald - confianca, cob_arcsin - confianca, cob_conserv - confianca)
)
resultados_finais <- rbind(resultados_finais, resultados_cenario)
# Imprimir progresso
print(paste("Cenário", i, "/", nrow(param_grid), ": (p=", p_true, ", n=", n, ") concluído."))
}
## [1] "Cenário 1 / 40 : (p= 0.01 , n= 10 ) concluído."
## [1] "Cenário 2 / 40 : (p= 0.05 , n= 10 ) concluído."
## [1] "Cenário 3 / 40 : (p= 0.1 , n= 10 ) concluído."
## [1] "Cenário 4 / 40 : (p= 0.2 , n= 10 ) concluído."
## [1] "Cenário 5 / 40 : (p= 0.5 , n= 10 ) concluído."
## [1] "Cenário 6 / 40 : (p= 0.8 , n= 10 ) concluído."
## [1] "Cenário 7 / 40 : (p= 0.95 , n= 10 ) concluído."
## [1] "Cenário 8 / 40 : (p= 0.99 , n= 10 ) concluído."
## [1] "Cenário 9 / 40 : (p= 0.01 , n= 30 ) concluído."
## [1] "Cenário 10 / 40 : (p= 0.05 , n= 30 ) concluído."
## [1] "Cenário 11 / 40 : (p= 0.1 , n= 30 ) concluído."
## [1] "Cenário 12 / 40 : (p= 0.2 , n= 30 ) concluído."
## [1] "Cenário 13 / 40 : (p= 0.5 , n= 30 ) concluído."
## [1] "Cenário 14 / 40 : (p= 0.8 , n= 30 ) concluído."
## [1] "Cenário 15 / 40 : (p= 0.95 , n= 30 ) concluído."
## [1] "Cenário 16 / 40 : (p= 0.99 , n= 30 ) concluído."
## [1] "Cenário 17 / 40 : (p= 0.01 , n= 50 ) concluído."
## [1] "Cenário 18 / 40 : (p= 0.05 , n= 50 ) concluído."
## [1] "Cenário 19 / 40 : (p= 0.1 , n= 50 ) concluído."
## [1] "Cenário 20 / 40 : (p= 0.2 , n= 50 ) concluído."
## [1] "Cenário 21 / 40 : (p= 0.5 , n= 50 ) concluído."
## [1] "Cenário 22 / 40 : (p= 0.8 , n= 50 ) concluído."
## [1] "Cenário 23 / 40 : (p= 0.95 , n= 50 ) concluído."
## [1] "Cenário 24 / 40 : (p= 0.99 , n= 50 ) concluído."
## [1] "Cenário 25 / 40 : (p= 0.01 , n= 100 ) concluído."
## [1] "Cenário 26 / 40 : (p= 0.05 , n= 100 ) concluído."
## [1] "Cenário 27 / 40 : (p= 0.1 , n= 100 ) concluído."
## [1] "Cenário 28 / 40 : (p= 0.2 , n= 100 ) concluído."
## [1] "Cenário 29 / 40 : (p= 0.5 , n= 100 ) concluído."
## [1] "Cenário 30 / 40 : (p= 0.8 , n= 100 ) concluído."
## [1] "Cenário 31 / 40 : (p= 0.95 , n= 100 ) concluído."
## [1] "Cenário 32 / 40 : (p= 0.99 , n= 100 ) concluído."
## [1] "Cenário 33 / 40 : (p= 0.01 , n= 500 ) concluído."
## [1] "Cenário 34 / 40 : (p= 0.05 , n= 500 ) concluído."
## [1] "Cenário 35 / 40 : (p= 0.1 , n= 500 ) concluído."
## [1] "Cenário 36 / 40 : (p= 0.2 , n= 500 ) concluído."
## [1] "Cenário 37 / 40 : (p= 0.5 , n= 500 ) concluído."
## [1] "Cenário 38 / 40 : (p= 0.8 , n= 500 ) concluído."
## [1] "Cenário 39 / 40 : (p= 0.95 , n= 500 ) concluído."
## [1] "Cenário 40 / 40 : (p= 0.99 , n= 500 ) concluído."
print("Simulação Concluída. Exibindo resultados:")
## [1] "Simulação Concluída. Exibindo resultados:"
print(resultados_finais, row.names = FALSE)
## p_true n metodo cobertura largura_media vies_cobertura
## 0.01 10 Wald 0.0968 0.02838357 -0.8532
## 0.01 10 Arcseno 0.9959 0.11824418 0.0459
## 0.01 10 Conservador 1.0000 0.32000752 0.0500
## 0.05 10 Wald 0.3959 0.12815316 -0.5541
## 0.05 10 Arcseno 0.9891 0.20471817 0.0391
## 0.05 10 Conservador 0.9994 0.35894345 0.0494
## 0.10 10 Wald 0.6451 0.23685851 -0.3049
## 0.10 10 Arcseno 0.6340 0.29438013 -0.3160
## 0.10 10 Conservador 0.9979 0.40815816 0.0479
## 0.20 10 Wald 0.8870 0.40064946 -0.0630
## 0.20 10 Arcseno 0.8588 0.42053761 -0.0912
## 0.20 10 Conservador 0.9940 0.49531522 0.0440
## 0.50 10 Wald 0.8830 0.57813291 -0.0670
## 0.50 10 Arcseno 0.8830 0.54790662 -0.0670
## 0.50 10 Conservador 0.9777 0.60211694 0.0277
## 0.80 10 Wald 0.8870 0.40132267 -0.0630
## 0.80 10 Arcseno 0.8599 0.42091691 -0.0901
## 0.80 10 Conservador 0.9944 0.49587907 0.0444
## 0.95 10 Wald 0.3998 0.12991103 -0.5502
## 0.95 10 Arcseno 0.9878 0.20618117 0.0378
## 0.95 10 Conservador 0.9989 0.35971840 0.0489
## 0.99 10 Wald 0.0967 0.02842798 -0.8533
## 0.99 10 Arcseno 0.9957 0.11827418 0.0457
## 0.99 10 Conservador 1.0000 0.32003752 0.0500
## 0.01 30 Wald 0.2579 0.02747552 -0.6921
## 0.01 30 Arcseno 0.9969 0.05785074 0.0469
## 0.01 30 Conservador 1.0000 0.18884941 0.0500
## 0.05 30 Wald 0.7839 0.11561014 -0.1661
## 0.05 30 Arcseno 0.7698 0.13673478 -0.1802
## 0.05 30 Conservador 0.9996 0.22921196 0.0496
## 0.10 30 Wald 0.8112 0.19014767 -0.1388
## 0.10 30 Arcseno 0.9292 0.19846842 -0.0208
## 0.10 30 Conservador 0.9978 0.27620381 0.0478
## 0.20 30 Wald 0.9496 0.27666003 -0.0004
## 0.20 30 Arcseno 0.9335 0.27238070 -0.0165
## 0.20 30 Conservador 0.9893 0.33822332 0.0393
## 0.50 30 Wald 0.9581 0.35182391 0.0081
## 0.50 30 Arcseno 0.9581 0.34436340 0.0081
## 0.50 30 Conservador 0.9581 0.35783760 0.0081
## 0.80 30 Wald 0.9444 0.27597526 -0.0056
## 0.80 30 Arcseno 0.9299 0.27179915 -0.0201
## 0.80 30 Conservador 0.9897 0.33780766 0.0397
## 0.95 30 Wald 0.7779 0.11467933 -0.1721
## 0.95 30 Arcseno 0.7653 0.13589504 -0.1847
## 0.95 30 Conservador 0.9995 0.22880073 0.0495
## 0.99 30 Wald 0.2588 0.02748469 -0.6912
## 0.99 30 Arcseno 0.9965 0.05786628 0.0465
## 0.99 30 Conservador 1.0000 0.18883608 0.0500
## 0.01 50 Wald 0.4040 0.02761236 -0.5460
## 0.01 50 Arcseno 0.9858 0.04558846 0.0358
## 0.01 50 Conservador 1.0000 0.14888238 0.0500
## 0.05 50 Wald 0.9237 0.10297958 -0.0263
## 0.05 50 Arcseno 0.9139 0.11180766 -0.0361
## 0.05 50 Conservador 1.0000 0.18871420 0.0500
## 0.10 50 Wald 0.8797 0.15839572 -0.0703
## 0.10 50 Arcseno 0.9431 0.15894461 -0.0069
## 0.10 50 Conservador 0.9977 0.23379699 0.0477
## 0.20 50 Wald 0.9369 0.21771879 -0.0131
## 0.20 50 Arcseno 0.9369 0.21498518 -0.0131
## 0.20 50 Conservador 0.9824 0.27359399 0.0324
## 0.50 50 Wald 0.9348 0.27435228 -0.0152
## 0.50 50 Arcseno 0.9348 0.27085271 -0.0152
## 0.50 50 Conservador 0.9348 0.27718076 -0.0152
## 0.80 50 Wald 0.9351 0.21795456 -0.0149
## 0.80 50 Arcseno 0.9351 0.21522646 -0.0149
## 0.80 50 Conservador 0.9799 0.27360190 0.0299
## 0.95 50 Wald 0.9219 0.10328661 -0.0281
## 0.95 50 Arcseno 0.9147 0.11206035 -0.0353
## 0.95 50 Conservador 0.9997 0.18883259 0.0497
## 0.99 50 Wald 0.3913 0.02674090 -0.5587
## 0.99 50 Arcseno 0.9858 0.04475009 0.0358
## 0.99 50 Conservador 1.0000 0.14855838 0.0500
## 0.01 100 Wald 0.6277 0.02497367 -0.3223
## 0.01 100 Arcseno 0.6090 0.03335250 -0.3410
## 0.01 100 Conservador 1.0000 0.10803320 0.0500
## 0.05 100 Wald 0.8793 0.08155791 -0.0707
## 0.05 100 Arcseno 0.9556 0.08247355 0.0056
## 0.05 100 Conservador 0.9997 0.14786995 0.0497
## 0.10 100 Wald 0.9360 0.11609186 -0.0140
## 0.10 100 Arcseno 0.9553 0.11539031 0.0053
## 0.10 100 Conservador 0.9981 0.18517120 0.0481
## 0.20 100 Wald 0.9336 0.15545273 -0.0164
## 0.20 100 Arcseno 0.9566 0.15445936 0.0066
## 0.20 100 Conservador 0.9841 0.19596700 0.0341
## 0.50 100 Wald 0.9441 0.19502722 -0.0059
## 0.50 100 Arcseno 0.9441 0.19378097 -0.0059
## 0.50 100 Conservador 0.9441 0.19599640 -0.0059
## 0.80 100 Wald 0.9326 0.15563400 -0.0174
## 0.80 100 Arcseno 0.9550 0.15463947 0.0050
## 0.80 100 Conservador 0.9825 0.19596620 0.0325
## 0.95 100 Wald 0.8777 0.08149662 -0.0723
## 0.95 100 Arcseno 0.9527 0.08239477 0.0027
## 0.95 100 Conservador 1.0000 0.14781455 0.0500
## 0.99 100 Wald 0.6338 0.02494244 -0.3162
## 0.99 100 Arcseno 0.6153 0.03335770 -0.3347
## 0.99 100 Conservador 1.0000 0.10797220 0.0500
## 0.01 500 Wald 0.8668 0.01653972 -0.0832
## 0.01 500 Arcseno 0.9455 0.01683817 -0.0045
## 0.01 500 Conservador 1.0000 0.05373973 0.0500
## 0.05 500 Wald 0.9297 0.03796383 -0.0203
## 0.05 500 Arcseno 0.9449 0.03791523 -0.0051
## 0.05 500 Conservador 0.9998 0.08610956 0.0498
## 0.10 500 Wald 0.9454 0.05242446 -0.0046
## 0.10 500 Arcseno 0.9492 0.05235735 -0.0008
## 0.10 500 Conservador 0.9989 0.08765225 0.0489
## 0.20 500 Wald 0.9484 0.06998373 -0.0016
## 0.20 500 Arcseno 0.9484 0.06989415 -0.0016
## 0.20 500 Conservador 0.9842 0.08765225 0.0342
## 0.50 500 Wald 0.9445 0.08756343 -0.0055
## 0.50 500 Arcseno 0.9445 0.08745135 -0.0055
## 0.50 500 Conservador 0.9445 0.08765225 -0.0055
## 0.80 500 Wald 0.9531 0.07001767 0.0031
## 0.80 500 Arcseno 0.9531 0.06992805 0.0031
## 0.80 500 Conservador 0.9843 0.08765225 0.0343
## 0.95 500 Wald 0.9295 0.03799800 -0.0205
## 0.95 500 Arcseno 0.9453 0.03794936 -0.0047
## 0.95 500 Conservador 1.0000 0.08616806 0.0500
## 0.99 500 Wald 0.8745 0.01667789 -0.0755
## 0.99 500 Arcseno 0.9451 0.01696329 -0.0049
## 0.99 500 Conservador 1.0000 0.05386993 0.0500
# --- GRÁFICO 1: COBERTURA EMPÍRICA ---
print("Gerando Gráfico 1: Cobertura Empírica...")
## [1] "Gerando Gráfico 1: Cobertura Empírica..."
# 1. Definir parâmetros do gráfico
cores <- c("red", "blue", "darkgreen")
pchs <- c(1, 2, 3) # Tipos de ponto (círculo, triângulo, +)
metodos <- c("Wald", "Arcseno", "Conservador")
# 2. Configurar a janela de plotagem (3 linhas, 2 colunas)
par(mfrow = c(3, 2), mar = c(4, 4, 2, 1))
# 3. Loop para criar um gráfico para cada 'n'
for (n_val in n_valores) {
# Filtrar dados para o 'n' atual
dados_n <- subset(resultados_finais, n == n_val)
# Filtrar dados por método
dados_wald <- subset(dados_n, metodo == "Wald")
dados_arcsin <- subset(dados_n, metodo == "Arcseno")
dados_conserv <- subset(dados_n, metodo == "Conservador")
# 4. Criar o primeiro gráfico (Wald)
plot(dados_wald$p_true, dados_wald$cobertura,
type = "b", # "b" = both (pontos e linhas)
col = cores[1],
pch = pchs[1],
xlab = "p (Proporção Real)",
ylab = "Cobertura Empírica",
main = paste("n =", n_val),
ylim = c(0.80, 1.0), # Fixar o eixo Y (0.8 a 1.0)
xlim = c(0, 1)
)
# 5. Adicionar a linha de referência de 95%
abline(h = confianca, lty = "dashed", col = "gray40")
# 6. Adicionar as linhas dos outros métodos
lines(dados_arcsin$p_true, dados_arcsin$cobertura,
type = "b", col = cores[2], pch = pchs[2])
lines(dados_conserv$p_true, dados_conserv$cobertura,
type = "b", col = cores[3], pch = pchs[3])
}
# 7. Criar um "gráfico" vazio no 6º espaço para a legenda
plot(0, 0, type = "n", axes = FALSE, xlab = "", ylab = "")
legend("center",
legend = metodos,
col = cores,
pch = pchs,
lty = 1, # Tipo de linha
bty = "n", # Sem caixa ao redor da legenda
cex = 1.2
)
# --- GRÁFICO 2: LARGURA MÉDIA DO IC ---
print("Gerando Gráfico 2: Largura Média...")
## [1] "Gerando Gráfico 2: Largura Média..."
# 1. Configurar a janela de plotagem (3 linhas, 2 colunas)
par(mfrow = c(3, 2), mar = c(4, 4, 2, 1))
# 2. Loop para criar um gráfico para cada 'n'
for (n_val in n_valores) {
# Filtrar dados
dados_n <- subset(resultados_finais, n == n_val)
dados_wald <- subset(dados_n, metodo == "Wald")
dados_arcsin <- subset(dados_n, metodo == "Arcseno")
dados_conserv <- subset(dados_n, metodo == "Conservador")
# 3. Criar o primeiro gráfico (Wald)
plot(dados_wald$p_true, dados_wald$largura_media,
type = "b",
col = cores[1],
pch = pchs[1],
xlab = "p (Proporção Real)",
ylab = "Largura Média do IC",
main = paste("n =", n_val),
ylim = c(0, max(dados_n$largura_media) * 1.1),
xlim = c(0, 1)
)
# 4. Adicionar as linhas dos outros métodos
lines(dados_arcsin$p_true, dados_arcsin$largura_media,
type = "b", col = cores[2], pch = pchs[2])
lines(dados_conserv$p_true, dados_conserv$largura_media,
type = "b", col = cores[3], pch = pchs[3])
}
# 5. Criar a legenda no 6º espaço
plot(0, 0, type = "n", axes = FALSE, xlab = "", ylab = "")
legend("center",
legend = metodos,
col = cores,
pch = pchs,
lty = 1,
bty = "n",
cex = 1.2
)
# 6. Resetar a janela de plotagem para o padrão (1x1)
par(mfrow = c(1, 1))
print("Gráficos concluídos.")
## [1] "Gráficos concluídos."
O método de Wald (clássico) falha em amostras pequenas ou quando a proporção é perto de 0 ou 1. O método Conservador sempre funciona, mas cria intervalos muito largos e imprecisos. O método Arcseno foi o mais robusto, oferecendo a melhor combinação de precisão e confiança em todos os cenários.