Area sotto il "pdf" nella stima della densità del kernel in R


15

Sto cercando di usare la funzione ' densità ' in R per fare stime sulla densità del kernel. Ho qualche difficoltà a interpretare i risultati e confrontare vari set di dati in quanto sembra che l'area sotto la curva non sia necessariamente 1. Per qualsiasi funzione di densità di probabilità (pdf) , dobbiamo avere l'area . Suppongo che la stima della densità del kernel riporti il ​​pdf. Sto usando integrate.xy da sfsmisc per stimare l'area sotto la curva.φ(X)-φ(X)dX=1

> # generate some data
> xx<-rnorm(10000)
> # get density
> xy <- density(xx)
> # plot it
> plot(xy)

trama della densità

> # 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)

densità con bw = .001

> 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)

densità con bw = 1

> xy <- density(xx,bw=1e-6)
> integrate.xy(xy$x,xy$y)
[1] 6507.451
> plot(xy)

densità con bw = 1e-6

L'area sotto la curva non dovrebbe essere sempre 1? Sembra che le piccole larghezze di banda siano un problema, ma a volte si desidera mostrare i dettagli ecc. Nelle code e sono necessarie piccole larghezze di banda.

Aggiornamento / Risposta:

Sembra che la risposta di seguito sulla sopravvalutazione nelle regioni convesse sia corretta in quanto l'aumento del numero di punti di integrazione sembra ridurre il problema (non ho provato a usare più di punti).220

> xy <- density(xx,n=2^15,bw=.001)
> plot(xy)

densità con un numero maggiore di punti su cui campionare

> 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


3
Sembra una limitazione in virgola mobile in densità (): usando una larghezza di banda di 1e-6, si sta creando (in teoria) una raccolta di 10.000 picchi, ciascuno della massa totale 1/10000. Questi picchi finiscono per essere rappresentati principalmente dai loro picchi, senza che gli spazi siano adeguatamente caratterizzati. Stai semplicemente spingendo la densità () oltre i suoi limiti.
whuber

@whuber, per limitazione in virgola mobile, intendi i limiti della precisione, poiché l'utilizzo dei float porterebbe a una maggiore sovrastima dell'errore rispetto all'utilizzo dei doppi. Non credo di vedere come sarebbe potuto succedere, ma vorrei vedere alcune prove.
highBandWidth

n

1

@ Anony-Mousse, sì, questo è ciò che questa domanda sta ponendo. Perché non sta valutando 1?
highBandWidth,

Risposte:


9

Pensa agli integrate.xy()usi della regola del trapezio . Per la distribuzione normale, sottostimerà l'area sotto la curva nell'intervallo (-1,1) in cui la densità è concava (e quindi l'interpolazione lineare è inferiore alla densità reale) e la sopravvaluterà altrove (man mano che l'interpolazione lineare va sopra la vera densità). Poiché quest'ultima regione è più grande (nella misura di Lesbegue, se lo desideri), la regola del trapezio tende a sopravvalutare l'integrale. Ora, man mano che passi a larghezze di banda minori, praticamente tutte le tue stime sono convesse a tratti, con molti picchi stretti corrispondenti ai punti dati e valli tra di loro. Ecco dove la regola del trapezio si rompe particolarmente male.


ciò significa che stiamo "sovracampionando" le vette e "sottocampionando" le valli, in un certo senso ondulato a mano. Poiché la visualizzazione segue anche la regola trapezoidale (interpolazione lineare tra i campioni), sembra che una larghezza di banda del kernel sia negativa anche per la visualizzazione. Inoltre, se potessimo ottenere un numero maggiore di punti in cui calcoliamo la densità, ci sarebbe meno problemi.
highBandWidth

1
Questa spiegazione non trattiene l'acqua. Il problema è che la densità è inadeguatamente discretizzata, non che la regola del trapezio si rompa male. integra () è impotente per ottenere una risposta corretta perché la densità () non produce una rappresentazione corretta. Per vedere questo, basta controllare xy $ x: ha solo 512 valori destinati a rappresentare 10.000 punte strette!
whuber

@whuber, ecco cosa ha detto la risposta. Il punto è che devi usare la regola trapezoidale per il numero finito di campioni e sopravvaluta l'area rispetto alla densità reale su un asse continuo secondo i kernel. Il mio aggiornamento alla fine della domanda si espande su di esso.
highBandWidth

1
@high No; la regola trapezoidale sta funzionando bene. Il problema è che sta funzionando con una discretizzazione errata dell'integrando. Non puoi avere "molti picchi stretti corrispondenti ai punti dati" quando ci sono 10.000 punti dati e solo 512 valori nella matrice di densità!
whuber

1
Guardando questi grafici, ora sto pensando che il problema sia con densitypiuttosto che con integrate.xy. Con N = 10000 e BW = 1E6, si dovrebbe avere per vedere un pettine con un'altezza di ogni dente di circa 1E6, ei denti essendo più densa circa 0. Al contrario, è ancora vedere una curva a campana riconoscibile. Quindi ti densitytradisce, o almeno dovrebbe essere usato in modo diverso con larghezze di banda minime: ndovrebbe essere circa (intervallo di dati) / (bw) piuttosto che predefinito n=512. L'intergratore deve raccogliere uno di questi enormi valori che densityritorna per una infelice coincidenza.
StasK

-1

Va bene, puoi aggiustarlo cambiando e ridimensionando; aggiungi il numero più piccolo in modo tale che la densità non sia negativa, quindi moltiplica il tutto per una costante tale che l'area sia unità. Questo è il modo semplice.

L2c[φ(X)-c]+


2
Si noti che la domanda è piuttosto sul perché la densityfunzione non produce la densità "corretta" che si integra con 1, piuttosto che su come risolverlo.
Tim
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.