4

我在 R 中有坐标数据,我想确定我的点所在位置的分布。点的整个空间是边长为 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')

红点显然是在一个偶然没有很多其他点的区域,所以这里的密度将是相邻区域密度的一个跳跃,我希望能够平滑这个

在此处输入图像描述

4

2 回答 2

4

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

关于红点周围区域数据稀疏的问题,一种可能的解决方案是使用平均移位直方图。它在多次移动直方图并平均 bin 计数后对您的数据进行 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)

如果您想要更平滑的 bin,可以尝试增加参数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 在此处输入图像描述

分箱算法在 fortran 中实现,速度非常快。

于 2016-08-08T07:13:25.207 回答
2

如果您愿意使用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。使用网格大小(每个方向的网格点数)和带宽(平滑比例)来获得你想要的。

于 2016-08-08T06:50:57.690 回答