地理座標からカーネル密度推定を計算する適切な方法は何ですか?


11

緯度と経度の座標のリストから2Dカーネル密度推定(kde)を計算する必要があります。しかし、緯度の1度は経度の1度と同じ距離ではありません。これは、個々の核が楕円形になることを意味します。特に、赤道から離れているほどポイントが大きくなります。

私の場合、ポイントはすべて互いに非常に接近しているため、それらを平らな地球に変換しても多くの問題は発生しません。ただし、これが正しくなかった場合に、これを適切に処理する方法については、まだ知りたいと思っています。


最初の推測として、適切な球面距離メトリックを標準のカーネルアプローチに置き換えるだけだと思います。
Sycoraxは、モニカを2015

だれが楕円形のカーネルを持っているのが間違っていると言うのですか
ガン-モニカの復活

1
@gungポールに十分近い位置にポイントを配置するとどうなるか想像してみてください。縦軸に沿って絞られます。そして、極の1つを実際にカバーするカーネルをどのように処理しますか?
アーロンデウィント2015

あなたはすべての経度で等しく高い極の上のしこりを持っているでしょう。なぜそれが間違っているのですか?
ガン-モニカの復活

@gungたとえば、たとえばカーネルの直径を1度に設定すると、すべての経度に及ぶわけではないからです。経度が1度を超える場合、ポイントが極に十分に近ければ、数メートルになることがあります。
アーロンドヴィント2015

回答:


7

フォンミーゼスフィッシャー密度など、球に特に適したカーネルの使用を検討してください。

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

ここで、およびは、3Dデカルト座標で表された単位球上の位置です。Xμx

帯域幅の類似物はパラメータです。したがって、球の位置にある入力点から位置への寄与は、重みを持つため、次のようになります。X μ ω μ κxμω(μ)

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

ごとに、すべての入力点に対するこれらの寄与を合計します。μ Ixμi

例としてR、フォンミーゼスフィッシャー密度を計算し、いくつかのランダムな位置と重み(コード内のそれらの12)を生成し、指定されたカーネル密度のマップを表示するコードを次に示します値(コードのと等しい)。 ω μ Iκ 6μiω(μi)κ6

[図]

ポイントは、重み比例する面積を持つようにサイズ設定された黒い点として表示されます。近くの大きな点の寄与は、北緯全体で明らかです。その周りの明るい黄白色のパッチは、正射投影法(宇宙からの地球)などの適切な投影法で表示すると、ほぼ円形になります。 ω μ I100 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))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.