J'essaie d'utiliser la fonction « densité » dans R pour faire des estimations de densité du noyau. J'ai de la difficulté à interpréter les résultats et à comparer divers ensembles de données car il semble que l'aire sous la courbe ne soit pas nécessairement 1. Pour toute fonction de densité de probabilité (pdf) , nous devons avoir l'aire . Je suppose que l'estimation de la densité du noyau rapporte le pdf. J'utilise integrate.xy de sfsmisc pour estimer la surface sous la courbe.∫ ∞ - ∞ ϕ ( x ) d x = 1
> # generate some data
> xx<-rnorm(10000)
> # get density
> xy <- density(xx)
> # plot it
> plot(xy)
> # load the library
> library(sfsmisc)
> integrate.xy(xy$x,xy$y)
[1] 1.000978
> # fair enough, area close to 1
> # use another bw
> xy <- density(xx,bw=.001)
> plot(xy)
> integrate.xy(xy$x,xy$y)
[1] 6.518703
> xy <- density(xx,bw=1)
> integrate.xy(xy$x,xy$y)
[1] 1.000977
> plot(xy)
> xy <- density(xx,bw=1e-6)
> integrate.xy(xy$x,xy$y)
[1] 6507.451
> plot(xy)
L'aire sous la courbe ne doit-elle pas toujours être 1? Il semble que les petites bandes passantes soient un problème, mais parfois vous voulez afficher les détails, etc. dans les queues et de petites bandes passantes sont nécessaires.
Mise à jour / réponse:
Il semble que la réponse ci-dessous à propos de la surestimation dans les régions convexes soit correcte car l'augmentation du nombre de points d'intégration semble atténuer le problème (je n'ai pas essayé d'utiliser plus de points.)
> xy <- density(xx,n=2^15,bw=.001)
> plot(xy)
> integrate.xy(xy$x,xy$y)
[1] 1.000015
> xy <- density(xx,n=2^20,bw=1e-6)
> integrate.xy(xy$x,xy$y)
[1] 2.812398
la source
Réponses:
Pensez aux utilisations de la règle trapézoïdale
integrate.xy()
. Pour la distribution normale, il sous - estimera la zone sous la courbe dans l'intervalle (-1,1) où la densité est concave (et donc l'interpolation linéaire est inférieure à la densité réelle), et la surestimera ailleurs (comme l'interpolation linéaire va au-dessus de la vraie densité). Étant donné que cette dernière région est plus grande (dans la mesure de Lesbegue, si vous le souhaitez), la règle trapézoïdale a tendance à surestimer l'intégrale. Maintenant, lorsque vous passez à des bandes passantes plus petites, la quasi-totalité de votre estimation est convexe par morceaux, avec de nombreux pics étroits correspondant aux points de données et des vallées entre eux. C'est là que la règle trapézoïdale s'effondre particulièrement mal.la source
density
plutôt qu'avecintegrate.xy
. Avec N = 10000 et pc = 1E6, vous avez de voir un peigne avec une hauteur de chaque dent d'environ 1e6, et les dents étant plus dense autour de 0. Au lieu de cela, vous voyez toujours une courbe en forme de cloche reconnaissable. Il endensity
va de même pour vous, ou du moins il devrait être utilisé différemment avec des bandes passantes minuscules:n
devrait être de (plage de données) / (bw) plutôt que par défautn=512
. L'intergrateur doit reprendre une de ces énormes valeurs quidensity
revient par une coïncidence malheureuse.C'est bon, vous pouvez corriger le décalage et la mise à l'échelle; ajouter le plus petit nombre de sorte que la densité ne soit pas négative, puis multiplier le tout par une constante telle que l'aire soit l'unité. C'est la manière la plus simple.
la source
density
fonction ne produit pas la densité "appropriée" qui s'intègre à 1 - plutôt que de savoir comment la corriger.