plot(density(rexp(100))
De toute évidence, toute densité à gauche de zéro représente un biais.
Je cherche à résumer certaines données relatives aux non-statisticiens et à éviter de se demander pourquoi les données non négatives ont une densité inférieure à zéro. Les parcelles sont destinées à la vérification de la randomisation; Je veux montrer la distribution des variables par traitement et par groupe de contrôle. Les distributions sont souvent exponentielles. Les histogrammes sont délicats pour diverses raisons.
Une recherche rapide sur Google me donne le travail de statisticiens sur les noyaux non négatifs, par exemple: this .
Mais est-ce que tout cela a été implémenté dans R? Parmi les méthodes mises en œuvre, certaines d'entre elles sont-elles "meilleures" d'une manière ou d'une autre pour les statistiques descriptives?
EDIT: même si la from
commande peut résoudre mon problème actuel, il serait bon de savoir si quelqu'un a implémenté des noyaux basés sur la littérature sur l'estimation de densité non négative
la source
plot(density(rexp(100), from=0))
?Réponses:
Une solution, empruntée aux méthodes de pondération des statistiques spatiales, consiste à tronquer la densité de gauche à zéro mais à pondérer les données les plus proches de zéro. L'idée est que chaque valeur est "étalée" dans un noyau d'aire totale d'unité centrée sur x ; toute partie du noyau qui déborderait en territoire négatif est supprimée et le noyau est renormalisé en unité de surface.X X
Par exemple, avec un noyau gaussien, , le poids de renormalisation estKh(y, x ) =exp( - 12( (y- x ) / h )2) / 2 π--√
où est la fonction de distribution cumulative d'une variable normale de la moyenne x et de l'écart type h . Des formules comparables sont disponibles pour les autres noyaux.Φ X h
C’est plus simple - et beaucoup plus rapide dans les calculs - que d’essayer de réduire la largeur de bande proche de . Il est difficile de prescrire exactement comment les largeurs de bande devraient être modifiées près de 0 , de toute façon. Néanmoins, cette méthode est également ad hoc : il restera toujours un biais près de 0 . Il semble fonctionner mieux que l'estimation de densité par défaut. Voici une comparaison utilisant un jeu de données assez long:0 0 0
Le bleu indique la densité par défaut tandis que le rouge indique la densité ajustée pour le bord à . La vraie distribution sous-jacente est tracée en trait pointillé pour référence.0
Code R
La
density
fonction deR
se plaindra que la somme des poids n'est pas unitaire, car elle veut que l'intégrale de tous les nombres réels soit unitaire, alors que cette approche rend l'intégrale sur des nombres positifs égale à l'unité. À titre de contrôle, cette dernière intégrale est estimée sous forme de somme de Riemann.la source
Une alternative est l'approche de Kooperberg et ses collègues, basée sur l'estimation de la densité en utilisant des splines pour approximer la densité logarithmique des données. Je vais donner un exemple en utilisant les données de la réponse de @ whuber, ce qui permettra une comparaison des approches.
Pour cela, vous aurez besoin du paquet logspline . installez-le s'il ne l'est pas:
Chargez le package et estimez la densité à l'aide de la
logspline()
fonction:Dans ce qui suit, je suppose que l'objet
d
de la réponse de @ whuber est présent dans l'espace de travail.Le tracé obtenu est présenté ci-dessous, avec la densité de la log en boucle indiquée par la ligne rouge.
De plus, la prise en charge de la densité peut être spécifiée via des arguments
lbound
etubound
. Si nous voulons supposer que la densité est 0 à gauche de 0 et qu'il existe une discontinuité à 0, nous pourrions utiliserlbound = 0
dans l'appel àlogspline()
, par exempleProduction de l’estimation de densité suivante (illustrée ici avec l’
m
ajustement initial de la ligne de journal car la figure précédente était déjà occupée).Le graphique résultant est présenté ci-dessous
x
x
la source
logspline
? Pour moi, la densité des deux versions, la version bornée et la version non bornée va à zéro àx = 0
.Pour comparer les distributions par groupes (dont vous dites que l'objectif est l'un de vos commentaires), pourquoi ne pas quelque chose de plus simple? Les boîtes à moustaches parallèles fonctionnent bien si N est grand; Les tracés en bande parallèles fonctionnent si N est petit (et les deux montrent bien les valeurs aberrantes, ce que vous dites être un problème dans vos données).
la source
Comme Stéphane commente, vous pouvez utiliser
from = 0
et, en plus, vous pouvez représenter vos valeurs sous la courbe de densité avecrug (x)
la source
from=0
semble supprimer le tracé pour les valeurs inférieures à 0; cela ne corrige pas le calcul du fait qu'une partie de la distribution a été passée en dessous de 0.from
commande génère un tracé qui semble avoir le pic juste à zéro. Mais si vous examinez les histogrammes avec des bacs toujours plus petits, de nombreuses données indiquent le pic AT zéro. Lafrom
est juste une astuce graphique.from=0
supprime quoi que ce soit. Il commence juste la "grille" à zéro.density(rexp(100), from=0)
n'a rien à voir avec le graphique