plot(density(rexp(100))
Offensichtlich steht die gesamte Dichte links von Null für eine Verzerrung.
Ich möchte einige Daten für Nicht-Statistiker zusammenfassen und Fragen dazu vermeiden, warum nicht-negative Daten eine Dichte links von Null aufweisen. Die Diagramme dienen der Randomisierungsprüfung. Ich möchte die Verteilung der Variablen nach Behandlungs- und Kontrollgruppen aufzeigen. Die Verteilungen sind oft exponentiell. Histogramme sind aus verschiedenen Gründen schwierig.
Eine schnelle Google-Suche gibt mir die Möglichkeit, mit Statistikern an nicht-negativen Kerneln zu arbeiten, zB: this .
Aber wurde irgendetwas davon in R implementiert? Sind einige der implementierten Methoden in irgendeiner Weise für deskriptive Statistiken "am besten"?
BEARBEITEN: Auch wenn der from
Befehl mein aktuelles Problem lösen kann, wäre es schön zu wissen, ob jemand Kernel implementiert hat, die auf Literatur zur nicht-negativen Dichteschätzung basieren
quelle
plot(density(rexp(100), from=0))
?Antworten:
Eine Lösung, die von Ansätzen zur Kantengewichtung räumlicher Statistiken übernommen wurde, besteht darin, die linke Dichte auf Null zu kürzen, aber die Daten, die am nächsten an Null liegen, zu gewichten. Die Idee ist, dass jeder Wert in einen Kern der Einheitsgesamtfläche "verteilt" wird, der bei x zentriert ist ; Jeder Teil des Kernels, der in den negativen Bereich gelangen würde, wird entfernt und der Kernel wird in Einheitsbereich umnormiert.x x
Zum Beispiel mit einem Gaußschen Kern ist das RenormalisierungsgewichtKh( y, x ) = exp( - 12( ( y- x ) / h )2) / 2 π--√
Dabei ist die kumulative Verteilungsfunktion einer Normalvariablen von Mittelwert x und Standardabweichung h . Vergleichbare Formeln sind für andere Kernel verfügbar.Φ x h
R-Code
Die
density
Funktion inR
wird sich darüber beklagen, dass die Summe der Gewichte nicht Einheit ist, weil das Integral über alle reellen Zahlen Einheit sein soll, während dieser Ansatz das Integral über positive Zahlen gleich Einheit macht. Zur Kontrolle wird das letztere Integral als Riemann-Summe geschätzt.quelle
Eine Alternative ist der Ansatz von Kooperberg und Kollegen, bei dem die Dichte mithilfe von Splines geschätzt wird, um die logarithmische Dichte der Daten zu approximieren. Ich werde ein Beispiel mit den Daten aus @ whubers Antwort zeigen, das einen Vergleich der Ansätze ermöglicht.
Dazu muss das logspline- Paket installiert sein. Installieren Sie es, wenn es nicht ist:
Laden Sie das Paket und schätzen Sie die Dichte mit der
logspline()
Funktion:Im Folgenden
d
gehe ich davon aus, dass das Objekt aus @ whubers Antwort im Arbeitsbereich vorhanden ist.Das resultierende Diagramm wird unten gezeigt, wobei die Dichte der Protokolllinien durch die rote Linie angezeigt wird
Zusätzlich kann die Unterstützung für die Dichte über Argumente
lbound
und angegeben werdenubound
. Wenn wir annehmen möchten, dass die Dichte 0 links von 0 ist und bei 0 eine Diskontinuität vorliegt, können wir dies beispielsweise fürlbound = 0
den Aufruf von verwendenlogspline()
Ergeben der folgenden Dichteschätzung (hier mit der ursprünglichen
m
Logspline-Anpassung, da die vorherige Abbildung bereits ausgelastet war).Das resultierende Diagramm ist unten dargestellt
x
x
quelle
logspline
? Für mich geht die Dichte von sowohl der begrenzten als auch der unbegrenzten Version bei nullx = 0
.Verteilungen nach Gruppen zu vergleichen (was Sie in einem Ihrer Kommentare als Ziel angeben), warum nicht etwas Einfacheres? Parallele Box-Plots funktionieren gut, wenn N groß ist. Parallele Streifenplots funktionieren, wenn N klein ist (und beide Ausreißer gut anzeigen, was Ihrer Meinung nach ein Problem in Ihren Daten ist).
quelle
Als Stéphane-Kommentar können Sie verwenden
from = 0
und zusätzlich können Sie Ihre Werte unter der Dichtekurve mit darstellenrug (x)
quelle
from=0
sieht so aus, als würde das Zeichnen für Werte unter 0 nur unterdrückt. Es korrigiert nicht die Berechnung für die Tatsache, dass ein Teil der Verteilung unter 0 verschmiert wurde.from
Befehl verwenden, erhalten Sie eine grafische Darstellung, bei der der Peak genau rechts von Null liegt. Wenn Sie sich jedoch Histogramme mit immer kleineren Behältern ansehen, wird bei vielen Daten der Spitzenwert AT Null angezeigt. Dasfrom
ist nur ein grafischer Trick.from=0
unterdrückt irgendetwas. Es startet nur das "Gitter" bei Null.density(rexp(100), from=0)
hat nichts mit der Grafik zu tun