J'ai un ensemble de données avec beaucoup de zéros qui ressemble à ceci:
set.seed(1)
x <- c(rlnorm(100),rep(0,50))
hist(x,probability=TRUE,breaks = 25)
Je voudrais tracer une ligne pour sa densité, mais la density()
fonction utilise une fenêtre mobile qui calcule les valeurs négatives de x.
lines(density(x), col = 'grey')
Il y a des density(... from, to)
arguments, mais ceux-ci semblent seulement tronquer le calcul, pas modifier la fenêtre afin que la densité à 0 soit cohérente avec les données comme le montre le graphique suivant:
lines(density(x, from = 0), col = 'black')
(si l'interpolation était modifiée, je m'attendrais à ce que la ligne noire ait une densité plus élevée à 0 que la ligne grise)
Existe-t-il des alternatives à cette fonction qui fourniraient un meilleur calcul de la densité à zéro?
la source
Je suis d'accord avec Rob Hyndman que vous devez traiter les zéros séparément. Il existe quelques méthodes pour traiter une estimation de densité de noyau d'une variable avec un support borné, y compris la «réflexion», la «rernormalisation» et la «combinaison linéaire». Ceux-ci ne semblent pas avoir été implémentés dans la
density
fonction de R , mais sont disponibles dans lekdens
package de Benn Jann pour Stata .la source
Une autre option lorsque vous avez des données avec une limite inférieure logique (comme 0, mais pourrait être d'autres valeurs) que vous savez que les données n'iront pas en dessous et que l'estimation de densité de noyau régulière place des valeurs en dessous de cette limite (ou si vous avez une limite supérieure , ou les deux) consiste à utiliser des estimations de la courbe de consignation. Le package logspline pour R implémente ces derniers et les fonctions ont des arguments pour spécifier les limites de sorte que l'estimation ira à la limite, mais pas au-delà et sera toujours mise à l'échelle à 1.
Il existe également des méthodes (la
oldlogspline
fonction) qui prendront en compte la censure des intervalles, donc si ces 0 ne sont pas des 0 exacts, mais sont arrondis pour que vous sachiez qu'ils représentent des valeurs comprises entre 0 et un autre nombre (une limite de détection par exemple), alors vous peut donner ces informations à la fonction d'ajustement.Si les 0 supplémentaires sont de vrais 0 (non arrondis), l'estimation du pic ou de la masse ponctuelle est la meilleure approche, mais peut également être combinée avec une estimation de la courbe de log.
la source
Vous pouvez essayer de réduire la bande passante (la ligne bleue est pour
adjust=0.5
),mais KDE n'est probablement pas la meilleure méthode pour gérer ces données.
la source