R:应用KL散度比较两个hexbins

时间:2018-08-15 11:47:17

标签: r validation binning

假设我有两个大小不同的数据集,每个数据集包含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散度来比较这两个数据集。然后的问题是,如何才能将第二个数据集中的匹配箱与第一个数据集中? (我想比较两个不同数据集中具有相同位置的垃圾箱)

更新 我们可以通过以下方式获取包含该单元格名称(单元格编号)的表以及该单元格中相应的观察计数:

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

问题在于数据集1和数据集2之间的bin编号不同。即使我们在函数 hexbin 中设置了相同的 xbins shape ,我们仍然会得到两个数据集的不同bin。那么如何比较两个数据集(或获取具有相同位置的垃圾箱)?

1 个答案:

答案 0 :(得分:0)

函数 hexbin 不会返回空垃​​圾箱。因此,即使我们将 xbins xbnds ybnds 设置为相同,对于两个数据集,返回的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)