Tôi đang tạo các ô mật độ với kde2d (MASS) trên dữ liệu lat và lon. Tôi muốn biết điểm nào từ dữ liệu gốc nằm trong một đường bao cụ thể.R - Cách tìm các điểm trong đường viền cụ thể
Tôi tạo đường viền 90% và 50% bằng hai cách tiếp cận. Tôi muốn biết điểm nào nằm trong giới hạn 90% và điểm nào nằm trong đường viền 50%. Các điểm trong đường bao 90% sẽ chứa tất cả các điểm trong đường viền 50%. Bước cuối cùng là tìm các điểm trong đường viền 90% không nằm trong đường bao 50% (tôi không nhất thiết cần trợ giúp với bước này).
# bw = data of 2 cols (lat and lon) and 363 rows
# two versions to do this:
# would ideally like to use the second version (with ggplot2)
# version 1 (without ggplot2)
library(MASS)
x <- bw$lon
y <- bw$lat
dens <- kde2d(x, y, n=200)
# the contours to plot
prob <- c(0.9, 0.5)
dx <- diff(dens$x[1:2])
dy <- diff(dens$y[1:2])
sz <- sort(dens$z)
c1 <- cumsum(sz) * dx * dy
levels <- sapply(prob, function(x) {
approx(c1, sz, xout = 1 - x)$y
})
plot(x,y)
contour(dens, levels=levels, labels=prob, add=T)
Và đây là phiên bản 2 - sử dụng ggplot2. Tôi lý tưởng muốn sử dụng phiên bản này để tìm các điểm trong vòng 90% và 50% đường nét.
# version 2 (with ggplot2)
getLevel <- function(x,y,prob) {
kk <- MASS::kde2d(x,y)
dx <- diff(kk$x[1:2])
dy <- diff(kk$y[1:2])
sz <- sort(kk$z)
c1 <- cumsum(sz) * dx * dy
approx(c1, sz, xout = 1 - prob)$y
}
# 90 and 50% contours
L90 <- getLevel(bw$lon, bw$lat, 0.9)
L50 <- getLevel(bw$lon, bw$lat, 0.5)
kk <- MASS::kde2d(bw$lon, bw$lat)
dimnames(kk$z) <- list(kk$x, kk$y)
dc <- melt(kk$z)
p <- ggplot(dc, aes(x=Var1, y=Var2)) + geom_tile(aes(fill=value))
+ geom_contour(aes(z=value), breaks=L90, colour="red")
+ geom_contour(aes(z=value), breaks=L50, color="yellow")
+ ggtitle("90 (red) and 50 (yellow) contours of BW")
Tôi tạo các ô với tất cả các điểm vĩ độ và điểm được vẽ và đường nét 90% và 50%. Tôi chỉ đơn giản muốn biết cách trích xuất các điểm chính xác nằm trong các đường bao 90% và 50%.
Tôi đã cố gắng tìm các giá trị z (độ cao của các ô mật độ từ kde2d) được liên kết với mỗi hàng giá trị lat và lon nhưng không có may mắn. Tôi cũng nghĩ rằng tôi có thể thêm một cột ID vào dữ liệu để gắn nhãn mỗi hàng và sau đó bằng cách nào đó chuyển nó qua sau khi sử dụng melt()
. Sau đó, tôi có thể chỉ đơn giản là tập hợp các dữ liệu có giá trị của z phù hợp với mỗi đường viền tôi muốn và xem lat và lon nào được so sánh với dữ liệu BW ban đầu dựa trên cột ID.
Dưới đây là một bức tranh về những gì tôi đang nói về:
Tôi muốn biết điểm đỏ nằm trong đường viền 50% (màu xanh) và đó là trong đường viền 90% (màu đỏ).
Lưu ý: phần lớn mã này là từ các câu hỏi khác. Big hét lên cho tất cả những người đã đóng góp!
Cảm ơn bạn!
Khi bạn nói " trong giới hạn 90% và 50% "bạn có ý là bạn muốn biết lat/lon của tất cả các điểm mà z-val ue lớn hơn 90% hoặc 50% của tất cả các giá trị z? – eipi10
Đã chỉnh sửa được đề cập - Tôi muốn tìm các điểm màu đỏ nằm trong vòng kết nối 2 đường viền '. – squishy