지리적 좌표에서 커널 밀도 추정값을 계산하는 올바른 방법은 무엇입니까?


11

위도 및 경도 좌표 목록에서 2d 커널 밀도 추정값 (kde)을 계산해야합니다. 그러나 위도의 1 도는 경도의 1 도와 같은 거리가 아닙니다. 이는 개별 커널이 타원, 특히 적도에서 멀어 질수록 타원이된다는 것을 의미합니다.

제 경우에는 포인트가 모두 서로 가깝게 배치되어 평평한 지구로 변환하면 많은 문제가 발생하지 않습니다. 그러나 이것이 사실이 아닌 경우이를 올바르게 처리 해야하는 방법에 대해 여전히 궁금합니다.


첫 번째 추측으로, 적절한 구면 거리 측정법을 표준 커널 접근 방식으로 대체한다고 가정합니다.
Sycorax는 Reinstate Monica가

타원형 커널을 가지고 있다고 말하는 사람은 누구입니까?
gung-복원 Monica Monica

1
@ 궁극에 가까운 지점을 놓으면 어떻게 될지 상상해보십시오. 세로 축을 따라 압착됩니다. 그리고 실제로 극 중 하나를 다루는 커널을 어떻게 처리하겠습니까?
Aaron de Windt

당신은 모든 경도에서 똑같이 높은 기둥에 덩어리가 생길 것입니다. 왜 틀렸습니까?
gung-Monica Monica 복원

@gung 예를 들어 커널 직경을 1 도로 선택하면 모든 경도를 초과하지는 않기 때문입니다. 점이 극점에 충분히 근접하면 1 위도 인 ~ 110 km에 비해 길이가 1 미터 이상일 수 있습니다.
Aaron de Windt

답변:


7

von Mises-Fisher 밀도 와 같이 구에 특히 적합한 커널 사용을 고려할 수 있습니다.

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

여기서 및 는 3D 직교 좌표로 표현 된 단위 구의 위치입니다.μx

대역폭의 아날로그는 매개 변수 입니다. 구의 위치 에 있는 입력 지점에서 위치 대한 기여 는 가중치 이므로κxμω(μ)

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

각 에 대해 모든 입력 포인트 에 대한 이러한 기여를 합산 .xμi

예를 들어, Rvon Mises-Fisher 밀도를 계산하고 임의의 위치 및 가중치 (코드 중 12 개)를 생성하고 지정된 커널 밀도의 맵을 지정된 코드로 표시하는 코드가 있습니다. 값 ( 코드에서 과 동일 ).μiω(μi)κ6

[그림]

점 는 가중치 비례하는 영역을 갖도록 크기가 조정 된 검은 점으로 표시됩니다 . 근처의 큰 점의 기여 는 북부 위도에서 분명합니다. 주변의 밝은 노란색-흰색 패치는 직교 (공간으로부터의 지구)와 같은 적절한 투영으로 표시 될 때 대략 원형입니다.μ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))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.