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

Pavia, Jose M. 2015. Testing Goodness-of-Fit with the Kernel Density Estimator: GoFKernel.” Journal of Statistical Software 66 (Code Snippet 1). https://doi.org/10.18637/jss.v066.c01.
Eric Marcon
Eric Marcon
Enseignant-chercheur en écologie

Mes centres d’intérêts en recherche incluent l’écologie, l’économie et la programmation avec R.