R:应用 KL 散度的两个 hexbin 之间的比较

R: Comparison between two hexbins with applying KL divergence

假设我有两个不同大小的数据集,每个数据集包含 x 和 y 来定位每个观察值。

set.seed(1)
x1 <- runif(1000,-195.5,195.5)
y1 <- runif(1000,-49,49)
data1 <- data.frame(x1,y1)
x2 <- runif(2000,-195.5,195.5)
y2 <- runif(2000,-49,49)
data2 <- data.frame(x2,y2)

这里我生成了两个数据集,它们在特定区域内具有随机位置。

然后我为每个数据集生成了两个 hexbin。而且我知道要实现回溯垃圾箱,我需要设置 IDs = TRUE

hbin_1 <- hexbin(x=data1$x1,y=data1$y1,xbins=30,shape=98/391,IDs=TRUE)
hbin_2 <- hexbin(x=data2$x2,y=data2$y2,xbins=30,shape=98/391,IDs=TRUE)

下一步,我想应用KL散度来实现这两个数据集的比较。那么问题是如何将第二个数据集中的匹配 bin 匹配到第一个数据集中? (我想比较两个不同数据集中相同位置的垃圾箱)

更新 我们可以得到 table 包含单元格名称(bin 编号)以及该 bin 中相应的观察计数

tI1 <- table(hbin_1@cID)
tI2 <- table(hbin_2@cID)

问题是 dataset1 和 dataset2 的 bin 编号不同。即使我们在函数 hexbin 中设置相同的 xbinsshape,我们仍然会得到两个数据集的不同 bin .那么我如何比较这两个数据集(或获取具有相同位置的箱子)?

函数 hexbin 不会 return 空箱。因此,即使我们将 xbinsxbndsybnds 设置为相同,returned两个数据集的 hexbin 结果可能不同。

我们可以使用包MASS中的kde2d来实现二维核密度估计。

b1 <- kde2d(data1$x1,data1$y1,lims = c(xbnds,ybnds))
b2 <- kde2d(data2$x2,data2$y2,lims = c(xbnds,ybnds))

然后,我们可以得到两个数据集的核密度估计的两个向量,然后通过除以估计密度的每个向量的和来对结果进行归一化。最后,我们可以应用 KL 散度来量化分布的相似性。

z1 <- as.vector(b1$z)
z2 <- as.vector(b2$z)
z1 <- mapply("/",z1,0.01509942)
z2 <- mapply("/",z2,0.01513236)
kullback.leibler(z1, z2)