วิธีที่เหมาะสมในการคำนวณความหนาแน่นของเคอร์เนลจากพิกัดทางภูมิศาสตร์คืออะไร?


11

ฉันต้องคำนวณการประมาณความหนาแน่นเคอร์เนล 2d (kde) จากรายการพิกัดละติจูดและลองจิจูด แต่ละติจูดหนึ่งองศานั้นไม่ได้อยู่ในระยะเดียวกันกับลองจิจูดหนึ่งองศาซึ่งหมายความว่าเมล็ดของแต่ละบุคคลจะเป็นรูปวงรีโดยเฉพาะยิ่งไปกว่านั้นจุดนั้นมาจากเส้นศูนย์สูตร

ในกรณีของฉันคะแนนทั้งหมดอยู่ใกล้กันพอที่จะเปลี่ยนเป็นโลกเรียบไม่ควรทำให้เกิดปัญหามากมาย อย่างไรก็ตามฉันยังสงสัยว่าควรจัดการอย่างเหมาะสมอย่างไรในกรณีที่ไม่เป็นจริง


เป็นการเดาแรกฉันจะสมมติว่าคุณเพียงแค่แทนที่ตัวชี้วัดระยะทางทรงกลมที่เหมาะสมเป็นวิธีเคอร์เนลมาตรฐาน
Sycorax พูดว่า Reinstate Monica

ใครบอกว่าการมีเมล็ดรูปไข่ไม่ถูกต้อง
gung - Reinstate Monica

1
@ gung แค่คิดว่าจะเกิดอะไรขึ้นถ้าคุณวางจุดใกล้กับเสา มันจะถูกบีบตามแนวแกนตามยาว และคุณจะจัดการเคอร์เนลที่ครอบคลุมเสาหนึ่งอันได้อย่างไร?
Aaron de Windt

คุณจะมีก้อนก้อนหนึ่งเหนือเสาที่สูงเท่ากันทุกลองจิจูด ทำไมจึงไม่ถูกต้อง
gung - Reinstate Monica

@gung เพราะถ้าฉันเลือกขนาดเส้นผ่านศูนย์กลางของเคอร์เนล 1 องศามันจะไม่เกินความยาวทั้งหมด มันจะเป็นมากกว่า 1 องศาตามยาวซึ่งอาจจะเป็นเพียงไม่กี่เมตรถ้าจุดนั้นอยู่ใกล้กับเสามากพอเทียบกับ ~ 110 กม. ที่ 1 องศาของละติจูด
Aaron de Windt

คำตอบ:


7

คุณอาจพิจารณาใช้เคอร์เนลโดยเฉพาะอย่างยิ่งเหมาะสำหรับทรงกลมเช่นความหนาแน่นฟอน Mises-Fisher

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

โดยที่และxเป็นตำแหน่งบนหน่วยรูปทรงกลมแสดงในพิกัดคาร์ทีเซียน 3Dμx

อนาล็อกของแบนด์วิดธ์เป็นพารามิเตอร์κการมีส่วนร่วมในตำแหน่งxจากจุดอินพุตที่ตำแหน่งμบนทรงกลมมีน้ำหนักω ( μ )ดังนั้นจึงเป็นκxμω(μ)

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

xμiฉัน

Rμ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.