Basit bir yol, entegrasyon alanını rasterleştirmek ve integrale ayrı bir yaklaşım hesaplamaktır.
Dikkat edilmesi gereken bazı şeyler var:
Noktaların kapsamından daha fazlasını kapsadığınızdan emin olun: çekirdek yoğunluğu tahmininin kayda değer değerlere sahip olacağı tüm yerleri dahil etmeniz gerekir. Bu, noktaların boyutunu çekirdek bant genişliğinin üç ila dört katına (Gauss çekirdeği için) genişletmeniz gerektiği anlamına gelir.
Sonuç, raster çözünürlüğüne göre biraz değişecektir. Çözünürlük, bant genişliğinin küçük bir kısmı olmalıdır. Hesaplama süresi, rasterdeki hücre sayısı ile orantılı olduğundan, daha kaba çözünürlükler kullanarak bir dizi hesaplamanın yapılması amaçlanandan daha fazla zaman gerektirmez: daha kaba olanlar için sonuçların, en iyi çözünürlük. Değilse, daha iyi bir çözünürlük gerekebilir.
İşte 256 puanlık bir veri kümesi için bir örnek:
Noktalar, iki çekirdek yoğunluk tahminine eklenen siyah noktalar olarak gösterilir. Altı büyük kırmızı nokta algoritmanın değerlendirildiği "problar" dır. Bu, 1000 x 1000 hücre çözünürlüğünde dört bant genişliği (varsayılan 1.8 (dikey) ve 3 (yatay), 1/2, 1 ve 5 birim arasında)) için yapılmıştır. Aşağıdaki dağılım grafiği matrisi, sonuçların çok çeşitli yoğunlukları kapsayan bu altı prob noktası için bant genişliğine ne kadar güçlü bağlı olduğunu göstermektedir:
Varyasyon iki nedenden dolayı meydana gelir. Açıkçası yoğunluk tahminleri farklıdır ve bir çeşit varyasyon getirmektedir. Daha da önemlisi, yoğunluk tahminlerindeki farklılıklar herhangi bir ("prob") noktasında büyük farklılıklar yaratabilir . İkinci varyasyon, nokta kümelerinin orta yoğunluklu "saçakları" etrafında en büyüktür - tam olarak bu hesaplamanın en çok kullanılacağı yerler.
Bu, bu hesaplamaların sonuçlarını kullanma ve yorumlamada önemli dikkat gösterilmesini gerektirir, çünkü bunlar nispeten keyfi bir karara (kullanılacak bant genişliği) çok duyarlı olabilirler.
R Kodu
Algoritma, birinci fonksiyonun yarım düzine satırında bulunur f
. Kodun geri kalanını kullanımını göstermek için önceki şekilleri oluşturur.
library(MASS) # kde2d
library(spatstat) # im class
f <- function(xy, n, x, y, ...) {
#
# Estimate the total where the density does not exceed that at (x,y).
#
# `xy` is a 2 by ... array of points.
# `n` specifies the numbers of rows and columns to use.
# `x` and `y` are coordinates of "probe" points.
# `...` is passed on to `kde2d`.
#
# Returns a list:
# image: a raster of the kernel density
# integral: the estimates at the probe points.
# density: the estimated densities at the probe points.
#
xy.kde <- kde2d(xy[1,], xy[2,], n=n, ...)
xy.im <- im(t(xy.kde$z), xcol=xy.kde$x, yrow=xy.kde$y) # Allows interpolation $
z <- interp.im(xy.im, x, y) # Densities at the probe points
c.0 <- sum(xy.kde$z) # Normalization factor $
i <- sapply(z, function(a) sum(xy.kde$z[xy.kde$z < a])) / c.0
return(list(image=xy.im, integral=i, density=z))
}
#
# Generate data.
#
n <- 256
set.seed(17)
xy <- matrix(c(rnorm(k <- ceiling(2*n * 0.8), mean=c(6,3), sd=c(3/2, 1)),
rnorm(2*n-k, mean=c(2,6), sd=1/2)), nrow=2)
#
# Example of using `f`.
#
y.probe <- 1:6
x.probe <- rep(6, length(y.probe))
lims <- c(min(xy[1,])-15, max(xy[1,])+15, min(xy[2,])-15, max(xy[2,]+15))
ex <- f(xy, 200, x.probe, y.probe, lim=lims)
ex$density; ex$integral
#
# Compare the effects of raster resolution and bandwidth.
#
res <- c(8, 40, 200, 1000)
system.time(
est.0 <- sapply(res,
function(i) f(xy, i, x.probe, y.probe, lims=lims)$integral))
est.0
system.time(
est.1 <- sapply(res,
function(i) f(xy, i, x.probe, y.probe, h=1, lims=lims)$integral))
est.1
system.time(
est.2 <- sapply(res,
function(i) f(xy, i, x.probe, y.probe, h=1/2, lims=lims)$integral))
est.2
system.time(
est.3 <- sapply(res,
function(i) f(xy, i, x.probe, y.probe, h=5, lims=lims)$integral))
est.3
results <- data.frame(Default=est.0[,4], Hp5=est.2[,4],
H1=est.1[,4], H5=est.3[,4])
#
# Compare the integrals at the highest resolution.
#
par(mfrow=c(1,1))
panel <- function(x, y, ...) {
points(x, y)
abline(c(0,1), col="Red")
}
pairs(results, lower.panel=panel)
#
# Display two of the density estimates, the data, and the probe points.
#
par(mfrow=c(1,2))
xy.im <- f(xy, 200, x.probe, y.probe, h=0.5)$image
plot(xy.im, main="Bandwidth=1/2", col=terrain.colors(256))
points(t(xy), pch=".", col="Black")
points(x.probe, y.probe, pch=19, col="Red", cex=.5)
xy.im <- f(xy, 200, x.probe, y.probe, h=5)$image
plot(xy.im, main="Bandwidth=5", col=terrain.colors(256))
points(t(xy), pch=".", col="Black")
points(x.probe, y.probe, pch=19, col="Red", cex=.5)