Stimatore di densità del kernel integrato in 2D


12

Vengo da questa domanda nel caso qualcuno voglia seguire il sentiero.

Fondamentalmente ho un set di dati Ω composto da N oggetti in cui ogni oggetto ha un determinato numero di valori misurati collegati (due in questo caso):

Ω=o1[x1,y1],o2[x2,y2],...,oN[xN,yN]

Ho bisogno di un modo per determinare la probabilità di una nuova oggetto p[xp,yp] di appartenenza ad Ω così mi è stato consigliato in questa domanda per ottenere una densità di probabilità f attraverso uno stimatore densità di kernel, che credo ho già .f^

Dal momento che il mio obiettivo è quello di ottenere la probabilità di questo nuovo oggetto ( p[xp,yp] ) di appartenenza a questi dati 2D impostate Ω , mi è stato detto di integrare il pdf f over " valori del supporto per cui la densità è inferiore a quello che hai osservato ". La densità "osservato" è f valutata nel nuovo oggetto p , ossia: f ( x p , y p ) . Quindi ho bisogno di risolvere l'equazione:f^f^pf^(xp,yp)

x,y:f^(x,y)<f^(xp,yp)f^(x,y)dxdy

Il PDF del mio set di dati 2D (ottenuto tramite il modulo stats.gaussian_kde di python ) è simile al seguente:

inserisci qui la descrizione dell'immagine

dove il punto rosso rappresenta il nuovo oggetto tracciato sul PDF del mio set di dati.p[xp,yp]

Quindi la domanda è: come posso calcolare l'integrale sopra per i limiti quando il pdf è simile?x,y:f^(x,y)<f^(xp,yp)


Inserisci

Ho fatto alcuni test per vedere come ha funzionato il metodo Monte Carlo di cui ho parlato in uno dei commenti. Questo è quello che ho ottenuto:

tavolo

I valori sembrano variare un po 'di più per le aree a bassa densità con entrambe le larghezze di banda che mostrano più o meno la stessa variazione. La variazione più grande nella tabella si verifica per il punto (x, y) = (2.4,1.5) confrontando il valore di campionamento 2500 contro 1000 di Silverman, che dà una differenza di 0.0126o ~1.3%. Nel mio caso questo sarebbe ampiamente accettabile.

Modifica : ho appena notato che in 2 dimensioni la regola di Scott è equivalente a quella di Silverman secondo la definizione data qui .


2
Hai notato che il tuo stimatore non è unimodale, ma che la raccomandazione che stai seguendo si applica esplicitamente solo alle distribuzioni "unimodali"? Ciò non significa che stai facendo qualcosa di sbagliato, ma dovrebbe generare alcune riflessioni su ciò che la risposta potrebbe significare.
whuber

Ciao @whuber, in realtà la risposta a questa domanda dice che è "ben educato" per le distribuzioni unimodali, quindi ho pensato che forse avrebbe potuto funzionare sul mio problema con qualche modifica. "Ben educato" significa "funziona solo" in gergo statistico (domanda onesta)? Saluti.
Gabriel,

La mia preoccupazione principale è che KDE possa essere sensibile alla scelta della larghezza di banda e mi aspetto che il tuo integrale, specialmente per i punti marginali come quello mostrato nell'illustrazione, sia molto sensibile alla scelta. (A proposito, il calcolo stesso è facile dopo aver creato un'immagine raster come questa: è proporzionale al valore medio nell'immagine tra punti il ​​cui valore è inferiore a quello del punto "sonda".) Puoi avvicinarti questo calcolando la risposta per una gamma completa di larghezze di banda ragionevoli e vedere se cambia in modo sostanziale all'interno di tale intervallo. Altrimenti, stai bene.
whuber

Non commenterò la soluzione, ma l'integrazione può essere fatta da un semplice Monte Carlo: punti campione da (è facile, dato che kde è una miscela di densità facili da campionare) e conta la frazione di punti che ricadono all'interno della regione di integrazione (dove vale la disuguaglianza). f^
Zen,

Quante osservazioni hai nel tuo set di dati?
Hong Ooi,

Risposte:


11

Un modo semplice è rasterizzare il dominio di integrazione e calcolare un'approssimazione discreta all'integrale.

Ci sono alcune cose a cui prestare attenzione:

  1. Assicurati di coprire più dell'estensione dei punti: devi includere tutte le posizioni in cui la stima della densità del kernel avrà valori apprezzabili. Ciò significa che è necessario espandere l'estensione dei punti da tre a quattro volte la larghezza di banda del kernel (per un kernel gaussiano).

  2. Il risultato varierà leggermente con la risoluzione del raster. La risoluzione deve essere una piccola frazione della larghezza di banda. Poiché il tempo di calcolo è proporzionale al numero di celle nel raster, non richiede quasi alcun tempo aggiuntivo per eseguire una serie di calcoli utilizzando risoluzioni più grossolane di quella prevista: verificare che i risultati per quelli più grossolani convergano sul risultato per il risoluzione migliore. In caso contrario, potrebbe essere necessaria una risoluzione più fine.

Ecco un'illustrazione per un set di dati di 256 punti:

Figura 1

I punti sono mostrati come punti neri sovrapposti a due stime della densità del kernel. I sei grandi punti rossi sono "sonde" in cui viene valutato l'algoritmo. Questo è stato fatto per quattro larghezze di banda (un valore predefinito compreso tra 1,8 (verticale) e 3 (orizzontale), 1/2, 1 e 5 unità) con una risoluzione di 1000 per 1000 celle. La seguente matrice scatterplot mostra quanto i risultati dipendono dalla larghezza di banda per questi sei punti della sonda, che coprono una vasta gamma di densità:

figura 2

La variazione si verifica per due motivi. Ovviamente le stime di densità differiscono, introducendo una forma di variazione. Ancora più importante, le differenze nelle stime della densità possono creare grandi differenze in ogni singolo punto ("sonda"). Quest'ultima variazione è maggiore intorno alle "frange" di media densità di gruppi di punti, esattamente quelle posizioni in cui è probabile che questo calcolo venga maggiormente utilizzato.

Ciò dimostra la necessità di una sostanziale cautela nell'uso e nell'interpretazione dei risultati di questi calcoli, poiché possono essere così sensibili a una decisione relativamente arbitraria (la larghezza di banda da utilizzare).


Codice R

L'algoritmo è contenuto nella mezza dozzina di righe della prima funzione f,. Per illustrarne l'uso, il resto del codice genera le figure precedenti.

library(MASS)     # kde2d
library(spatstat) # im class
f <- function(xy, n, x, y, ...) {
  #
  # Estimate the total where the density does not exceed that at (x,y).
  #
  # `xy` is a 2 by ... array of points.
  # `n`  specifies the numbers of rows and columns to use.
  # `x` and `y` are coordinates of "probe" points.
  # `...` is passed on to `kde2d`.
  #
  # Returns a list:
  #   image:    a raster of the kernel density
  #   integral: the estimates at the probe points.
  #   density:  the estimated densities at the probe points.
  #
  xy.kde <- kde2d(xy[1,], xy[2,], n=n, ...)
  xy.im <- im(t(xy.kde$z), xcol=xy.kde$x, yrow=xy.kde$y) # Allows interpolation $
  z <- interp.im(xy.im, x, y)                            # Densities at the probe points
  c.0 <- sum(xy.kde$z)                                   # Normalization factor $
  i <- sapply(z, function(a) sum(xy.kde$z[xy.kde$z < a])) / c.0
  return(list(image=xy.im, integral=i, density=z))
}
#
# Generate data.
#
n <- 256
set.seed(17)
xy <- matrix(c(rnorm(k <- ceiling(2*n * 0.8), mean=c(6,3), sd=c(3/2, 1)), 
               rnorm(2*n-k, mean=c(2,6), sd=1/2)), nrow=2)
#
# Example of using `f`.
#
y.probe <- 1:6
x.probe <- rep(6, length(y.probe))
lims <- c(min(xy[1,])-15, max(xy[1,])+15, min(xy[2,])-15, max(xy[2,]+15))
ex <- f(xy, 200, x.probe, y.probe, lim=lims)
ex$density; ex$integral
#
# Compare the effects of raster resolution and bandwidth.
#
res <- c(8, 40, 200, 1000)
system.time(
  est.0 <- sapply(res, 
           function(i) f(xy, i, x.probe, y.probe, lims=lims)$integral))
est.0
system.time(
  est.1 <- sapply(res, 
           function(i) f(xy, i, x.probe, y.probe, h=1, lims=lims)$integral))
est.1
system.time(
  est.2 <- sapply(res, 
           function(i) f(xy, i, x.probe, y.probe, h=1/2, lims=lims)$integral))
est.2
system.time(
  est.3 <- sapply(res, 
           function(i) f(xy, i, x.probe, y.probe, h=5, lims=lims)$integral))
est.3
results <- data.frame(Default=est.0[,4], Hp5=est.2[,4], 
                      H1=est.1[,4], H5=est.3[,4])
#
# Compare the integrals at the highest resolution.
#
par(mfrow=c(1,1))
panel <- function(x, y, ...) {
  points(x, y)
  abline(c(0,1), col="Red")
}
pairs(results, lower.panel=panel)
#
# Display two of the density estimates, the data, and the probe points.
#
par(mfrow=c(1,2))
xy.im <- f(xy, 200, x.probe, y.probe, h=0.5)$image
plot(xy.im, main="Bandwidth=1/2", col=terrain.colors(256))
points(t(xy), pch=".", col="Black")
points(x.probe, y.probe, pch=19, col="Red", cex=.5)

xy.im <- f(xy, 200, x.probe, y.probe, h=5)$image
plot(xy.im, main="Bandwidth=5", col=terrain.colors(256))
points(t(xy), pch=".", col="Black")
points(x.probe, y.probe, pch=19, col="Red", cex=.5)

Incredibile risposta, anche se non sono sicuro di aver capito il significato delle Defaulte Hp5larghezze di banda (presumo H1e H5media h=1e h=5) è Hp5il valore h=1/2? Se sì, cos'è Default?
Gabriel,

1
La tua comprensione è corretta. ("p5" significa ".5".) L'impostazione predefinita viene calcolata automaticamente kde2dutilizzando bandwidth.nrd. Per i dati del campione è uguale a nella direzione orizzontale e nella direzione verticale, all'incirca a metà strada tra i valori di e nel test. Si noti che queste larghezze di banda predefinite sono abbastanza grandi da posizionare una proporzione apprezzabile della densità totale ben oltre l'estensione dei punti stessi, motivo per cui tale estensione deve essere espansa indipendentemente dall'algoritmo di integrazione che si potrebbe scegliere di utilizzare. 1,85 1 531.8515
whuber

Quindi capisco correttamente se dico che aumentando la larghezza di banda utilizzata aumenta anche l'estensione del risultato kde(e quindi devo estendere i limiti di integrazione)? Dato che posso convivere con un errore <10%nel valore risultante dell'integrale, cosa ne pensi dell'uso della regola di Scott?
Gabriel,

Penso che poiché queste regole sono state sviluppate per obiettivi completamente diversi, dovresti sospettare che potrebbero non funzionare bene per i tuoi scopi, specialmente se si tratta di implementare un suggerimento fatto su stats.stackexchange.com/questions/63263 . È prematuro preoccuparsi di quale regola empirica potresti usare per KDE; in questa fase dovresti preoccuparti seriamente se l'intero approccio funzionerà in modo affidabile.
whuber

1
Gratta quanto sopra. Ho fare avere un modo di sapere se l'implementazione è in funzione e anche di quantificare quanto bene si sta lavorando. È un po 'complicato e richiede tempo, ma posso (dovrei essere in grado di farlo).
Gabriel,

1

Se hai un numero decente di osservazioni, potrebbe non essere necessario fare alcuna integrazione. Supponi che il tuo nuovo punto sia . Supponiamo di avere uno stimatore di densità ; sommare il numero di osservazioni per le quali e dividere per la dimensione del campione. Questo ti dà un'approssimazione della probabilità richiesta. f x f ( x )< f ( x 0)x0f^xf^(x)<f^(x0)

Ciò presuppone che non sia "troppo piccolo" e che la dimensione del campione sia sufficientemente grande (e sufficientemente estesa) per fornire una stima decente nelle regioni a bassa densità. Tuttavia, 20000 casi sembrano abbastanza grandi, per il bivariato .xf^(x0)x


Sarebbe benvenuta un'analisi quantitativa di questa raccomandazione, o almeno un esempio di un'applicazione effettiva. Sospetto che l'accuratezza della tua proposta dipenda fortemente dalla forma del kernel. Ciò mi renderebbe riluttante a fare affidamento su un tale calcolo senza uno studio sostanziale delle sue proprietà.
whuber
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.