从地理坐标计算内核密度估计的正确方法是什么?


11

我必须从经度和纬度坐标列表中计算2d内核密度估计值(kde)。但是,纬度一度与经度一度的距离是不同的,这意味着各个内核将是椭圆形的,尤其是该点距赤道越远。

在我的情况下,这些点都足够接近,因此将它们转换为平坦的地球不会引起很多问题。但是,我仍然对在不正确的情况下应该如何正确处理感到好奇。


最初的猜测是,我假设您只是将适当的球距度量替换为标准的内核方法。
Sycorax说恢复莫妮卡

谁说椭圆形的内核是不正确的?
gung-恢复莫妮卡

1
@gung试想一下,如果将点放置在离极点足够近的地方会发生什么。它将沿着纵轴被挤压。您将如何处理实际上覆盖其中一个极点的内核?
亚伦·德·温特15/09/16 '18

在所有经度上,您在杆子上的结块都一样高。为什么不正确?
gung-恢复莫妮卡

@gung因为,例如,如果我选择1度的内核直径,它就不会覆盖所有经度。如果该点距离极点足够近,则将超过1个纵向度,而与1个纬度的〜110 km相比,可能只有几米。
亚伦·德温特

Answers:


7

您可能会考虑使用特别适合球体的核,例如von Mises-Fisher密度

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

其中和是单位球面上以3D笛卡尔坐标表示的位置。Xμx

带宽的模拟量是参数。因此,从输入点到球体上位置的权重为的位置的贡献为X μ ω μ κxμω(μ)

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

对于每个,将所有输入点这些贡献。μ xμi

为了说明这一点,这里是R计算冯·米塞斯-费舍尔密度的代码,生成一些随机位置和权重(在代码中有12个),并显示指定密度下生成的内核密度的映射值(在代码中等于)。 ω μ κ 6μiω(μi)κ6

[数字]

点以黑点显示,其大小与权重。在整个北纬地区,附近的大圆点的贡献是显而易见的。当以适当的投影形式显示时,如正投影(太空中的地球),其周围的亮黄白色斑块将近似为圆形。 ω μ 100 60 μiω(μi)(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))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.