我在R中有坐标数据,我想确定一下我的点位置的分布。点的整个空间是边长为100的正方形。
我想将点分配到广场上的不同段,例如四舍五入到最接近的5.我看过使用cut
和findinterval
的示例,但我不知道如何在创建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>
答案 0 :(得分: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
对象包含x
和y
值以及归一化密度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)
binning算法在fortran中实现,速度非常快。