在R

时间:2016-08-08 06:41:44

标签: r 2d bins

我在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')

红点显然位于一个偶然没有很多其他点的区域,因此这里的密度将是相邻区域密度的跳跃,我希望能够将其平滑< / p>

enter image description here

2 个答案:

答案 0 :(得分:2)

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

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

enter image description here

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

enter image description here

更新:要计算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()

enter image description here

bins对象包含xy值以及归一化密度fhat。使用网格化(每个方向上的网格点数)和带宽(平滑比例)进行游戏,以获得您所追求的目标。

答案 1 :(得分:2)

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

关于红点周围区域中数据稀疏性的问题,一种可能的解决方案是平均移位直方图。在将直方图移位几次并平均箱数后,它会对您的数据进行分类。这减轻了箱子起源的问题。例如,想象如果红点是箱的左侧或箱的右下方,则包含红点的箱中的点数如何变化。

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

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 enter image description here

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