在2D中集成内核密度估计器


12

我来自这个问题,以防有人要跟踪。

基本上,我有一个由对象组成的数据集,其中每个对象都具有给定数量的测量值(在这种情况下为两个):ΩN

Ω=o1[x1,y1],o2[x2,y2],...,oN[xN,yN]

我需要一种确定对象属于的概率的方法,因此建议我通过内核密度估计器获得概率密度,我相信我已经有。p[xp,yp]˚FΩf^

由于我的目标是获得这个新对象的概率(属于这个二维数据集),有人告诉我到PDF集成在“ 为其支持的值密度小于您观察到的密度 ”。在新对象评估“观察”密度,即:。所以我需要求解方程:Ω ˚F ˚F p ˚FX pÿ pp[xp,yp]Ωf^f^pf^(xp,yp)

x,y:f^(x,y)<f^(xp,yp)f^(x,y)dxdy

我的2D数据集的PDF(通过python的stats.gaussian_kde模块获得)如下所示:

在此处输入图片说明

红点代表新对象绘制在我的数据集的PDF上。p[xp,yp]

所以问题是:当pdf看起来像这样时,如何计算极限的上述积分?x,y:f^(x,y)<f^(xp,yp)


我进行了一些测试,以查看我在评论之一中提到的蒙特卡洛方法的效果。这是我得到的:

表

对于较低密度的区域,该值似乎会有更多变化,两个带宽或多或少都显示出相同的变化。比较Silverman的2500和1000样本值时,表中最大的变化发生在点(x,y)=(2.4,1.5)处,其差值为0.0126~1.3%。就我而言,这在很大程度上是可以接受的。

编辑:我只是注意到,根据此处给出的定义,在二维中Scott的规则等效于Silverman的规则。


2
您是否注意到您的估计量不是单峰的,但是您遵循的建议明确仅适用于“单峰”分布?这并不意味着您做错了什么,但是应该引起人们对答案可能意味着什么的思考。
ub

@whuber,您好,实际上,该问题的答案表明,对于单峰分布,它“表现良好”,因此我认为也许可以通过一些修改解决我的问题。用统计术语(诚实的问题),“表现良好”是否表示“仅适用”?干杯。
加百利

我主要担心的是,KDE可能对带宽的选择很敏感,我希望您的积分,特别是对于如图所示的边缘位置,对选择带宽非常敏感。(顺便说一句,一旦创建了这样的光栅图像,计算本身就很容易:它与图像中小于“探针”点的点之间的平均值成比例。)通过计算合理带宽的整个范围的答案,并查看它在该范围内是否有任何实质性的变化来实现这一点。如果没有,那很好。
ub

我不会对此解决方案发表评论,但是可以通过简单的Monte Carlo来完成集成:从采样点(这很容易,因为kde是易于采样的密度的混合物),然后进行计数落在积分区域(不等式所在的区域)内的点的分数。f^
2013年

您的数据集中有多少个观测值?
Hong Ooi

Answers:


11

一种简单的方法是栅格化积分域,并计算积分的离散近似值。

有一些注意事项:

  1. 确保涵盖的内容不仅仅包括重点:您需要包括内核密度估计将具有任何可观值的所有位置。这意味着您需要将点的范围扩展到内核带宽的三到四倍(对于高斯内核)。

  2. 结果将随栅格的分辨率而有所不同。 分辨率需要是带宽的一小部分。由于计算时间与栅格中的像元数量成正比,因此使用比预期的分辨率更粗糙的分辨率执行一系列计算几乎不需要花费额外的时间:检查较粗糙的分辨率的结果是否收敛于最高分辨率。如果不是,则可能需要更高的分辨率。

这是256个点的数据集的说明:

图1

这些点显示为叠加在两个内核密度估计值上的黑点。六个大的红色点是评估该算法的“探针”。对于四个带宽(默认值为1.8(垂直)和3(水平),1 / 2、1和5个单位),分辨率为1000 x 1000个单元。以下散点图矩阵显示了结果在多大程度上取决于这六个探测点的带宽,这六个探测点涵盖了广泛的密度:

图2

发生变化的原因有两个。显然,密度估算值是不同的,引入了一种变化形式。更重要的是,密度估计值的差异会在任何单个(“探针”)点产生较大差异。后者的变化在点的群集的中等密度“条纹”附近最大,恰恰是最可能使用此计算的位置。

这表明在使用和解释这些计算结果时需要格外谨慎,因为它们对相对任意的决定(要使用的带宽)非常敏感。


R代码

该算法包含在第一个函数的六行中f。为了说明其用法,其余代码生成了前面的图。

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)

令人惊奇的答案,尽管我不确定我是否了解DefaultHp5带宽的含义(我假设H1H5表示h=1h=5)是Hp5h=1/2吗?如果是这样,那是Default什么?
加百利

1
您的理解是正确的。(“P5”的意思是” 0.5" 。)默认值由自动计算kde2d使用bandwidth.nrd。对于样本数据,它在水平方向上等于,在垂直方向上等于,大约是测试中值和之间的一半。请注意,这些默认带宽足够大,足以使总密度中的一定比例远超出点本身的范围,这就是为什么无论您选择使用哪种集成算法,都需要扩展该范围的原因。31.8515
ub

因此,如果我说随着带宽增加,使用的带宽kde也随之增加(因此我需要扩展积分限制),我是否理解正确?鉴于我可以承受<10%积分结果值的误差,您如何看待使用Scott规则?
加百利

我认为,由于这些规则是为完全不同的目标制定的,因此您应该怀疑它们可能无法达到您的目的,特别是如果要实施stats.stackexchange.com/questions/63263上的建议。现在担心使用KDE的经验法则为时尚早。在此阶段,您应该认真考虑整个方法是否可靠地工作。
ub

1
从头开始。我确实有一种方法可以知道实现是否有效,甚至可以量化实现的效果。这有点复杂且耗时,但我可以(应该能够)做到这一点。
加百利

1

如果您有大量的观察结果,则可能根本不需要进行任何整合。假设您的新观点是。假设您有一个密度估计器 ; 综上所述观测值的数量为其除以样本大小。这为您提供了所需概率的近似值。x0f^xf^(x)<f^(x0)

假定不太小,并且您的样本大小足够大(并且足够分散),因此可以在低密度区域进行合理的估算。但是,对于双变量,20000个案例的确看起来足够大。f^(x0)x


欢迎对此建议进行一些定量分析,或者至少一个实际应用的例子。我怀疑您的建议的准确性在很大程度上取决于内核的形状。这将使我不愿依赖这种计算,而无需对其性能进行大量研究。
ub
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.