在 R 中创建 2D bin

Creating 2D bins in R

我在 R 中有坐标数据,我想确定我的点所在位置的分布。整个 space 个点是一个边长 100 的正方形。

我想将点分配给正方形上的不同部分,例如四舍五入到最接近的 5。我看过使用 cutfindinterval 的示例,但我不确定如何在创建 2d bin 时使用它。

实际上,我想要做的是平滑分布,这样网格的相邻区域之间就不会出现巨大的跳跃。

例如(这只是为了说明问题):

set.seed(1)
x <- runif(2000, 0, 100)
y <- runif(2000, 0, 100)
plot(y~x)
points( x = 21, y = 70, col = 'red', cex = 2, bg = 'red')

红点显然在一个偶然没有很多其他点的区域,所以这里的密度会比邻近区域的密度跳跃,我希望能够平滑它出来

如果您愿意使用 ggplot2,有一些不错的选择。

ggplot(data.frame(x,y), aes(x,y)) + geom_bin2d()

ggplot(data.frame(x,y), aes(x,y)) + stat_density2d(aes(fill = ..level..), geom = "polygon")

更新:要计算 2d 分箱,您可以使用 2d(双变量)正常核密度平滑:

library(KernSmooth)
bins <- bkde2D(as.matrix(data.frame(x, y)), bandwidth = c(2, 2), gridsize = c(25L, 25L))

也可以画成

library(reshape2)
ggplot(melt(bins$fhat), aes(Var1, Var2, fill = value)) + geom_raster()

bins 对象包含 xy 值以及归一化密度 fhat。调整网格大小(每个方向的网格点数)和带宽(平滑比例)以获得您想要的结果。

您可以使用 ash 库中的 bin2 函数获取分箱数据。

关于红点周围区域数据稀疏的问题,一种可能的解决方案是平均平移直方图。它在多次移动直方图并对 bin 计数取平均值后对您的数据进行分箱。这缓解了 bin 来源的问题。例如,想象一下,如果红点位于 bin 的左上角或 bin 的右下角,则包含红点的 bin 中的点数将如何变化。

library(ash)
bins <- bin2(cbind(x,y))
f <- ash2(bins, m = c(5,5))

image(f$x,f$y,f$z)
contour(f$x,f$y,f$z,add=TRUE)

如果您想要更平滑的分箱,您可以尝试增加参数 m,这是一个长度为 2 的向量,用于控制每个变量的平滑参数。

f2 <- ash2(bins, m = c(10,10))
image(f2$x, f2$y, f2$z)
contour(f2$x,f2$y,f2$z,add=TRUE)

比较 ff2

binning 算法是用 fortran 实现的,速度非常快。