Wie kann ich die Dichte eines Null-Inflations-Parameters in R schätzen?

10

Ich habe einen Datensatz mit vielen Nullen, der so aussieht:

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

Ich möchte eine Linie für ihre Dichte zeichnen, aber die density()Funktion verwendet ein sich bewegendes Fenster, das negative Werte von x berechnet.

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

Es gibt density(... from, to)Argumente, aber diese scheinen nur die Berechnung abzuschneiden, nicht das Fenster so zu ändern, dass die Dichte bei 0 mit den Daten übereinstimmt, wie aus dem folgenden Diagramm ersichtlich ist:

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

(Wenn die Interpolation geändert würde, würde ich erwarten, dass die schwarze Linie bei 0 eine höhere Dichte als die graue Linie hat.)

Gibt es Alternativen zu dieser Funktion, die eine bessere Berechnung der Dichte bei Null ermöglichen würden?

Geben Sie hier die Bildbeschreibung ein

Abe
quelle

Antworten:

14

Die Dichte ist bei Null unendlich, da sie eine diskrete Spitze enthält. Sie müssen die Spitze anhand des Anteils der Nullen schätzen und dann den positiven Teil der Dichte unter der Annahme schätzen, dass sie glatt ist. KDE verursacht Probleme am linken Ende, da negative Werte dadurch etwas gewichtet werden. Ein nützlicher Ansatz besteht darin, in Protokolle zu transformieren, die Dichte mithilfe von KDE zu schätzen und dann zurück zu transformieren. Siehe Wand, Marron & Ruppert (JASA 1991) für eine Referenz.

Die folgende R-Funktion führt die transformierte Dichte aus:

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

Dann gibt das Folgende die gewünschte Handlung:

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.

Geben Sie hier die Bildbeschreibung ein

Rob Hyndman
quelle
Vielen Dank für Ihre Antwort, aber ich bin verwirrt. Sie sagen "Schätzen Sie die Spitze anhand des Nullanteils", aber zeichnen Sie sie ohne Grenzen. Hat die Spitze eine diskrete Höhe oder ist sie unendlich, wenn sie diskret ist, ist sie ? P(X=0)
Abe
Dies ist eine Mischung aus einer diskreten Verteilung und einer kontinuierlichen Verteilung. Wenn als Dichte aufgetragen, ist die Spitze unendlich (tatsächlich eine Dirac-Delta-Funktion). Manchmal zeichnen Menschen den diskreten Teil als Wahrscheinlichkeitsmassenfunktion (also hat die Spitze die Höhe ) und den kontinuierlichen Teil als Dichtefunktion. Das macht wahrscheinlich ein besseres Bild, aber es beinhaltet zwei verschiedene Skalen. P(X=0)
Rob Hyndman
das ist praktisch. fyi: Es scheint, dass, obwohl bw = "SJ" die Dichte im nicht transformierten Raum beeinflusst, die Logdichte mit "SJ" und der Standardeinstellung "nrd0" dieselbe ist ... Ich bin dabei, die SJ-Referenz zu lesen: "Sheather and Jones (1991) Eine zuverlässige datenbasierte Bandbreitenauswahlmethode zur Schätzung der Kerneldichte. " jstor.org/stable/2345597
Abe
4

Ich würde Rob Hyndman zustimmen, dass Sie die Nullen separat behandeln müssen. Es gibt einige Methoden, um mit einer Kernel-Dichteschätzung einer Variablen mit begrenzter Unterstützung umzugehen, einschließlich "Reflexion", "Rernormalisierung" und "Linearkombination". Diese scheinen nicht in Rs densityFunktion implementiert worden zu sein , sind aber in Benn Janns kdensPaket für Stata verfügbar .

ein Stop
quelle
1

Eine weitere Option, wenn Sie Daten mit einer logischen Untergrenze haben (z. B. 0, aber auch andere Werte), von denen Sie wissen, dass die Daten nicht unterschritten werden und die reguläre Schätzung der Kerneldichte Werte unterhalb dieser Grenze platziert (oder wenn Sie eine Obergrenze haben) oder beides) ist die Verwendung von Logspline-Schätzungen. Das logspline-Paket für R implementiert diese und die Funktionen haben Argumente zum Festlegen der Grenzen, sodass die Schätzung an die Grenze geht, jedoch nicht darüber hinaus und immer noch auf 1 skaliert.

Es gibt auch Methoden (die oldlogsplineFunktion), die die Intervallzensur berücksichtigen. Wenn diese Nullen also keine exakten Nullen sind, sondern gerundet sind, damit Sie wissen, dass sie Werte zwischen 0 und einer anderen Zahl darstellen (z. B. eine Erkennungsgrenze), dann Sie kann diese Informationen an die Anpassungsfunktion weitergeben.

Wenn die zusätzlichen Nullen echte Nullen sind (nicht gerundet), ist die Schätzung der Spitze oder Punktmasse der bessere Ansatz, kann aber auch mit der Logspline-Schätzung kombiniert werden.

Greg Snow
quelle
0

Sie können versuchen, die Bandbreite zu verringern (blaue Linie ist für adjust=0.5), Geben Sie hier die Bildbeschreibung ein

aber wahrscheinlich ist KDE einfach nicht die beste Methode, um mit solchen Daten umzugehen.


quelle
Gibt es eine andere Methode, die Sie empfehlen würden?
Abe
@Abe Nun, das hängt davon ab, was Sie tun möchten ...