# Parámetros
mu <- 5
sigma <- 10
n <- 1000

# Generar datos
set.seed(123)
datos <- rnorm(n, mu, sigma)

# Crear grid para densidad teórica
x <- seq(-20, 60, length.out = 1000)
f_teorica <- dnorm(x, mu, sigma)

# Calcular diferentes estimaciones kernel
f_default <- density(datos)
f_bw_small <- density(datos, bw = 0.2)
f_bw_large <- density(datos, bw = 0.8)
f_bw_optimal <- density(datos, bw = "SJ") # Método óptimo

# Graficar
par(mfrow = c(1, 2))

# Gráfico 1: Teórica vs Kernel por defecto
plot(x, f_teorica, type = "l", lwd = 2, col = "blue",
     main = "Densidad Teórica vs Kernel",
     xlab = "x", ylab = "Densidad")
lines(f_default, col = "red", lwd = 2, lty = 2)
legend("topright", legend = c("Teórica", "Kernel (default)"), 
       col = c("blue", "red"), lwd = 2, lty = 1:2)

# Gráfico 2: Comparación de anchos de banda
plot(x, f_teorica, type = "l", lwd = 2, col = "blue",
     main = "Efecto del Ancho de Banda",
     xlab = "x", ylab = "Densidad")
lines(f_bw_small, col = "green", lwd = 2)
lines(f_bw_large, col = "purple", lwd = 2)
lines(f_bw_optimal, col = "orange", lwd = 2)
legend("topright", 
       legend = c("Teórica", "h=0.2", "h=0.8", "Óptimo (SJ)"), 
       col = c("blue", "green", "purple", "orange"), lwd = 2)

par(mfrow = c(1, 1))


# segundo

# Parámetros de la distribución normal

n <- 100   # Tamaño de muestra

# 1. Generar muestra aleatoria
set.seed(123) # Para reproducibilidad
muestra <- rnorm(n, mean = mu, sd = sigma)

# 2. Crear secuencia para la densidad teórica
x <- seq(-30, 60, length.out = 1000)
densidad_teorica <- dnorm(x, mean = mu, sd = sigma)

# 3. Estimación kernel con ancho de banda por defecto
densidad_kernel <- density(muestra)

# 4. Gráfico comparativo
plot(x, densidad_teorica, type = "l", lwd = 2, col = "blue",
     main = paste("Densidad Teórica vs Estimación Kernel (n =", n, ")"),
     xlab = "x", ylab = "Densidad",
     ylim = c(0, max(densidad_teorica, densidad_kernel$y)))

# Superponer la estimación kernel
lines(densidad_kernel, col = "red", lwd = 2, lty = 2)

# Añadir puntos de la muestra
rug(muestra, col = "darkgray")

# Añadir leyenda
legend("topright", 
       legend = c("Densidad teórica N(0,1)", "Estimación kernel", "Muestra"), 
       col = c("blue", "red", "darkgray"), 
       lwd = c(2, 2, NA), lty = c(1, 2, NA), pch = c(NA, NA, "|"))

# TERCERO


# Parámetros de la distribución normal
mu <- 5    # Media
sigma <- 10  # Desviación estándar
n <- 100    # Tamaño de muestra

# 1. Generar muestra aleatoria
set.seed(123) # Para reproducibilidad
muestra <- rnorm(n, mean = mu, sd = sigma)

# 2. Crear secuencia para la densidad teórica
x <- seq(-20, 40, length.out = 1000)
densidad_teorica <- dnorm(x, mean = mu, sd = sigma)

# 3. Estimación kernel con kernel Gaussiano (σ² = 1)
# Esto se logra usando kernel = "gaussian" (opción por defecto)
densidad_kernel <- density(muestra, kernel = "gaussian", bw = "nrd0")

# 4. Gráfico comparativo
plot(x, densidad_teorica, type = "l", lwd = 2, col = "blue",
     main = "Estimación Kernel Gaussiana (σ² = 1)",
     xlab = "x", ylab = "Densidad",
     ylim = c(0, max(densidad_teorica, densidad_kernel$y)))

# Superponer la estimación kernel
lines(densidad_kernel, col = "red", lwd = 2, lty = 2)

# Añadir puntos de la muestra
rug(muestra, col = "darkgray")

# Añadir leyenda
legend("topright", 
       legend = c("Densidad teórica N(0,1)", "Estimación kernel Gaussiano", "Muestra"), 
       col = c("blue", "red", "darkgray"), 
       lwd = c(2, 2, NA), lty = c(1, 2, NA), pch = c(NA, NA, "|"))

# Mostrar información sobre la estimación
cat("Parámetros de la estimación kernel:\n")
## Parámetros de la estimación kernel:
cat("Kernel usado:", densidad_kernel$kernel, "\n")
## Kernel usado:
cat("Ancho de banda (h) usado:", densidad_kernel$bw, "\n")
## Ancho de banda (h) usado: 3.170318
cat("Número de puntos de evaluación:", length(densidad_kernel$x), "\n")
## Número de puntos de evaluación: 512
# CUARTO PUNTO 

# Generar datos de ejemplo: 1000 observaciones con media 5 y desviación 10
set.seed(123)
datos <- rnorm(1000, mean = 5, sd = 10)

# 1. Estimación de densidad por defecto
dens_default <- density(datos)
plot(dens_default, main = "Densidad por defecto", col = "blue", lwd = 2)
abline(v = 5, col = "red", lty = 2) # Línea en la media real

# 2. Modificar el ancho de banda (h) - más pequeño (menos suavizado)
dens_h_small <- density(datos, bw = 1) # bw = h
plot(dens_h_small, main = "Ancho de banda pequeño (h=1)", col = "darkgreen", lwd = 2)
abline(v = 5, col = "red", lty = 2)

# 3. Modificar el ancho de banda - más grande (más suavizado)
dens_h_large <- density(datos, bw = 5)
plot(dens_h_large, main = "Ancho de banda grande (h=5)", col = "purple", lwd = 2)
abline(v = 5, col = "red", lty = 2)

# 4. Cambiar el kernel (lo que afecta σₖ² indirectamente)
# Kernels disponibles: "gaussian", "epanechnikov", "rectangular",
# "triangular", "biweight", "cosine", "optcosine"
dens_epan <- density(datos, kernel = "epanechnikov")
plot(dens_epan, main = "Kernel Epanechnikov", col = "orange", lwd = 2)
abline(v = 5, col = "red", lty = 2)

# 5. Selección automática de ancho de banda (métodos alternativos)
dens_bw_nrd0 <- density(datos, bw = "nrd0") # Método por defecto
dens_bw_SJ <- density(datos, bw = "SJ") # Método Sheather & Jones

par(mfrow = c(1, 2))
plot(dens_bw_nrd0, main = "Método NRD0", col = "blue", lwd = 2)
abline(v = 5, col = "red", lty = 2)
plot(dens_bw_SJ, main = "Método SJ", col = "darkred", lwd = 2)
abline(v = 5, col = "red", lty = 2)

# QUINTO PUNTO

# -------------------------------
# 1. Configuración inicial
# -------------------------------
rm(list = ls())
set.seed(123)

# Paquetes necesarios
if (!require("ggplot2")) install.packages("ggplot2")
## Cargando paquete requerido: ggplot2
library(ggplot2)

# -------------------------------
# 2. Generación de datos simulados
# -------------------------------
n <- 1000  # Tamaño de muestra
datos <- c(rnorm(n/2, mean = -3, sd = 1.5), rnorm(n/2, mean = 3, sd = 1))

# Densidad verdadera (mezcla de normales)
true_dens <- function(x) {
  0.5 * dnorm(x, -3, 1.5) + 0.5 * dnorm(x, 3, 1)
}

# -------------------------------
# 3. Configuración de kernels y anchos de banda
# -------------------------------
kernels <- c("gaussian", "epanechnikov", "rectangular")  # Kernels disponibles en R
bws <- c(0.2, 0.5, 1, 2)  # Valores de ancho de banda (h) a evaluar

# Varianzas teóricas de los kernels (σ²_K)
kernel_vars <- c(
  "gaussian" = 1,          # σ²_K = 1
  "epanechnikov" = 0.2,    # σ²_K ≈ 0.2
  "rectangular" = 1/3      # σ²_K ≈ 0.333
)

# -------------------------------
# 4. Simulación y gráficos de densidad estimada
# -------------------------------
par(mfrow = c(length(kernels), length(bws)), mar = c(3, 3, 2, 1))

for (k in kernels) {
  for (h in bws) {
    dens_est <- density(datos, bw = h, kernel = k)
    
    plot(dens_est, 
         main = paste0("Kernel: ", k, "\nh = ", h, ", σ²_K = ", round(kernel_vars[k], 3)),
         col = "blue", lwd = 2, xlim = c(-8, 8), ylim = c(0, 0.25),
         xlab = "", ylab = "")
    
    curve(true_dens(x), add = TRUE, col = "red", lty = 2, lwd = 1.5)
    
    legend("topright", 
           legend = c("Estimado", "Verdadero"),
           col = c("blue", "red"), lty = c(1, 2), cex = 0.8)
  }
}

# -------------------------------
# 5. Evaluación cuantitativa (MISE aproximado)
# -------------------------------
# Función para calcular el MISE aproximado
compute_mise <- function(dens_est, true_dens) {
  x_points <- dens_est$x
  delta <- diff(x_points)[1]
  est_dens <- dens_est$y
  true_dens_values <- true_dens(x_points)
  
  mise <- sum((est_dens - true_dens_values)^2) * delta
  return(mise)
}

# Data frame para almacenar resultados
results <- expand.grid(kernel = kernels, bw = bws)
results$mise <- NA

# Calcular MISE para cada combinación
for (i in 1:nrow(results)) {
  k <- as.character(results$kernel[i])
  h <- results$bw[i]
  
  dens_est <- density(datos, bw = h, kernel = k)
  results$mise[i] <- compute_mise(dens_est, true_dens)
}

# Mostrar resultados en una tabla ordenada
results$kernel_var <- kernel_vars[results$kernel]
results <- results[order(results$kernel, results$bw), ]
print(results)
##          kernel  bw         mise kernel_var
## 1      gaussian 0.2 0.0009318167  1.0000000
## 4      gaussian 0.5 0.0008555817  1.0000000
## 7      gaussian 1.0 0.0067483801  1.0000000
## 10     gaussian 2.0 0.0274451103  1.0000000
## 2  epanechnikov 0.2 0.0008764302  0.2000000
## 5  epanechnikov 0.5 0.0008795729  0.2000000
## 8  epanechnikov 1.0 0.0079821451  0.2000000
## 11 epanechnikov 2.0 0.0348822692  0.2000000
## 3   rectangular 0.2 0.0009749357  0.3333333
## 6   rectangular 0.5 0.0009233362  0.3333333
## 9   rectangular 1.0 0.0088359545  0.3333333
## 12  rectangular 2.0 0.0411965390  0.3333333
# Gráfico de MISE vs. ancho de banda por kernel
ggplot(results, aes(x = bw, y = mise, color = kernel)) +
  geom_line(size = 1) +
  geom_point(size = 2) +
  labs(title = "Error Cuadrático Medio Integrado (MISE) Aproximado",
       x = "Ancho de banda (h)", y = "MISE",
       color = "Kernel") +
  theme_minimal() +
  scale_color_manual(values = c("blue", "red", "green")) +
  facet_wrap(~kernel, scales = "free_y")
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

# -------------------------------
# 6. Análisis de sensibilidad a h y σ²_K
# -------------------------------
# Gráfico 3D opcional (requiere el paquete 'plotly')
if (require("plotly")) {
  plot_ly(results, x = ~bw, y = ~kernel_var, z = ~mise, 
          type = "scatter3d", mode = "markers",
          color = ~kernel, size = 5) %>%
    layout(scene = list(xaxis = list(title = "Ancho de banda (h)"),
                        yaxis = list(title = "σ²_K (varianza del kernel)"),
                        zaxis = list(title = "MISE")),
           title = "Sensibilidad del MISE a h y σ²_K")
}
## Cargando paquete requerido: plotly
## Warning: package 'plotly' was built under R version 4.4.3
## 
## Adjuntando el paquete: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout
# SEXTO PUNTO

# -------------------------------
# 1. Configuración inicial
# -------------------------------
rm(list = ls())
set.seed(123)

# Paquetes necesarios
if (!require("ggplot2")) install.packages("ggplot2")
if (!require("dplyr")) install.packages("dplyr")
## Cargando paquete requerido: dplyr
## 
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(ggplot2)
library(dplyr)

# -------------------------------
# 2. Generación de datos simulados
# -------------------------------
n <- 1000  # Tamaño de muestra por simulación
true_mean <- 5
true_sd <- 10

# Función de densidad verdadera (normal)
true_dens <- function(x) {
  dnorm(x, mean = true_mean, sd = true_sd)
}

# -------------------------------
# 3. Parámetros del kernel
# -------------------------------
h <- 1.5  # Ancho de banda fijo
kernel <- "gaussian"  # Kernel gaussiano
sigma2_K <- 1  # σ²_K para kernel gaussiano

# -------------------------------
# 4. Generar 100 estimaciones kernel
# -------------------------------
n_simulations <- 100
x_range <- seq(true_mean - 3*true_sd, true_mean + 3*true_sd, length.out = 200)

# Matriz para almacenar todas las estimaciones
all_estimates <- matrix(NA, nrow = length(x_range), ncol = n_simulations)

for (i in 1:n_simulations) {
  # Generar nuevos datos para cada simulación
  sim_data <- rnorm(n, mean = true_mean, sd = true_sd)
  
  # Calcular densidad kernel
  dens <- density(sim_data, bw = h, kernel = kernel, from = min(x_range), to = max(x_range), n = length(x_range))
  
  # Almacenar estimación
  all_estimates[, i] <- dens$y
}

# -------------------------------
# 5. Calcular la media de las estimaciones
# -------------------------------
mean_estimate <- rowMeans(all_estimates)

# -------------------------------
# 6. Crear dataframe para ggplot
# -------------------------------
plot_data <- data.frame(
  x = x_range,
  True = true_dens(x_range),
  Mean_Estimate = mean_estimate
)

# Preparar datos para las 100 estimaciones (para geom_line)
sim_data_long <- data.frame(
  x = rep(x_range, n_simulations),
  y = as.vector(all_estimates),
  Simulation = rep(1:n_simulations, each = length(x_range))
)

# -------------------------------
# 7. Crear la figura final
# -------------------------------
ggplot() +
  # Líneas grises para las 100 estimaciones individuales
  geom_line(data = sim_data_long, aes(x = x, y = y, group = Simulation), 
            color = "gray70", alpha = 0.3, linewidth = 0.3) +
  
  # Línea roja para la densidad verdadera
  geom_line(data = plot_data, aes(x = x, y = True), 
            color = "red", linewidth = 1.2, linetype = "dashed") +
  
  # Línea azul para la media de las estimaciones
  geom_line(data = plot_data, aes(x = x, y = Mean_Estimate), 
            color = "blue", linewidth = 1.2) +
  
  # Añadir leyenda y formato
  labs(title = paste("100 Estimaciones Kernel Gaussiano (h =", h, ", σ²_K =", sigma2_K, ")"),
       subtitle = "Línea roja: Densidad verdadera | Línea azul: Media de 100 estimaciones",
       x = "x", y = "Densidad") +
  
  # Ajustar límites del eje y para mejor visualización
  ylim(0, max(plot_data$True, plot_data$Mean_Estimate) * 1.1) +
  
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))

# -------------------------------
# 8. Opcional: Mostrar algunas estadísticas
# -------------------------------
cat("Parámetros usados:\n")
## Parámetros usados:
cat(" - Número de simulaciones:", n_simulations, "\n")
##  - Número de simulaciones: 100
cat(" - Tamaño de muestra por simulación:", n, "\n")
##  - Tamaño de muestra por simulación: 1000
cat(" - Ancho de banda (h):", h, "\n")
##  - Ancho de banda (h): 1.5
cat(" - Kernel:", kernel, "\n")
##  - Kernel: gaussian
cat(" - σ²_K:", sigma2_K, "\n\n")
##  - σ²_K: 1
# Calcular MISE entre la media de estimaciones y la densidad verdadera
delta_x <- diff(x_range)[1]
mise <- sum((mean_estimate - true_dens(x_range))^2) * delta_x
cat("Error Cuadrático Medio Integrado (MISE) entre la media de estimaciones y la densidad verdadera:", mise, "\n")
## Error Cuadrático Medio Integrado (MISE) entre la media de estimaciones y la densidad verdadera: 3.926955e-06