2016-11-29 5 views
1

Ich versuche, die Gaussian Kerndichte zu berechnen, und meines Wissens der density() Funktion zu testen, entschied ich, es von Grund auf neu zu berechnen und die beiden Ergebnisse zu vergleichen.Diskrepanzen in der Dichte() Kernel-Schätzer im Vergleich zu Berechnungen von Grund auf

Sie bieten jedoch nicht die gleiche Antwort.

Ich beginne mit einem vorhandenen Dataset

xi <- mtcars$mpg 

und die Kernel-Dichte dieser Daten zeichnen können, wie

plot(density(xi, kernel = "gaussian")) 

folgt, die dies bietet ...

Automated gaussian kernel density

Ich greife dann einige der d Details aus dieser Berechnung, damit meine Berechnung konsistent ist.

auto.dens <- density(xi, kernel = "gaussian") 
h <- auto.dens$bw # bandwidth for kernel 
x0 <- auto.dens$x # points for prediction 

ich die Gaußsche Kernel Dichte selbst dann berechnen, und ich habe dies in einer Schleife durchgeführt, nur damit sie besser zu lesen ist.

fx0 <- NULL 

for (j in 1:length(x0)){ 

    t <- abs(x0[j]-xi)/h 

    K <- (1/sqrt(2*pi))*exp(-(t^2)/2) 

    fx0 <- c(fx0,sum(K*t)/(length(t)*h)) 
} 

Die grundlegende Berechnung wurde in den Atmosphärische Wissenschaften, 3. Auflage, von Daniel Wilks nach den Angaben in Abschnitt 3.3.6 in Statistische Methoden konstruiert. Equation 3.13 from Wilks textbook mit dem Gauß-Kern gesetzt, wie enter image description here und t enter image description here

jedoch zu sein, und hier ist mein Problem.

ich dann die beiden Grundstücke zusammen ...

plot(y=fx0,x=x0, type="l", ylim=c(0,0.07)) 
lines(x=auto.dens$x, y=auto.dens$y, col="red") 

Die Ausgabe aus der Dichtefunktion (rot), und meine Berechnungen (schwarz), erhalte ich enter image description here

! Diese beiden Berechnungen sind deutlich anders!

Habe ich vermisst verstanden, wie die Dichtefunktion funktioniert? Warum kann ich nicht die gleichen Ergebnisse von Grund auf berechnen? Warum liefert mein Kernel Estimator unterschiedliche Ergebnisse? Warum sind meine Ergebnisse weniger glatt?

Ich muss einen Kernel-glatter (nicht nur der Dichte) zu einem viel komplizierteren Datensatz erstellen und anwenden, und nur dieses kleine Beispiel, um sicherzustellen, dass ich das gleiche wie die automatisierten Funktionen tat, und wirklich nicht Ich erwarte dieses Problem. Ich habe alle möglichen Dinge ausprobiert und kann einfach nicht verstehen, warum ich ein anderes Ergebnis bekomme.

Vielen Dank im Voraus für das Lesen und alle Kommentare, kleine oder große.

Edit: 13:40 29/11/2016 Lösung so detailliert in Antwort unten enter image description here

Antwort

2

Sie brauchen nicht zu sum(K*t), nur sum(K).

xi <- mtcars$mpg 
plot(density(xi, kernel = "gaussian"), lwd = 2) 

auto.dens <- density(xi, kernel = "gaussian") 
h <- auto.dens$bw # bandwidth for kernel 
x0 <- auto.dens$x # points for prediction 

fx0 <- NULL 
for (j in 1:length(x0)) { 
    t <- abs(x0[j]-xi)/h 
    K <- (1/sqrt(2*pi))*exp(-(t^2)/2) 
    fx0 <- c(fx0, sum(K)/(length(t)*h)) 
} 

lines(x0, fx0, col = "red", lty = "dotted") 
+0

Vielen Dank! Das behebt das Problem, und es ist klar, dass ich nur die Mathematik aus dem Lehrbuch verstehe, die nicht in den Code eingeht. Ich bin so erleichtert, dass es so ein einfaches Problem ist! – Kate2808

Verwandte Themen