Cách thích hợp để tính toán ước tính mật độ hạt nhân từ tọa độ địa lý là gì?


11

Tôi phải tính toán ước tính mật độ hạt nhân 2d (kde) từ danh sách tọa độ kinh độ và vĩ độ. Nhưng một độ vĩ độ không phải là khoảng cách tương đương với một độ theo kinh độ, điều này có nghĩa là các hạt riêng lẻ sẽ có hình bầu dục, đặc biệt điểm càng xa từ đường xích đạo.

Trong trường hợp của tôi, các điểm đều đủ gần nhau để biến chúng thành trái đất phẳng không gây ra nhiều vấn đề. Tuy nhiên tôi vẫn tò mò về cách xử lý việc này đúng cách trong trường hợp điều này không đúng.


Theo phỏng đoán đầu tiên, tôi cho rằng bạn chỉ cần thay thế một thước đo khoảng cách hình cầu phù hợp thành một cách tiếp cận hạt nhân tiêu chuẩn.
Sycorax nói Phục hồi lại

Ai sẽ nói rằng có nhân hình bầu dục là không chính xác?
gung - Tái lập Monica

1
@gung Chỉ cần tưởng tượng những gì sẽ xảy ra nếu bạn đặt một điểm đủ gần với một cực. Nó sẽ được ép dọc theo trục dọc. Và làm thế nào bạn sẽ xử lý một hạt nhân thực sự bao phủ một trong các cực?
Aaron de Windt

Bạn sẽ có một cục trên cột cao không kém ở mọi kinh độ. Tại sao điều đó không chính xác?
gung - Phục hồi Monica

@gung Bởi vì nếu tôi chọn đường kính hạt nhân là 1 độ thì nó sẽ không vượt quá mọi kinh độ. Nó sẽ là hơn 1 độ dọc có thể chỉ là vài mét nếu điểm đó đủ gần cực, so với ~ 110 km mà 1 độ vĩ độ là.
Aaron de Windt

Câu trả lời:


7

Bạn có thể cân nhắc sử dụng hạt nhân đặc biệt phù hợp với hình cầu, chẳng hạn như mật độ von Mises-Fisher

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

nơi x là địa điểm trên mặt cầu đơn vị bày tỏ trong tọa độ 3D Descartes.μx

Tương tự của băng thông là tham số . Sự đóng góp đến một vị trí x từ một điểm đầu vào tại vị trí μ trên mặt cầu, có trọng lượng ω ( μ ) , do đóκxμω(μ)

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

xμi

Rμiω(μi)κ6

[Nhân vật]

μ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))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.