Wie lässt sich die Schätzung der Kerneldichte anhand der geografischen Koordinaten richtig berechnen?

11

Ich muss die 2d-Kernel-Dichteschätzung (kde) aus einer Liste von Breiten- und Längenkoordinaten berechnen. Ein Breitengrad ist jedoch nicht derselbe Abstand wie ein Längengrad. Dies bedeutet, dass die einzelnen Kerne oval sind, insbesondere je weiter der Punkt vom Äquator entfernt ist.

In meinem Fall sind die Punkte alle nahe genug beieinander, so dass die Umwandlung in flache Erde nicht viele Probleme verursachen sollte. Ich bin jedoch immer noch gespannt, wie dies richtig gehandhabt werden soll, falls dies nicht der Fall ist.

Aaron de Windt
quelle
Als erste Vermutung würde ich annehmen, dass Sie einfach eine geeignete sphärische Distanzmetrik in einen Standard-Kernel-Ansatz einsetzen würden.
Sycorax sagt Reinstate Monica
Wer soll sagen, dass es falsch ist, ovale Kerne zu haben?
Gung - Reinstate Monica
1
@gung Stellen Sie sich vor, was passieren würde, wenn Sie einen Punkt nahe genug an einer Stange platzieren. Es würde entlang der Längsachse zusammengedrückt werden. Und wie würden Sie mit einem Kernel umgehen, der tatsächlich einen der Pole bedeckt?
Aaron de Windt
Sie hätten einen Klumpen über der Stange, der in allen Längen gleich hoch ist. Warum ist das falsch?
Gung - Reinstate Monica
@gung Denn wenn ich zum Beispiel einen Kerneldurchmesser von 1 Grad wähle, wäre das nicht über alle Längen. Es wäre über 1 Längsgrad, was nur wenige Meter sein kann, wenn der Punkt nahe genug am Pol liegt, verglichen mit den ~ 110 km, die 1 Breitengrad sind.
Aaron de Windt

Antworten:

7

Sie können einen Kernel verwenden, der besonders für die Kugel geeignet ist, z. B. eine von Mises-Fisher-Dichte

f(x;;κ,μ)exp(κμ'x)

wo und xμx Orte auf der Einheitskugel, ausgedrückt in kartesischen 3D-Koordinaten.

Das Analogon der Bandbreite ist der Parameter . Der Beitrag zu einem Ort x von einem Eingangspunkt am Ort μ auf der Kugel mit dem Gewicht ω ( μ ) beträgt daherκxμω(μ)

ω(μ)f(x;;κ,μ).

xμich .

Rμichω(μich)κ6

[Zahl]

μichω(μich)(100,60)

#
# von Mises-Fisher density.
# mu is the location and x the point of evaluation, *each in lon-lat* coordinates.
# Optionally, x is a two-column array.
#
dvonMises <- function(x, mu, kappa, inDegrees=TRUE) {
  lambda <- ifelse(inDegrees, pi/180, 1)
  SphereToCartesian <- function(x) {
    x <- matrix(x, ncol=2)
    t(apply(x, 1, function(y) c(cos(y[2])*c(cos(y[1]), sin(y[1])), sin(y[2]))))
  }
  x <- SphereToCartesian(x * lambda)
  mu <- matrix(SphereToCartesian(mu * lambda), ncol=1)

  c.kappa <- kappa / (2*pi*(exp(kappa) - exp(-kappa)))
  c.kappa * exp(kappa * x %*% mu)
}
#
# Define a grid on which to compute the kernel density estimate.
#
x.coord <- seq(-180, 180, by=2)
y.coord <- seq(-90, 90, by=1)
x <- as.matrix(expand.grid(lon=x.coord, lat=y.coord))
#
# Give the locations.
#
n <- 12
set.seed(17)
mu <- cbind(runif(n, -180, 180), asin(runif(n, -1, 1))*180/pi)
#
# Weight them.
#
weights <- rexp(n)
#
# Compute the kernel density.
#
kappa <- 6
z <- numeric(nrow(x))
for (i in 1:nrow(mu)) {
  z <- z + weights[i] * dvonMises(x, mu[i, ], kappa)
}
z <- matrix(z, nrow=length(x.coord))
#
# Plot the result.
#
image(x.coord, y.coord, z, xlab="Longitude", ylab="Latitude")
points(mu[, 1], mu[, 2], pch=16, cex=sqrt(weights))
whuber
quelle