Projeto -Estatística Computacional

Author

Tania Barbosa Tomaz - Matrícula: 20180089379

self-contained-math: true embed-resources: true

rm(list = ls())
gc()

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 erro
1 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