Tôi đang thử nghiệm với các cách để đối phó với overplotting trong R, và một điều tôi muốn thử là để vẽ các điểm cá nhân nhưng màu chúng bởi mật độ của khu phố của họ. Để làm được điều này, tôi cần tính toán ước tính mật độ hạt nhân 2D tại mỗi điểm. Tuy nhiên, có vẻ như các hàm ước lượng mật độ hạt nhân chuẩn đều dựa trên lưới. Có chức năng tính toán mật độ hạt nhân 2D tại các điểm cụ thể mà tôi chỉ định không? Tôi sẽ tưởng tượng một hàm lấy các vector v và y làm đối số và trả về một vectơ các ước tính mật độ.Làm thế nào tôi có thể nhận được giá trị của một ước tính mật độ hạt nhân tại các điểm cụ thể?
Trả lời
Cuối cùng tôi đã tìm thấy hàm chính xác mà tôi đang tìm kiếm: interp.surface
từ gói fields
. Từ văn bản trợ giúp:
Sử dụng trọng số lôgic để nội suy các giá trị trên lưới hình chữ nhật đến vị trí tùy ý hoặc sang lưới khác.
Tôi biết đây là cũ ... nhưng đã làm 'lĩnh vực :: interp.surface' làm việc cho bạn? Nó không hoạt động đối với tôi với ví dụ đồ chơi ở trên vì kích thước không khớp giữa 'newdata' và đầu ra' interp.surface'. Xem http://stackoverflow.com/questions/43896337/use-fieldsinterp-surface-to-interpolate-from-grid-to-irregular-points. – bstock
Nếu tôi hiểu những gì bạn muốn làm, nó có thể đạt được bằng cách lắp một mô hình làm mịn ước tính mật độ lưới điện và sau đó sử dụng mà để dự đoán mật độ tại mỗi điểm bạn quan tâm Ví dụ:.
# Simulate some data and put in data frame DF
n <- 100
x <- rnorm(n)
y <- 3 + 2* x * rexp(n) + rnorm(n)
# add some outliers
y[sample(1:n,20)] <- rnorm(20,20,20)
DF <- data.frame(x,y)
# Calculate 2d density over a grid
library(MASS)
dens <- kde2d(x,y)
# create a new data frame of that 2d density grid
# (needs checking that I haven't stuffed up the order here of z?)
gr <- data.frame(with(dens, expand.grid(x,y)), as.vector(dens$z))
names(gr) <- c("xgr", "ygr", "zgr")
# Fit a model
mod <- loess(zgr~xgr*ygr, data=gr)
# Apply the model to the original data to estimate density at that point
DF$pointdens <- predict(mod, newdata=data.frame(xgr=x, ygr=y))
# Draw plot
library(ggplot2)
ggplot(DF, aes(x=x,y=y, color=pointdens)) + geom_point()
Hoặc, nếu tôi chỉ cần thay đổi n 10^6 chúng tôi nhận
Đúng, đó là chính xác những gì tôi muốn. Cảm ơn! –
Thực ra, một mô hình loess có thể dẫn đến việc làm mịn quá mức các giá trị. Mật độ hạt nhân đã làm mịn. Có cách nào để chỉ để bilinear (hoặc bicubic) nội suy từ các giá trị lưới điện? –
Nếu bạn cẩn thận thiết lập các thông số khoảng để loess đến một giá trị khá thấp, bạn sẽ nhận được hành vi khá nhiều những gì bạn muốn tôi nghĩ. Có thể có những cách khác nữa. –
Có lý do cụ thể nào về việc pha trộn alpha hoặc các phương pháp tiếp cận tiêu chuẩn hơn (như hình lục giác) không đủ? – joran
Tôi muốn các ngoại lệ hiển thị rõ ràng dưới dạng các điểm riêng lẻ. Alpha belnding làm cho các ngoại lệ mờ nhạt, và hình lục giác binning biến chúng thành toàn bộ hình lục giác thay vì các điểm duy nhất. Ước tính mật độ hạt nhân trên toàn bộ lưới là một công việc tốt cho hầu hết dữ liệu, nhưng tất cả các điểm ngoại lệ đều biến thành một số "puff" nhỏ, vì vậy tôi muốn tính toán ước lượng mật độ hạt nhân và sử dụng nó để gán màu cho mỗi điểm . Điều này sẽ tạo ra cơ bản sự xuất hiện tương tự như cách tiếp cận dựa trên lưới ở bất cứ nơi nào có nhiều điểm trùng lặp, nhưng sẽ làm cho các ngoại lệ hiển thị rõ ràng dưới dạng các điểm rời rạc. –