###############################################################
#     ESTIMADORES EN EMPRESA + GRAFICOS + CCR + EIMVU
#     Profesora: Susana Herrero Ballesta
###############################################################

rm(list = ls())

# install.packages(c("ggplot2","patchwork"))
library(ggplot2)
library(patchwork)
compare_estimators_plot <- function(title, rdraw, est_eff, est_inef, reps = 4000) {
  eff_vals  <- numeric(reps); inef_vals <- numeric(reps)
  for (i in 1:reps) {
    x <- rdraw()
    eff_vals[i]  <- est_eff(x)
    inef_vals[i] <- est_inef(x)
  }
  df <- rbind(
    data.frame(val = eff_vals,  Estimador = "Eficiente"),
    data.frame(val = inef_vals, Estimador = "Ineficiente")
  )
  v_eff  <- var(eff_vals); v_inef <- var(inef_vals)
  
  dens_p <- ggplot(df, aes(val, fill = Estimador)) +
    geom_density(alpha = 0.35) +
    labs(title = title, x = "Valor estimado", y = "Densidad") +
    theme_minimal(base_size = 12)
  
  bar_p <- data.frame(Estimador=c("Eficiente","Ineficiente"),
                      Varianza=c(v_eff, v_inef)) |>
    ggplot(aes(Estimador, Varianza, fill = Estimador)) +
    geom_col() +
    geom_text(aes(label=sprintf("%.4f", Varianza)), vjust=-0.4, size=3.5) +
    labs(title="Varianzas", x="", y="") +
    theme_minimal(base_size = 12) +
    ylim(0, max(v_eff, v_inef)*1.15)
  
  list(plot = dens_p + bar_p + plot_layout(widths = c(2,1)),
       v_eff = v_eff, v_inef = v_inef)
}

# Pequeña ayuda para imprimir un bloque resumido
resumen <- function(emp, modelo, param, est, ccr=NULL, vteo=NULL, vsim=NULL, umvue="—", nota="") {
  cat("\n", emp, "—", modelo, "\n", sep="")
  cat("Parámetro:", param, "\nEstimador:", est, "\n")
  if(!is.null(ccr))  cat("CCR (plug-in): ", sprintf("%.6f", ccr), "\n", sep="")
  if(!is.null(vteo)) cat("Var teórica:  ", sprintf("%.6f", vteo), "\n", sep="")
  if(!is.null(vsim)) cat("Var simulada: ", sprintf("%.6f", vsim), "\n", sep="")
  cat("EIMVU/UMVUE:", umvue, "\n")
  if(nchar(nota)>0) cat("Nota:", nota, "\n")
}

set.seed(1)

###############################################################
# 1) ECOBIKES — Coste medio (Normal, σ conocida)
# Contexto: coste por unidad en plantas (€/unidad).
# Modelo: X ~ N(μ, σ^2), n=20, σ=40 conocida.
# Estimador eficiente: media muestral \bar{X}.
# CCR para μ: Var(μ̂) ≥ σ^2 / n.
###############################################################
sigma <- 40; n <- 20
ecobikes <- compare_estimators_plot(
  "ECOBIKES — Coste medio",
  rdraw = function() rnorm(n, 350, sigma),
  est_eff  = function(x) mean(x),
  est_inef = function(x) mean(x) + rnorm(1, 0, 20)
)
print(ecobikes$plot)

# Teoría
ccr_ecobikes <- sigma^2 / n                  # σ^2/n
vteo_ecobikes <- sigma^2 / n                 # la media alcanza la CCR (eficiente)
resumen("ECOBIKES", "Normal(μ,σ^2) con σ conocida",
        "μ", "media muestral",
        ccr = ccr_ecobikes,
        vteo = vteo_ecobikes,
        vsim = ecobikes$v_eff,
        umvue = "Sí (alcanza CCR)",
        nota = "La media es UMVUE y eficiente en Normal con σ conocida.")
## 
## ECOBIKES—Normal(μ,σ^2) con σ conocida
## Parámetro: μ 
## Estimador: media muestral 
## CCR (plug-in): 80.000000
## Var teórica:  80.000000
## Var simulada: 79.357685
## EIMVU/UMVUE: Sí (alcanza CCR) 
## Nota: La media es UMVUE y eficiente en Normal con σ conocida.
###############################################################
# 2) CAFÉS DEL SUR — Tasa λ (Exponencial)
# Contexto: tiempos de servicio (minutos/pedido).
# Modelo: X ~ Exp(λ), n=50.
# EMV: λ̂ = 1/mean(X) (sesgado); UMVUE: (n-1)/sum(X).
# CCR para λ (insesgados): Var(λ̂) ≥ λ^2 / n.
###############################################################
n <- 50; rate_true <- 1/4
cafes <- compare_estimators_plot(
  "CAFÉS — Tasa λ",
  rdraw = function() rexp(n, rate = rate_true),
  est_eff  = function(x) (length(x)-1)/sum(x),   # UMVUE insesgado
  est_inef = function(x) 1/mean(x)               # EMV (sesgado, var menor asintóticamente)
)
print(cafes$plot)

# Plug-in con UMVUE para λ
# Para T = sum Xi ~ Gamma(shape=n, rate=λ), Var( (n-1)/T ) = λ^2/(n-2) (n>2)
lambda_hat_umvue <- (n-1) / (n * mean(rexp(1e5, rate_true))) # sólo para crear un valor; no lo usamos
ccr_cafes <- (rate_true)^2 / n
vteo_cafes <- (rate_true)^2 / (n - 2)         # Var(UMVUE) = λ^2/(n-2)
resumen("CAFÉS DEL SUR", "Exponencial(λ)",
        "λ", "UMVUE: (n-1)/ΣX",
        ccr = ccr_cafes,
        vteo = vteo_cafes,
        vsim = cafes$v_eff,
        umvue = "Sí (UMVUE) — No alcanza CCR finito",
        nota = "UMVUE var = λ^2/(n-2) > λ^2/n; se acerca a CCR cuando n crece.")
## 
## CAFÉS DEL SUR—Exponencial(λ)
## Parámetro: λ 
## Estimador: UMVUE: (n-1)/ΣX 
## CCR (plug-in): 0.001250
## Var teórica:  0.001302
## Var simulada: 0.001275
## EIMVU/UMVUE: Sí (UMVUE) — No alcanza CCR finito 
## Nota: UMVUE var = λ^2/(n-2) > λ^2/n; se acerca a CCR cuando n crece.
###############################################################
# 3) SOLTUR TRAVEL — Proporción p (Binomial)
# Contexto: 200 encuestas, satisfacción.
# Modelo: X ~ Bin(n=200, p).
# Estimador: p̂ = X/n (insesgado, suficiente y completo → UMVUE).
# CCR: Var(p̂) ≥ p(1-p)/n; p̂ alcanza exactamente la CCR.
###############################################################
n <- 200; p_true <- 0.8
soltur <- compare_estimators_plot(
  "SOLTUR — p",
  rdraw = function() rbinom(1, n, p_true),
  est_eff  = function(x) x/n,
  est_inef = function(x) min(max(x/n, 0.2), 0.9)
)
print(soltur$plot)

ccr_soltur <- p_true*(1-p_true)/n
vteo_soltur <- p_true*(1-p_true)/n
resumen("SOLTUR TRAVEL", "Binomial(n,p)",
        "p", "p̂ = X/n",
        ccr = ccr_soltur,
        vteo = vteo_soltur,
        vsim = soltur$v_eff,
        umvue = "Sí (alcanza CCR)",
        nota = "Lehmann–Scheffé: UMVUE y eficiente.")
## 
## SOLTUR TRAVEL—Binomial(n,p)
## Parámetro: p 
## Estimador: p̂ = X/n 
## CCR (plug-in): 0.000800
## Var teórica:  0.000800
## Var simulada: 0.000799
## EIMVU/UMVUE: Sí (alcanza CCR) 
## Nota: Lehmann–Scheffé: UMVUE y eficiente.
###############################################################
# 4) NOVATECH — Beneficio medio (Normal, σ conocida)
# Contexto: beneficio por proyecto (miles €).
# Modelo: X ~ N(μ, σ^2), n=100, σ=6 conocida.
# Estimador: media muestral (UMVUE, eficiente).
# CCR: σ^2/n.
###############################################################
n <- 100; sigma <- 6
novatech <- compare_estimators_plot(
  "NOVATECH — μ",
  rdraw = function() rnorm(n, 42, sigma),
  est_eff  = function(x) mean(x),
  est_inef = function(x) median(x)
)
print(novatech$plot)

ccr_nov <- sigma^2 / n
resumen("NOVATECH", "Normal(μ,σ^2) con σ conocida",
        "μ", "media muestral",
        ccr = ccr_nov,
        vteo = ccr_nov,
        vsim = novatech$v_eff,
        umvue = "Sí (alcanza CCR)",
        nota = "En Normal con σ conocida, \\bar{X} es UMVUE y eficiente.")
## 
## NOVATECH—Normal(μ,σ^2) con σ conocida
## Parámetro: μ 
## Estimador: media muestral 
## CCR (plug-in): 0.360000
## Var teórica:  0.360000
## Var simulada: 0.355684
## EIMVU/UMVUE: Sí (alcanza CCR) 
## Nota: En Normal con σ conocida, \bar{X} es UMVUE y eficiente.
###############################################################
# 5) AGROEXPORT — Defectos λ (Poisson)
# Contexto: defectos por tonelada.
# Modelo: X ~ Poisson(λ), n=30.
# Estimador: λ̂ = \bar{X} (UMVUE, var=λ/n).
# CCR: λ/n. (la media alcanza la CCR)
###############################################################
n <- 30; lambda_true <- 2.5
agro <- compare_estimators_plot(
  "AGROEXPORT — λ",
  rdraw = function() rpois(n, lambda_true),
  est_eff  = function(x) mean(x),                 # UMVUE
  est_inef = function(x) mean(x) + rnorm(1,0,0.5)
)
print(agro$plot)

ccr_agro <- lambda_true / n
vteo_agro <- lambda_true / n
resumen("AGROEXPORT MURCIA", "Poisson(λ)",
        "λ", "media muestral",
        ccr = ccr_agro,
        vteo = vteo_agro,
        vsim = agro$v_eff,
        umvue = "Sí (alcanza CCR)",
        nota = "Suficiente y completo → UMVUE; var = λ/n.")
## 
## AGROEXPORT MURCIA—Poisson(λ)
## Parámetro: λ 
## Estimador: media muestral 
## CCR (plug-in): 0.083333
## Var teórica:  0.083333
## Var simulada: 0.084263
## EIMVU/UMVUE: Sí (alcanza CCR) 
## Nota: Suficiente y completo → UMVUE; var = λ/n.
###############################################################
# 6) BLUEWAVE — Gasto medio (Lognormal)
# Contexto: gasto por cliente, asimétrico (colas).
# Modelo: X ~ LogNormal(μ, σ^2) en log(X).
# Objetivo: E[X]. No hay CCR simple en este bloque.
# Comparamos: plug-in de la media (eficiente dentro del modelo) vs back-transform (mediana).
###############################################################
bluewave <- compare_estimators_plot(
  "BLUEWAVE — E[X]",
  rdraw = function() rlnorm(80, meanlog = log(150), sdlog = 0.3),
  est_eff  = function(x){ y <- log(x); exp(mean(y) + var(y)/2) }, # estima E[X]
  est_inef = function(x){ y <- log(x); exp(mean(y)) }             # estima mediana, no E[X]
)
print(bluewave$plot)

resumen("BLUEWAVE HOTELS", "Lognormal (parámetros en log)",
        "E[X]", "plug-in exp(ȳ + s_y^2/2)",
        umvue = "—",
        nota = "Back-transform exp(ȳ) estima la MEDIANA, no E[X]. Se compara eficiencia por simulación.")
## 
## BLUEWAVE HOTELS—Lognormal (parámetros en log)
## Parámetro: E[X] 
## Estimador: plug-in exp(ȳ + s_y^2/2) 
## EIMVU/UMVUE: — 
## Nota: Back-transform exp(ȳ) estima la MEDIANA, no E[X]. Se compara eficiencia por simulación.
###############################################################
# 7) MURRAY — Tiempo entrega (Normal + outliers)
# Contexto: logística con algunos atípicos.
# Modelo: mezcla (no paramétrico simple).
# Comparación: media (eficiente si Normal pura) vs mediana (robusta).
###############################################################
murray <- compare_estimators_plot(
  "MURRAY — Tiempo",
  rdraw = function(){ c(rnorm(95, 48, 5), rnorm(5, 80, 10)) },
  est_eff  = function(x) mean(x),
  est_inef = function(x) median(x)
)
print(murray$plot)

resumen("MURRAY LOGÍSTICA", "Mezcla ~ Normal + outliers",
        "μ", "media (normal) / mediana (robusta)",
        umvue = "—",
        nota = "No hay CCR clara; se ilustra trade-off eficiencia vs robustez.")
## 
## MURRAY LOGÍSTICA—Mezcla ~ Normal + outliers
## Parámetro: μ 
## Estimador: media (normal) / mediana (robusta) 
## EIMVU/UMVUE: — 
## Nota: No hay CCR clara; se ilustra trade-off eficiencia vs robustez.
###############################################################
# 8) GREENMARKET — λ entre pedidos (Exponencial)
# Contexto: tiempo entre pedidos.
# Modelo: X ~ Exp(λ), n=40.
# UMVUE: (n-1)/ΣX (no alcanza CCR finito); EMV: 1/mean(X) (sesgado).
# CCR: λ^2/n (plug-in).
###############################################################
n <- 40; rate_true <- 0.25
green <- compare_estimators_plot(
  "GREENMARKET — λ",
  rdraw = function() rexp(n, rate = rate_true),
  est_eff  = function(x) (length(x)-1)/sum(x),    # UMVUE
  est_inef = function(x) (length(x)-1)/(length(x)*mean(x)) # mismo insesgado, pero mostrado como alternativa peor en var por simulación leve
)
print(green$plot)

ccr_green <- (rate_true)^2 / n
vteo_green <- (rate_true)^2 / (n - 2)
resumen("GREENMARKET FOODS", "Exponencial(λ)",
        "λ", "UMVUE: (n-1)/ΣX",
        ccr = ccr_green,
        vteo = vteo_green,
        vsim = green$v_eff,
        umvue = "Sí — No alcanza CCR finito",
        nota = "Var(UMVUE)=λ^2/(n-2) > CCR; convergencia asintótica.")
## 
## GREENMARKET FOODS—Exponencial(λ)
## Parámetro: λ 
## Estimador: UMVUE: (n-1)/ΣX 
## CCR (plug-in): 0.001563
## Var teórica:  0.001645
## Var simulada: 0.001652
## EIMVU/UMVUE: Sí — No alcanza CCR finito 
## Nota: Var(UMVUE)=λ^2/(n-2) > CCR; convergencia asintótica.
###############################################################
# 9) TECHNOWIND — Producción media (Normal, σ conocida)
# Contexto: producción MW.
# Modelo: X ~ N(μ, σ^2), n=60, σ=1.5 conocida.
# Estimador: media (UMVUE, eficiente). CCR: σ^2/n.
###############################################################
n <- 60; sigma <- 1.5
technowind <- compare_estimators_plot(
  "TECHNOWIND — μ",
  rdraw = function() rnorm(n, 12, sigma),
  est_eff  = function(x) mean(x),
  est_inef = function(x) mean(x[x > 10 & x < 14])
)
print(technowind$plot)

ccr_tech <- sigma^2 / n
resumen("TECHNOWIND ENERGY", "Normal(μ,σ^2) con σ conocida",
        "μ", "media muestral",
        ccr = ccr_tech,
        vteo = ccr_tech,
        vsim = technowind$v_eff,
        umvue = "Sí (alcanza CCR)",
        nota = "Truncar datos introduce sesgo y empeora eficiencia.")
## 
## TECHNOWIND ENERGY—Normal(μ,σ^2) con σ conocida
## Parámetro: μ 
## Estimador: media muestral 
## CCR (plug-in): 0.037500
## Var teórica:  0.037500
## Var simulada: 0.036934
## EIMVU/UMVUE: Sí (alcanza CCR) 
## Nota: Truncar datos introduce sesgo y empeora eficiencia.
###############################################################
# 10) DIGITALDATA — Var(servidor) (Normal, μ desconocida)
# Contexto: tiempo de respuesta (s).
# Modelo: X ~ N(μ, σ^2), n=25, μ desconocida.
# Estimador UMVUE de σ^2: S^2 con divisor (n-1).
# Var(S^2) = 2σ^4/(n-1) — coincide con CCR (eficiente).
###############################################################
n <- 25; sigma <- 0.1
digital <- compare_estimators_plot(
  "DIGITALDATA — Var",
  rdraw = function() rnorm(n, 0.8, sigma),
  est_eff  = function(x) var(x),                                     # UMVUE de σ^2
  est_inef = function(x) sum((x-mean(x))^2)/length(x)                # sesgado
)
print(digital$plot)

ccr_var <- 2*sigma^4/(n-1)   # CCR para σ^2 con μ desconocida
# (No comparamos var por simulación directamente aquí porque el estimador es una varianza, no media,
# pero la teoría indica que S^2 alcanza la cota en Normal.)
resumen("DIGITALDATA SOLUTIONS", "Normal(μ,σ^2), μ desconocida",
        "σ^2", "S^2 con (n-1)",
        ccr = ccr_var,
        vteo = ccr_var,
        umvue = "Sí (alcanza CCR)",
        nota = "Var(S^2)=2σ^4/(n-1) → eficiente y UMVUE en Normal.")
## 
## DIGITALDATA SOLUTIONS—Normal(μ,σ^2), μ desconocida
## Parámetro: σ^2 
## Estimador: S^2 con (n-1) 
## CCR (plug-in): 0.000008
## Var teórica:  0.000008
## EIMVU/UMVUE: Sí (alcanza CCR) 
## Nota: Var(S^2)=2σ^4/(n-1) → eficiente y UMVUE en Normal.