Який правильний спосіб обчислення оцінки щільності ядра за географічними координатами?


11

Я повинен обчислити 2d оцінку щільності ядра (kde) зі списку координат широти та довготи. Але один градус широти не є такою ж відстані, як один градус по довготі, це означає, що окремі ядра були б овальними, особливо чим далі точка від екватора.

У моєму випадку всі точки досить близькі один до одного, що перетворення їх на плоску землю не повинно викликати багатьох проблем. Однак мені все ще цікаво, як це слід правильно вжити, якщо це не було правдою.


Перший здогад, я б припустив, що ви просто заміните відповідну метрику сферичної відстані на стандартний підхід до ядра.
Sycorax каже, що повернеться до Моніки

Хто скаже, що мати овальні ядра невірно?
gung - Відновіть Моніку

1
@gung Уявіть собі, що трапиться, якщо ви поставите крапку досить близько до стовпа. Це було б стиснене уздовж поздовжньої осі. І як би ви попрацювали з ядром, яке фактично охоплює один із полюсів?
Аарон де Віндт

У вас був би грудочок над полюсом, який однаково високий у всіх довготах. Чому це неправильно?
gung - Відновіть Моніку

@gung Тому що, якби я, наприклад, вибрав діаметр ядра 1 градус, він би не був над усіма довготями. Це було б понад 1 поздовжнього градуса, який може бути всього кілька метрів, якщо точка достатньо близька до полюса, порівняно з ~ 110 км, що становить 1 широтний градус.
Аарон де Віндт

Відповіді:


7

Можна подумати про використання ядра, особливо підходящого для сфери, наприклад, щільності фон Мізеса-Фішера

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

де та - місця на одиничній сфері, виражені в декартових 3D-координатах.xμx

Аналогом пропускної здатності є параметр . Вклад у розташування з точки входу у розташуванні на сфері, що має вагу , отжеx μ ω ( μ )κxμω(μ)

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

Для кожного підсумовуйте ці внески за всіма точками входу .μ ixμi

Для ілюстрації тут подається Rкод для обчислення щільності фон Мізеса-Фішера, генерування деяких випадкових розташувань та ваг (12 з них у коді) та відображення карти отриманої щільності ядра для заданої значення (дорівнює у коді). ω ( μ i ) κ 6μiω(μi)κ6

[Малюнок]

Точки відображаються у вигляді чорних точок розміром, щоб мати площі, пропорційні їх вазі . Внесок великої точки поблизу очевидний у всіх північних широтах. Яскравий жовто-білий наліт навколо нього буде приблизно круговим, коли зображений у відповідній проекції, наприклад, ортографічному (земля з космосу). ω ( μ i ) ( 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))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.