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 中设置相同的 xbins 和 shape,我们仍然会得到两个数据集的不同 bin .那么我如何比较这两个数据集(或获取具有相同位置的箱子)?
函数 hexbin 不会 return 空箱。因此,即使我们将 xbins、xbnds 和 ybnds 设置为相同,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)
假设我有两个不同大小的数据集,每个数据集包含 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 中设置相同的 xbins 和 shape,我们仍然会得到两个数据集的不同 bin .那么我如何比较这两个数据集(或获取具有相同位置的箱子)?
函数 hexbin 不会 return 空箱。因此,即使我们将 xbins、xbnds 和 ybnds 设置为相同,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)