2 Estimación no-paramétrica de densidades
2.1 Histograma
El histograma es una de las estructuras básicas en estadística y es una herramienta descriptiva que permite visualizar la distribución de los datos sin tener conocimiento previo de los mismos. En esta sección definiremos el histograma más como un estadístico que como una herramienta de visualización de datos.
2.1.1 Construcción Estadística
Suponga que
Construcción:
Seleccione un origen
y divida la linea real en segmentos.Cuente cuántas observaciones caen en el segmento
. Denótelo como .
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Divida el número de observaciones en
por el tamaño de muestra y el ancho de banda de cada caja. De esta forma si se suma las áreas definidas por el histograma da un total de 1.Cuente la frecuencia por el tamaño de muestra
y el ancho de banda .Dibuje el histograma.
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Formalmente el histograma es el
donde
2.1.2 Construcción probabilística
Denote
Otra forma de aproximarlo es:
Acomodando un poco la expresión
2.1.3 Propiedades estadísticas
Note que el estimador de histograma
2.1.4 Propiedades estadísticas
Suponga que
2.1.5 Sesgo
Para calcular el sesgo primero calculamos:
donde
Entonces,
y por lo tanto el sesgo de
Esto se puede aproximar usando Taylor alrededor del centro
es un estimador sesgado de .- El sesgo tiende a ser cero cerca del punto medio de
. - El sesgo es creciente con respecto a la pendiente de la verdadera densidad evaluada en el punto medio
.
2.1.6 Varianza
Dado que todos los
La variable
Usando un desarrollo de Taylor como en la parte anterior, pruebe que:
\begin{equation*}
\mathrm{Var}\left( \hat{f}_h(x)\right)\approx
\frac{1}{nh} f(x)
\end{equation*}
Consecuencias:
- La varianza del estimador es proporcional a
. - La varianza decrece si el ancho de banda
crece.
2.1.7 Error cuadrático medio
El error cuadrático medio del histograma es el
¿Pueden probar la segunda igualdad de la expresión anterior?
Retomando los términos anteriores se puede comprobar que:
Si \(h \to 0\) y \(nh \to \infty\) entonces \(\mathrm{MSE}\left( \hat{f}_h(x)\right) \to 0 \). Es decir, conforme usamos más observaciones, pero el ancho de banda de banda no decrece tan rápido, entonces el error cuadrático medio converge a 0.
Como \(\mathrm{MSE}\left( \hat{f}_h(x)\right) \to 0 \) (convergencia en \(\mathbb{L}^2\)) implica que \(\hat{f}_h(x) \stackrel{\mathcal{P}}{\to} f(x)\), entonces \(\hat{f}_h\) es consistente. Además según la fórmula \@ref(eq:MSE), concluimos lo siguiente:
- Si $h\to 0$, la varianza crece (converge a $\infty$) y el sesgo
decrece (converge a $f^\prime (0)x^2$).
- Si $h\to \infty$, la varianza decrece (hacia 0) y el sesgo crece
(hacia $\infty$)
Si $f\sim N(0,1)$, aproxime los componentes de sesgo, varianza y MSE, y grafíquelos para distintos valores de $h$.
Solución:
Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
ℹ Please use `linewidth` instead.
2.1.8 Error cuadrático medio integrado
Uno de los problemas con el
Al
la cual es una buena aproximación si
2.1.9 Ancho de banda óptimo para el histograma
El MISE tiene un comportamiento asintótico similar al observado en el MSE. La figura siguiente presenta el comportamiento de la varianza, sesgo y MISE para nuestro ejemplo anterior:
Un problema frecuente en los histogramas es que la mala elección del parámetro
Warning: `stat(density)` was deprecated in ggplot2 3.4.0.
ℹ Please use `after_stat(density)` instead.
Un criterio más preciso para seleccionar el ancho de banda es a través de la minimización del MISE:
lo implica que
y por lo tanto
Si \(X_1, \ldots, X_n \sim f_{\theta} \) i.i.d, con \(\mathrm{Var}(X) = \sigma^2\) y media $\theta$, recuerde que el estimador \(\hat{\theta}\) de \(\theta\) tiene la característica que
\begin{equation*}
\mathrm{MSE}(\theta) = \mathrm{Var}(\hat{\theta}) +
\mathrm{Sesgo}^2(\hat{\theta}) = \frac{\sigma^2}{n}
\end{equation*}
Según la nota anterior la tasas de convergencia del histograma es más lenta que la de un estimador parámetrico considerando la misma cantidad de datos, tal y como se ilustra en el siguiente gráfico:
Warning: The `size` argument of `element_line()` is deprecated as of ggplot2 3.4.0.
ℹ Please use the `linewidth` argument instead.
Finalmente, podemos encontrar el valor óptimo del ancho de banda (
Verifique que en el caso normal estándar: $h_{opt}\approx 3.5 n^{-1/3}$.
2.2 Estimación de densidades basada en kernels.
2.2.1 Primera construcción
Sea
La distribución empírica de
Por la ley de los grandes números tenemos que
¿Podríamos derivar \(F_n\) para encontrar el estimador \(\hat{f}_n\)?
La respuesta es si (más o menos).
Suponga que
Remplazando
Podemos rescribirlo de la forma,
2.2.2 Otra construcción
Con el histograma construimos una serie de segmentos fijo
¿Qué pasaría si cambiamos la palabra **contenidos** por **alrededor de "x"**?
Suponga que se tienen intervalos de longitud
El estimador de histograma se escribe como
Note que si definimos
Finalmente se tendría que
¿Qué pasaría si cambiaríamos la función \(K\) del histograma por una más general? Esto permitiría incluir la noción de "cercanía" de cada dato alrededor de $x$.
Esta función debería cumplir las siguientes características:
. . . .
Por ejemplo:
- Uniforme:
. - Triangular:
. - Epanechnikov:
. - Gaussian:
.
Entonces se tendría que la expresión general para un estimador por núcleos (kernel) de
donde
¿Qué pasaría si modificamos el ancho de banda \(h\) para un mismo kernel?
Nuevamente controlaríamos la suavidad del estimador a como se ilustra a continuación:
Inconveniente: no tenemos aún un criterio para un
¿Qué pasaría si modificamos el kernel para un mismo ancho de banda \(h\)?
Usando 1000 números aleatorios según una normal estándar, con un ancho de banda fijo (
Recordemos nuevamente la fórmula
Cada sumando de esta expresión es una función de la variable
En el siguiente gráfico se generan 10 puntos aleatorios según una normal estándar (rojo) y se grafica cada uno de los 10 componentes del estimador de la densidad usando kernels gaussianos (azul). El estimador resultante aparece en color negro. Note que cada uno de los 10 componentes tiene la misma área bajo la curva, la cual en este caso es 0.1.
2.2.3 Propiedades Estadísticas
Al igual que en el caso de histograma, también aplica lo siguiente:
donde
En el caso de la varianza:
Por lo tanto se obtiene que
2.2.4 Sesgo
Para el sesgo tenemos
Usando el cambio de variable \(s=\frac{u-x}{h}\) y las propiedades del kernel pruebe que
\begin{equation*}
\mathrm{Sesgo}\left(\hat{f}_{h}(x)\right) = \frac{h^{2}}{2} f^{\prime\prime} \mu_{2}(K) + o(h^{2}), \text{ si } h\to 0
\end{equation*}
donde \(\mu_{2}=\int s^{2}K(s)ds\).
En algunas pruebas más formales, se necesita además que $f^{\prime\prime}$ sea absolutamente continua y que $\int(f^{\prime\prime\prime}(x))dx<\infty$.}
\begin{align*}
\mathrm{Sesgo}(\hat{f_{h}}(x)) & = \int \frac{1}{h} K\left( \frac{x-u}{h} \right) f(u)du - f(x) \\
& = \frac{1}{h} \int hK(s)f(sh+x) ds - f(x) \\
& = \int K(s)\Biggl[ f(x) + f^{\prime}(x)(sh+x-x) \\
& \qquad + \frac{f^{\prime\prime}(x)}{2}(sh+x-x)^2 + o(h^{2}) \Biggr] - f(x) \\
& = \int K(s)f(x)ds + \int hf^{\prime}(x)sK(s) ds \\
& \qquad + \int \frac{h^2}{2} f^{\prime\prime}(x)s^2K(s) ds + o(h^2) - f(x) \\
& = f(x) + 0 + \frac{h^2}{2}f^{\prime\prime}(x)\mu_{2}(K) + o(h^2) - f(x) \\
& = \frac{h^2}{2}f^{\prime\prime}(x)\mu_{2}(K) + o(h^2) \\
\end{align*}
En el siguiente gráfico se ilustra el estimador no paramétrico de la distribución de tiempos entre erupciones en la muy conocida tabla de datos faithful. El estimador se calcula bajo dos distintas escogencias de ancho de banda.
Note como los cambios en el ancho de banda modifican la suavidad (sesgo) y el aplanamiento de la curva (varianza).
2.2.5 Error cuadrático medio y Error cuadrático medio integrado
El error cuadrático medio se escribe
Y el error cuadrático medio integrado se escribe como,
Al igual que en el caso del histograma, el estimador por kernels es un estimador consistente de
2.2.6 Ancho de banda óptimo
Minimizando el
De forma práctica, $h_{opt}$ no es un estimador útil de $h$ porque depende de $\Vert f^{\prime\prime}\Vert_{2}^{2}$ que es desconocido. Más adelante veremos otra forma de encontrar este estimador.
Evaluando
y por lo tanto la tasa de convergencia del MISE a 0 es más rápida que para el caso del histograma:
Como se comentó anteriormente, el principal inconveniente del ancho de banda:
\begin{equation*}
h_{opt}=\left(\frac{\Vert K\Vert_{2}^{2}}{\Vert f^{\prime\prime}\Vert_{2}^{2}\left(\mu_{2}(K)\right)^{2}n}\right)^{1/5}=O\left( n^{-1/5} \right).
\end{equation*}
es que depende de $f''$.
A continuación se explica dos posibles métodos para determinar para aproximar el ancho de banda óptimo:
2.2.6.1 Referencia normal
Este método es más efectivo si se conoce que la verdadera distribución es bastante suave, unimodal y simétrica. Más adelante veremos otro método para densidades más generales.
Asuma que
donde
Pruebe que la ecuación anterior es verdadera. Utilice el hecho de que:
\begin{align*}
\Vert f^{\prime\prime}\Vert_{2}^{2}=\sigma^{-5}\int \phi^{\prime \prime}(x)^2 dx
\end{align*}
donde $\phi$ es la función de densidad de una $N(0,1)$.
El principal inconveniente de \(\hat{h}_{rn}\) es su sensibilidad a los valores extremos:
La varianza empírica de 1, 2, 3, 4, 5, es 2.5.
La varianza empírica de 1, 2, 3, 4, 5, 99, es 1538.
Para solucionar el problema anterior, se puede considerar una medida más robusta de variación, por ejemplo el rango intercuantil IQR:
Con el supuesto que
Por lo tanto
Podemos sustituir la varianza empírica de la fórmula inicial y tenemos
Combinando ambos estimadores, podemos obtener,
pero esta aproximación es conveniente bajo el escenario de que la densidad
2.2.6.2 Validación Cruzada
Defina el error cuadrático integrado como
El MISE es el valor esperado del ISE.
Nuestro objetivo es minimizar el ISE con respecto a
Primero note que
Vamos a resolver esto en dos pasos partes
Integral
Integral
El término
El problema con esta expresión es que las observaciones que se usan para estimar la esperanza son las mismas que se usan para estimar \(\hat{f}_{h}(x)\) (Se utilizan doble).
La solución es remover la
Redefiniendo el estimador anterior tenemos una estimación de
de esta forma nos aseguramos que las observaciones que se usan para calcular
Siguiendo con el término
donde
Finalmente tenemos la función,
Finalmente definimos la función objetivo del criterio de validación cruzada como:
Note que \(\mathrm{CV}(h)\) no depende de \(f\) o sus derivadas y además la función objetivo se adapta automáticamente a las características de la densidad $f$.
Para efectos prácticos es mejor utilizar el criterio
\[
CV(h)=\int\hat{f}_{h}^{2}(x)dx-\frac{2}{(n-1)h}\sum_{i=1}^{n}\mathop{\sum_{j=1}^{n}}_{j\neq i}K\left( \frac{X_{i}-X_{j}}{h} \right)
\]
y luego calcular numéricamente la integral. NO LE ENCUENTRO SENTIDO A ESA AFIRMACION, HAY QUE DISCUTIRLA.
2.2.7 Intervalos de confianza para estimadores de densidad no paramétricos
Usando los resultados anteriores y asumiendo que
Si
Esta expresión nos dice que con una probabilidad de
Al igual que en los casos anteriores, este invtervalo no es útil ya que depende de
Si
Si
Podemos reemplazar
Este intervalo de confianza está definido para $x$ fijo y no permite hacer inferencia sobre toda la función $f$. Una forma de determinar la banda de confianza de toda la función $f$ es a través de la fórmula 3.52 en la página 62 de [@HardleNonparametric2004].
2.3 Laboratorio
Comenzaremos con una librería bastante básica llamada .
2.3.1 Efecto de distintos Kernels en la estimación
<- read.csv('data/stockres.txt')
x <- unlist(x) x
summary(x)
Min. 1st Qu. Median Mean 3rd Qu. Max.
-0.6118200 -0.0204085 -0.0010632 -0.0004988 0.0215999 0.1432286
library(KernSmooth)
<- bkde(x, kernel = "normal", bandwidth = 0.05)
fhat_normal plot(fhat_normal, type = "l")
<- bkde(x, kernel = "box", bandwidth = 0.05)
fhat_unif plot(fhat_unif, type = "l")
<- bkde(x, kernel = "epanech", bandwidth = 0.05)
fhat_epanech plot(fhat_epanech, type = "l")
<- bkde(x, kernel = "biweight", bandwidth = 0.05)
fhat_biweight plot(fhat_biweight, type = "l")
<- bkde(x, kernel = "triweight", bandwidth = 0.05)
fhat_triweight plot(fhat_triweight, type = "l")
2.3.2 Efecto del ancho de banda en la estimación
** Kernel uniforme **
<- bkde(x, kernel = "box", bandwidth = 0.001) fhat
Warning in bkde(x, kernel = "box", bandwidth = 0.001): Binning grid too coarse
for current (small) bandwidth: consider increasing 'gridsize'
plot(fhat, type = "l")
<- bkde(x, kernel = "box", bandwidth = 0.5)
fhat plot(fhat, type = "l")
** Kernel Epanechnikov **
<- bkde(x, kernel = "epa", bandwidth = 0.001) fhat
Warning in bkde(x, kernel = "epa", bandwidth = 0.001): Binning grid too coarse
for current (small) bandwidth: consider increasing 'gridsize'
plot(fhat, type = "l")
<- bkde(x, kernel = "epa", bandwidth = 0.5)
fhat plot(fhat, type = "l")
## suppressMessages(library(tidyverse))
## library(gganimate)
## fani <- tibble()
## for (b in seq(0.001, 0.02, length.out = 40)) {
## f <- bkde(x, kernel = "epa", bandwidth = b, gridsize = length(x))
## fani <- fani %>% bind_rows(tibble(xreal = sort(x), x = f$x, y = f$y, bw = b))
## }
## ggplot(data = fani) +
## geom_line(aes(x, y), color = "blue") +
## labs(title = paste0("Ancho de banda = {closest_state}")) +
## transition_states(bw) +
## view_follow() +
## theme_minimal(base_size = 20)
## # anim_save("manual_figure/bandwidth-animation.gif")
- Construya una variable llamada `u` que sea una secuencia de -0.15 a 0.15 con un paso de 0.01
- Asigne `x` a los datos `stockrel` y calcule su media y varianza.
- Usando la función `dnorm` construya los valores de la distribución de los datos usando la media y varianza calculada anteriormente. Asigne a esta variable `f\_param`.
- Defina un ancho de banda `h` en 0.02
- Construya un histograma para estos datos con ancho de banda `h`. Llame a esta variable `f\_hist`
- Usando el paquete `KernSmooth` y la función `bkde`, construya una función que calcule el estimador no paramétrico con un núcleo Epanechivok para un ancho de banda $h$. Llame a esta variable `f\_epa`.
- Dibuje en el mismo gráfico la estimación paramétrica y no paramétrica.
<- read.csv("data/stockres.txt")
x <- unlist(x)
x # Eliminar nombres de las columnas
names(x) <- NULL
<- seq(-0.15, 0.15, by = 0.01)
u
<- mean(x)
mu <- sd(x)
sigma
<- dnorm(u, mean = mu, sd = sigma)
f_param
<- 0.02
h
<- floor(diff(range(x)) / h)
n_bins
<- hist(x, breaks = n_bins) f_hist
<- as.data.frame(bkde(x, kernel = "epa", bandwidth = h))
f_epa
<- data.frame(x)
x_df
library(ggplot2)
ggplot(x_df, aes(x)) +
geom_histogram(
aes(y = ..density..),
binwidth = 0.02,
col = "black",
fill = "white"
+
) stat_function(fun = dnorm,
args = list(mean = mu, sd = sigma),
color = "red") +
geom_line(data = f_epa, aes(x, y), color = "blue") +
theme_minimal(base_size = 20)
Warning: The dot-dot notation (`..density..`) was deprecated in ggplot2 3.4.0.
ℹ Please use `after_stat(density)` instead.
2.3.3 Ancho de banda óptimo
Usemos la regla de la normal o también conocida como Silverman. Primero recuerde que en este caso se asume que
donde
El estimador para
Y usando el cálculo realizado anteriormente, se obtiene que
Un estimador más robusto es
¿Por qué es
<- sd(x)
s <- length(x) n
<- 1.06 * s * n^(-1 / 5)
h_normal
<- h_normal
h
<- floor(diff(range(x)) / h)
n_bins <- hist(x, breaks = n_bins, plot = FALSE)
f_hist <- as.data.frame(bkde(x, kernel = "epa", bandwidth = h))
f_epa
ggplot(x_df, aes(x)) +
geom_histogram(
aes(y = ..density..),
binwidth = h,
col = "black",
fill = "white"
+
) stat_function(fun = dnorm,
args = list(mean = mu, sd = sigma),
color = "red") +
geom_line(data = f_epa, aes(x, y), color = "blue") +
theme_minimal(base_size = 20)
<- 1.06 * min(s, IQR(x) / 1.34) * n^(-1 / 5)
h_iqr
<- h_iqr
h
<- floor(diff(range(x)) / h)
n_bins <- hist(x, breaks = n_bins, plot = FALSE)
f_hist <- as.data.frame(bkde(x, kernel = "epa", bandwidth = h))
f_epa
ggplot(x_df, aes(x)) +
geom_histogram(
aes(y = ..density..),
binwidth = h,
col = "black",
fill = "white"
+
) stat_function(fun = dnorm,
args = list(mean = mu, sd = sigma),
color = "red") +
geom_line(data = f_epa, aes(x, y), color = "blue") +
theme_minimal(base_size = 20)
Una librería más especializada es (non-parametric).
library(np)
<- seq(-0.2, 0.2, length.out = 200)
x.eval
<- npudensbw(dat = x, bwmethod = "normal-reference")
h_normal_np
<- npksum(txdat = x,
dens.ksum exdat = x.eval,
bws = h_normal_np$bw)$ksum / (n * h_normal_np$bw[1])
<- data.frame(x = x.eval, y = dens.ksum)
dens.ksum.df
ggplot(x_df, aes(x)) +
geom_histogram(
aes(y = ..density..),
binwidth = h_normal_np$bw,
col = "black",
fill = "white"
+
) stat_function(fun = dnorm,
args = list(mean = mu, sd = sigma),
color = "red") +
geom_line(data = dens.ksum.df, aes(x, y), color = "blue") +
theme_minimal(base_size = 20)
2.3.4 Validación cruzada
La forma que vimos en clase es la de validación cruzada por mínimos cuadrados``least-square cross validation’’ la cual se puede ejecutar con este comando.
<- npudensbw(
h_cv_np_ls dat = x,
bwmethod = "cv.ls",
ckertype = "epa",
ckerorder = 2
)
Multistart 1 of 1 |
Multistart 1 of 1 |
Multistart 1 of 1 |
Multistart 1 of 1 /
Multistart 1 of 1 |
Multistart 1 of 1 |
<- npudens(h_cv_np_ls)
dens.np
plot(dens.np, type = "b")
<- data.frame(x = dens.np$eval[, 1],
dens.np.df y = dens.np$dens)
ggplot(x_df, aes(x)) +
geom_histogram(
aes(y = ..density..),
binwidth = h_cv_np_ls$bw,
col = "black",
fill = "white"
+
) stat_function(fun = dnorm,
args = list(mean = mu, sd = sigma),
color = "red") +
geom_line(data = dens.np.df, aes(x, y), color = "blue") +
theme_minimal(base_size = 20)
2.3.5 Temas adicionales
** Reducción del sesgo ** Como lo mencionamos en el texto, una forma de mejorar el sesgo en la estimación es suponer que la función de densidad es más veces diferenciable.
Esto se logra asumiendo que el Kernel es más veces diferenciable.
<- npudensbw(
h_cv_np_ls dat = x,
bwmethod = "cv.ls",
ckertype = "epa",
ckerorder = 4
)
Multistart 1 of 1 |
Multistart 1 of 1 |
Multistart 1 of 1 |
Multistart 1 of 1 /
Multistart 1 of 1 |
Multistart 1 of 1 |
<- npudens(h_cv_np_ls)
dens.np
plot(dens.np, type = "b", lwd = 2)
<- data.frame(x = dens.np$eval[, 1], y = dens.np$dens)
dens.np.df
ggplot(x_df, aes(x)) +
geom_histogram(
aes(y = ..density..),
binwidth = h_cv_np_ls$bw,
col = "black",
fill = "white"
+
) stat_function(fun = dnorm,
args = list(mean = mu, sd = sigma),
color = "red") +
geom_line(data = dens.np.df, aes(x, y), color = "blue") +
theme_minimal(base_size = 20)
Otra forma de estimar el ancho de banda Otra forma de estimar ancho de bandas óptimos es usando máxima verosimilitud. Les dejo de tarea revisar la sección 1.1 del artículo de (Hall 1987) para entender su estructura.
<- npudensbw(dat = x,
h_cv_np_ml bwmethod = "cv.ml",
ckertype = "epanechnikov")
Multistart 1 of 1 |
Multistart 1 of 1 |
Multistart 1 of 1 |
Multistart 1 of 1 /
Multistart 1 of 1 |
Multistart 1 of 1 |
<- npudens(h_cv_np_ml)
dens.np
plot(dens.np, type = "b")
<- data.frame(x = dens.np$eval[, 1], y = dens.np$dens)
dens.np.df
ggplot(x_df, aes(x)) +
geom_histogram(
aes(y = ..density..),
binwidth = h_cv_np_ml$bw,
col = "black",
fill = "white"
+
) stat_function(fun = dnorm,
args = list(mean = mu, sd = sigma),
color = "red") +
geom_line(data = dens.np.df, aes(x, y), color = "blue") +
theme_minimal(base_size = 20)
<- npudensbw(
h_cv_np_ml dat = x,
bwmethod = "cv.ml",
ckertype = "epanechnikov",
ckerorder = 4
)
Multistart 1 of 1 |
Multistart 1 of 1 |
Multistart 1 of 1 |
Multistart 1 of 1 /
Multistart 1 of 1 |
Multistart 1 of 1 |
<- npudens(h_cv_np_ml)
dens.np
plot(dens.np, type = "b")
<- data.frame(x = dens.np$eval[, 1], y = dens.np$dens)
dens.np.df
ggplot(x_df, aes(x)) +
geom_histogram(
aes(y = ..density..),
binwidth = h_cv_np_ml$bw,
col = "black",
fill = "white"
+
) stat_function(fun = dnorm,
args = list(mean = mu, sd = sigma),
color = "red") +
geom_line(data = dens.np.df, aes(x, y), color = "blue") +
theme_minimal(base_size = 20)
## fani <- tibble()
## for (b in seq(0.001, 0.05, length.out = 40)) {
## f <-
## npudens(
## tdat = x,
## ckertype = "epanechnikov",
## bandwidth.compute = FALSE,
## bws = b
## )
## fani <-
## fani %>% bind_rows(tibble(
## xreal = sort(x),
## x = f$eval$x,
## y = f$dens,
## bw = b
## ))
## }
## ggplot(data = fani) +
## geom_line(aes(x, y), color = "blue") +
## labs(title = paste0("Ancho de banda = {closest_state}")) +
## theme_minimal(base_size = 20) +
## transition_states(bw) +
## view_follow()
# anim_save("manual_figure/bandwidth-animation-np.gif")
Implementar el intervalo confianza visto en clase para estimadores de densidades por núcleos y visualizarlo de en ggplot.
**Si se atreven: ¿Se podría hacer una versión animada de ese gráfico para visualizar el significado real de este el intervalo de confianza?**
2.4 Ejercicios
Del libro de (Härdle et al. 2004) hagan los siguientes ejercicios
- Sección 2: 1, 2, 3, 5, 7, 14
- Sección 3: 4, 8, 10, 11, 16,