Come posso stimare la densità di un parametro a zero inflazionato in R?


10

Ho un set di dati con molti zeri che assomiglia a questo:

set.seed(1)
x <- c(rlnorm(100),rep(0,50))
hist(x,probability=TRUE,breaks = 25)

Vorrei tracciare una linea per la sua densità, ma la density()funzione utilizza una finestra mobile che calcola i valori negativi di x.

lines(density(x), col = 'grey')

C'è un density(... from, to)argomento, ma questi sembrano solo troncare il calcolo, non alterare la finestra in modo che la densità a 0 sia coerente con i dati come si può vedere dal seguente diagramma:

lines(density(x, from = 0), col = 'black')

(se l'interpolazione fosse cambiata, mi aspetterei che la linea nera avrebbe una densità maggiore a 0 rispetto alla linea grigia)

Esistono alternative a questa funzione che fornirebbero un migliore calcolo della densità a zero?

inserisci qui la descrizione dell'immagine

Risposte:


14

La densità è infinita a zero perché include un picco discreto. È necessario stimare il picco usando la proporzione di zeri, quindi stimare la parte positiva della densità assumendo che sia liscia. KDE causerà problemi all'estremità sinistra perché metterà un po 'di peso sui valori negativi. Un approccio utile è trasformare in log, stimare la densità usando KDE e poi tornare indietro. Vedi Wand, Marron & Ruppert (JASA 1991) per un riferimento.

La seguente funzione R farà la densità trasformata:

logdensity <- function (x, bw = "SJ") 
{
    y <- log(x)
    g <- density(y, bw = bw, n = 1001)
    xgrid <- exp(g$x)
    g$y <- c(0, g$y/xgrid)
    g$x <- c(0, xgrid)
    return(g)
}

Quindi quanto segue fornirà la trama desiderata:

set.seed(1)
x <- c(rlnorm(100),rep(0,50))
hist(x,probability=TRUE,breaks = 25)
fit <- logdensity(x[x>0]) # Only take density of positive part
lines(fit$x,fit$y*mean(x>0),col="red") # Scale density by proportion positive
abline(v=0,col="blue") # Add spike at zero.

inserisci qui la descrizione dell'immagine


Grazie per la tua risposta, ma io sono confuso, tu dici 'stimare il picco usando la proporzione di zeri' ma traccialo senza limiti. lo spike ha un'altezza discreta o è infinito, se discreto, è ? P(X=0)
Abe

Questa è una miscela di una distribuzione discreta e una distribuzione continua. Se tracciato come densità, il picco è infinito (in realtà una funzione delta di Dirac). A volte le persone tracciano la parte discreta come una funzione di massa di probabilità (quindi lo spike ha altezza ) e la parte continua come una funzione di densità. Ciò probabilmente rende una visione migliore, ma implica due scale diverse. P(X=0)
Rob Hyndman,

questo è utile. a proposito: sembra che, sebbene bw = "SJ" influenzi la densità nello spazio non trasformato, la densità di log è la stessa usando "SJ" e il valore predefinito "nrd0" ... Sto per leggere il riferimento SJ: "Sheather e Jones (1991) Un metodo affidabile per la selezione della larghezza di banda basata sui dati per la stima della densità del kernel. " jstor.org/stable/2345597
Abe

4

Concordo con Rob Hyndman sul fatto che devi affrontare gli zeri separatamente. Esistono alcuni metodi per gestire una stima della densità del kernel di una variabile con supporto limitato, tra cui "riflessione", "rernormalizzazione" e "combinazione lineare". Questi non sembrano essere stati implementati nella densityfunzione di R , ma sono disponibili nel pacchetto di Benn Jann kdensper Stata .


1

Un'altra opzione quando si hanno dati con un limite inferiore logico (come 0, ma potrebbero essere altri valori) che si sa che i dati non scenderanno sotto e la stima della densità del kernel normale posiziona i valori sotto tale limite (o se si dispone di un limite superiore o entrambi) utilizzare le stime logspline. Il pacchetto logspline per R implementa questi e le funzioni hanno argomenti per specificare i limiti, quindi la stima andrà al limite, ma non oltre e scalerà ancora su 1.

Esistono anche metodi (la oldlogsplinefunzione) che terranno conto della censura degli intervalli, quindi se quegli 0 non sono esatti 0, ma sono arrotondati in modo da sapere che rappresentano valori compresi tra 0 e qualche altro numero (ad esempio un limite di rilevazione) può fornire tali informazioni alla funzione di adattamento.

Se gli 0 aggiuntivi sono 0 reali (non arrotondati), la stima del picco o della massa dei punti è l'approccio migliore, ma può anche essere combinato con la stima logspline.


0

Puoi provare a ridurre la larghezza di banda (la linea blu è per adjust=0.5), inserisci qui la descrizione dell'immagine

ma probabilmente KDE non è il metodo migliore per gestire tali dati.


c'è un altro metodo che consiglieresti?
Abe,

@Abe Beh, questo dipende da cosa vuoi fare ...
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.