在 R 中创建 2D bin
Creating 2D bins in R
我在 R 中有坐标数据,我想确定我的点所在位置的分布。整个 space 个点是一个边长 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')
红点显然在一个偶然没有很多其他点的区域,所以这里的密度会比邻近区域的密度跳跃,我希望能够平滑它出来
如果您愿意使用 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
。调整网格大小(每个方向的网格点数)和带宽(平滑比例)以获得您想要的结果。
您可以使用 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)
比较 f
和 f2
binning 算法是用 fortran 实现的,速度非常快。
我在 R 中有坐标数据,我想确定我的点所在位置的分布。整个 space 个点是一个边长 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')
红点显然在一个偶然没有很多其他点的区域,所以这里的密度会比邻近区域的密度跳跃,我希望能够平滑它出来
如果您愿意使用 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
。调整网格大小(每个方向的网格点数)和带宽(平滑比例)以获得您想要的结果。
您可以使用 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)
比较 f
和 f2
binning 算法是用 fortran 实现的,速度非常快。