rm(list = ls())
gc()Projeto -Estatística Computacional
self-contained-math: true embed-resources: true
1. Pacotes utilizados
2. Criando as funções cdf e pdf
As funções de distribuição acumulada (cdf) e a densidade de probabilidade (pdf) da distribuição Exponentiated Logarithmic Generated (ELG) foram calculada tomando como base a distribuição Weibull.
# Função de densidade ELG-Weibull normalizada
elg_pdf_normalized <- function(x, a, b, c, beta, alpha) {
densidade <- elg_pdf(x, a, b, c, beta, alpha) # Obter a densidade original
# Verifica se x está no intervalo [0, 1], caso contrário retorna 0
densidade[x < 0 | x > 1] <- 0
# Normalizando
integral_value <- integrate(
f = function(x) elg_pdf(x, a, b, c, beta, alpha),
lower = 0,
upper = 1
)$value
# Garantir que a densidade seja normalizada
densidade / integral_value
}
# Verificando a integral da densidade normalizada
result_normalized <- integrate(
f = function(x) elg_pdf_normalized(x, a = 0.01, b = 1, c = 1, beta = 1.7, alpha = 2.4),
lower = 0,
upper = 1
)
# Resultado da integração da densidade normalizada
print(result_normalized) # Deve mostrar o valor e a estimativa de erro1 with absolute error < 1e-04
A log-verossimilhança da ELG para um conjunto de dados x foi calculada utilizando a densidade da ELG-Weibull e retornando a soma dos logaritmos, penalizando densidades inválidas.
# Função log-verossimilhança
log_lik <- function(x, a, b, c, beta, alpha) {
densidades <- elg_pdf_normalized(x, a = a, b = b, c = c, beta = beta, alpha = alpha)
# Verifica se as densidades são finitas e positivas antes de calcular o log
if (any(!is.finite(densidades) | densidades <= 0)) {
return(-Inf) # Retorna -Inf se houver problemas
}
return(sum(log(densidades))) # Retorna a soma dos logs das densidades
}3. Simulação de Monte-Carlo para ELG
Foi executado uma simulação de Monte Carlo para estimar os parâmetros e calcula as médias das estimativas e o viés.
# Função para simulação de Monte-Carlo e estimação
simula_mc <- function(n, a_true, b_true, c_true, beta_true, alpha_true, iteracoes = 100) {
estimativas <- matrix(NA, nrow = iteracoes, ncol = 5) # Ajustado para 5 parâmetros
for (i in 1:iteracoes) {
# Gerando dados a partir da distribuição ELG-Weibull
dados <- runif(n) # Gerar dados uniformemente distribuídos entre 0 e 1
elg_data <- elg_pdf_normalized(dados, a = a_true, b = b_true, c = c_true, beta = beta_true, alpha = alpha_true)
# Estimando os parâmetros pelo método NLM
estimacao_nlm <- nlm(
f = function(parametros) -log_lik(dados, a = parametros[1], b = parametros[2], c = parametros[3], beta = parametros[4], alpha = parametros[5]),
p = c(0.01, 1, 1, 1.7, 2.4), # Chute inicial para a, b, c, beta e alpha
hessian = TRUE
)
# Armazenando os resultados das estimativas
estimativas[i, ] <- estimacao_nlm$estimate
}
# Calculando a média das estimativas e o viés
media_estimativas <- colMeans(estimativas, na.rm = TRUE)
vies <- media_estimativas - c(a_true, b_true, c_true, beta_true, alpha_true)
return(list(media_estimativas = media_estimativas, vies = vies))
}
# Exemplo de uso da função simula_mc
set.seed(123) # Para reprodutibilidade
resultados <- simula_mc(n = 10000, a_true = 0.05, b_true = 1.5, c_true = 1.5, beta_true = 2, alpha_true = 3, iteracoes = 100)
print(resultados)$media_estimativas
[1] 0.009999999 0.999999996 1.005873440 1.699999995 2.399999992
$vies
[1] -0.0400000 -0.5000000 -0.4941266 -0.3000000 -0.6000000
4. Correção de Viés via Bootstrap e novas simulações
Para realizar a correção de viés para as estimativas dos parâmetros foi utilizado o método bootstrap e feito uma nova simulação para diferentes tamanhos de amostra.
library(dplyr)
library(knitr)
# Função para estimar parâmetros ELG (exemplo fictício)
estimar_parametros_ELG <- function(dados) {
# Aqui você deve implementar a lógica para estimar os parâmetros a, b, c, beta, alpha
# Exemplo fictício:
a_est <- mean(dados) # Estimativa para 'a'
b_est <- sd(dados) # Estimativa para 'b'
c_est <- 1.5 # Estimativa fictícia
beta_est <- 2 # Estimativa fictícia
alpha_est <- 3 # Estimativa fictícia
return(c(a_est, b_est, c_est, beta_est, alpha_est))
}
# Função para correção de viés usando bootstrap
bias_boot <- function(B, sample_true, kicks) {
# Inicializa uma matriz para armazenar as estimativas do bootstrap
bootstrap_estimativas <- matrix(NA, nrow = B, ncol = length(kicks))
for (b in 1:B) {
# Gera uma amostra bootstrap a partir da amostra original
sample_boot <- sample(sample_true, size = length(sample_true), replace = TRUE)
# Estima os parâmetros para a amostra bootstrap
bootstrap_estimativas[b, ] <- estimar_parametros_ELG(sample_boot)
}
# Calcula o viés como a diferença média entre as estimativas bootstrap e as estimativas iniciais
bias <- colMeans(bootstrap_estimativas, na.rm = TRUE) - kicks
# Calcula os intervalos de confiança percentis
ic_percentil <- apply(bootstrap_estimativas, 2, quantile, probs = c(0.025, 0.975), na.rm = TRUE)
# Retorna uma lista com os vieses e os intervalos de confiança percentis
return(list(bias = bias, ic_percentil = ic_percentil))
}
# Definição dos tamanhos de amostra a serem simulados
tamanhos_amostra <- c(25, 50, 250, 500, 1500)
# Inicializa lista para armazenar resultados
resultados <- list()
# Loop para realizar as simulações para cada tamanho de amostra
for (n in tamanhos_amostra) {
# Simula uma amostra verdadeira a partir da distribuição Weibull
sample_true <- rweibull(n, scale = 1, shape = 1)
# Chute inicial para os parâmetros
kicks <- c(0.05, 1.5, 1.5, 2, 3)
# Estimativas reais de máxima verossimilhança
estimativas_reais <- estimar_parametros_ELG(sample_true)
# Realiza a correção de viés usando bootstrap
resultados_bootstrap <- bias_boot(B = 1000, sample_true = sample_true, kicks = kicks)
# Armazena os resultados em uma lista
resultados[[as.character(n)]] <- list(
estimativas_reais = estimativas_reais,
bias = resultados_bootstrap$bias,
ic_percentil = resultados_bootstrap$ic_percentil
)
}
# Cria uma tabela para armazenar os resultados
tabela_resumo <- tibble(
n = integer(),
parametro = character(),
media_estimativa = numeric(),
media_estimativa_correcao = numeric(),
porcentagem_cobertura = numeric(),
media_amplitude = numeric()
)
# Preenche a tabela com os resultados
for (n in tamanhos_amostra) {
estimativas_reais <- resultados[[as.character(n)]]$estimativas_reais
bias <- resultados[[as.character(n)]]$bias
ic_percentil <- resultados[[as.character(n)]]$ic_percentil
for (i in 1:length(estimativas_reais)) {
media_estimativa_correcao <- estimativas_reais[i] - bias[i]
# Cálculo da cobertura
ic_lower <- ic_percentil[1, i]
ic_upper <- ic_percentil[2, i]
porcentagem_cobertura <- as.numeric(ic_lower <= estimativas_reais[i] && estimativas_reais[i] <= ic_upper) * 100
# Cálculo da amplitude
amplitude <- ic_upper - ic_lower
# Adiciona os resultados à tabela
tabela_resumo <- tabela_resumo %>%
add_row(n = n,
parametro = c("a", "b", "c", "beta", "alpha")[i],
media_estimativa = estimativas_reais[i],
media_estimativa_correcao = media_estimativa_correcao,
porcentagem_cobertura = porcentagem_cobertura,
media_amplitude = amplitude)
}
}
# Exibir a tabela resumo
print(kable(tabela_resumo, digits = 3, format = "pipe", col.names = c("Amostra (n)", "Parâmetro", "Média Estimativa", "Média Estimativa Correção", "Porcentagem Cobertura", "Média Amplitude")))
| Amostra (n)|Parâmetro | Média Estimativa| Média Estimativa Correção| Porcentagem Cobertura| Média Amplitude|
|-----------:|:---------|----------------:|-------------------------:|---------------------:|---------------:|
| 25|a | 0.718| 0.057| 100| 0.505|
| 25|b | 0.705| 1.538| 100| 0.589|
| 25|c | 1.500| 1.500| 100| 0.000|
| 25|beta | 2.000| 2.000| 100| 0.000|
| 25|alpha | 3.000| 3.000| 100| 0.000|
| 50|a | 0.755| 0.049| 100| 0.322|
| 50|b | 0.568| 1.507| 100| 0.284|
| 50|c | 1.500| 1.500| 100| 0.000|
| 50|beta | 2.000| 2.000| 100| 0.000|
| 50|alpha | 3.000| 3.000| 100| 0.000|
| 250|a | 1.012| 0.047| 100| 0.272|
| 250|b | 1.080| 1.502| 100| 0.432|
| 250|c | 1.500| 1.500| 100| 0.000|
| 250|beta | 2.000| 2.000| 100| 0.000|
| 250|alpha | 3.000| 3.000| 100| 0.000|
| 500|a | 0.968| 0.051| 100| 0.175|
| 500|b | 0.991| 1.504| 100| 0.239|
| 500|c | 1.500| 1.500| 100| 0.000|
| 500|beta | 2.000| 2.000| 100| 0.000|
| 500|alpha | 3.000| 3.000| 100| 0.000|
| 1500|a | 0.994| 0.050| 100| 0.102|
| 1500|b | 1.018| 1.501| 100| 0.138|
| 1500|c | 1.500| 1.500| 100| 0.000|
| 1500|beta | 2.000| 2.000| 100| 0.000|
| 1500|alpha | 3.000| 3.000| 100| 0.000|
5. Conclusões
Com base na análise realizada, as estimativas dos parâmetros da distribuição ELG demonstraram um viés razoavelmente baixo, e a cobertura dos intervalos de confiança atingiu 100% para os parâmetros estimados em várias simulações. Esses resultados sugerem que a abordagem de máxima verossimilhança, combinada com a correção de viés por bootstrap, é eficaz na estimação dos parâmetros do modelo.
6. Referência
Pedro Rafael Diniz Marinho. Gauss M. Cordeiro. Fernando Peña Ramírez. Morad Alizadeh. Marcelo Bourguignon. “The exponentiated logarithmic generated family of distributions and the evaluation of the confidence intervals by percentile bootstrap.” Braz. J. Probab. Stat. 32 (2) 281 - 308, May 2018. https://doi.org/10.1214/16-BJPS343