Densité avec réflexion
L’estimation de la densité d’une distribution sous R avec la fonction density
pose des problèmes si ses valeurs sont bornées.
L’exemple suivant est un histogramme de 1000 tirages d’une loi uniforme entre 1 et 2.
# Valeur des bornes
borne_gauche <- 1
borne_droite <- 2
# Tirage de 1000 valeurs
distribution <- runif(1000, min = borne_gauche, max = borne_droite)
# Histogramme de la distribution
hist(distribution)
L’estimation avec la fonction density
n’est pas nulle hors de l’intervalle \([1, 2]\).
# Choix d'une bande passante pour l'estimation
bande_passante <- bw.SJ(distribution)
# Estimation de la densité
d_reference <- density(distribution, bw=bande_passante)
plot(d_reference)
Censurer l’estimation avec les arguments from
et to
revient simplement de supprimer les valeurs estimées hors de l’intervalle pour obtenir la courbe rouge.
plot(d_reference, main="")
d_censuree <- density(distribution, bw=bande_passante, from=borne_gauche, to=borne_droite)
lines(d_censuree, col="red")
abline(v=borne_gauche, lty=2)
abline(v=borne_droite, lty=2)
L’estimation de la densité est donc incorrecte: elle ne somme pas à 1 et est sous-estimée près des bornes.
Le package GoFKernel (Pavia 2015) propose la fonction density.reflected
pour estimer correctement la densité précédente, en vert.
library("GoFKernel")
d_GoFKernel <- density.reflected(distribution, lower = borne_gauche, upper = borne_droite, bw = bande_passante)
plot(d_reference, main="")
d_censuree <- density(distribution, bw=bande_passante, from=borne_gauche, to=borne_droite)
lines(d_censuree, col="red")
abline(v=borne_gauche, lty=2)
abline(v=borne_droite, lty=2)
lines(d_GoFKernel, col="green")
Avec ggplot2, l’argument bounds
de geom_density()
a le même effet.
library("tidyverse")
distribution %>%
as_tibble %>%
ggplot() +
geom_density(aes(x = value), bounds = c(borne_gauche, borne_droite)) +
geom_vline(xintercept = c(borne_gauche, borne_droite), lty = 2)
Suivre les liens pour accéder au tutoriel complet:
Référence