两个样本之间的Kullback-Leibler距离

4

我正在处理属于A和B两组的数据。我试图找到显示两个群体之间最大差异的变量,我认为Kullback-Leibler距离是一个很好的度量标准。以下是代表我的数据的样本:

df1 <- structure(list(Var1 = c(2L, 3L, 5L, 7L, 2L, 1L, 0L, 0L, 0L, 1L, 
3L, 4L), VarA = c(0.56, 0.43, 0.25, 0.12, 0.78, 0.55, 0.35, 0.36, 
0.3, 0.41, 0.43, 0.5), VarT = c(10L, 11L, 15L, 12L, 8L, 7L, 7L, 
7L, 6L, 5L, 1L, 2L), Var3 = c(152L, 187L, 149L, 132L, 132L, 178L, 
240L, 205L, 137L, 125L, 124L, 56L), group = structure(c(1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = "A", class = "factor")), .Names = c("Var1", 
"VarA", "VarT", "Var3", "group"), class = "data.frame", row.names = c(NA, 
-12L))

df2 <- structure(list(Var1 = c(5L, 8L, 7L, 4L, 5L, 2L, 1L, 2L, 6L, 5L
), VarA = c(0.24, 0.76, 0.43, 0, 0.52, 0.63, 0.46, 0.64, 0.55, 
0.78), VarT = c(10L, 8L, 9L, 5L, 11L, 14L, 12L, 1L, 7L, 7L), 
    Var3 = c(205L, 120L, 531L, 203L, 215L, 224L, 211L, 212L, 
    134L, 222L), group = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L), .Label = "B", class = "factor")), .Names = c("Var1", 
"VarA", "VarT", "Var3", "group"), class = "data.frame", row.names = c(NA, 
-10L))

我想在一个for循环中应用Kullback-Leibler距离测试来比较相似列,以查看在两个组中同一变量之间显示最大距离的变量。

首先,我尝试运行FNN软件包中的此命令。

require(FNN)
X <- df1[,2]
Y <- df2[,2]
KLx.dist(X, Y, k = 5)
[1]        NaN       -Inf -0.1928958  0.0312911  0.1972085

结果相当有趣,这些距离根本不接近彼此!我的问题是:我是否正确应用了测试?如果是的话,为什么距离显示如此巨大的差异呢?
注意:如果有其他测试可以完成工作,我很乐意尝试。
非常感谢。

1
你可以使用许多测试来比较分布:Kolmogorov-Smirnov(ks.test),Cramer-von-Mises等。 - Vincent Zoonekynd
我会了解它们,希望它们适用于我的数据。谢谢 @VincentZoonekynd - Error404
我该如何在Python中使用Scipy来获取具有最小KL散度的概率分布生成器? - yishairasowsky
1个回答

4

问题在于您没有足够的数据来使用最近邻准确计算KL散度。就算是对于大型数据集,当最近邻数量较少时,这个距离度量也会跳动不稳。例如:

set.seed(123)
x<-rnorm(50000)
y<-rnorm(50000)+0.1
plot(KLx.dist(x,y,100))

你有12个数据点,即使选择6个最近的邻居也会占用一半的数据集。你考虑过是否可以使用T检验吗?它可以处理小样本。


谢谢你的回答,实际上我使用的数据集每个变量大约有5000个数据点,但我使用dput()来展示这个情况。我拥有的数据集没有NA值,但是却给了我NaN NaN NaN NaN NaN。我仍然在想为什么! - Error404
1
你可能有很多重复的数据点,这意味着在某些情况下,你的最近邻居都是同一个点。这可能解释了为什么会出现NaN值。这种估计KL散度的方法适用于连续分布,最近邻居被用来估计密度函数。如果你有重复的数据点,它可能不适合你的问题。如果你仍然想使用它,尝试增加最近邻居的数量,并查看在一段时间后估计是否收敛。 - mrip
谢谢您的回复。是的,我确实有很多重复的变量。您认为其他距离测试可以解决这个问题吗,比如@vincent建议的那些?这是我第一次尝试距离函数(您可以看到我对它们完全没有经验)。干杯 - Error404
1
不了解您的数据,很难推荐一个比较经验分布的好的统计检验。我建议使用t.testks.test。此外,由于这是关于统计而不是编程的问题,因此这个问题可能更适合于http://stats.stackexchange.com/。 - mrip
我需要阅读更多关于测试的资料才能决定最好的。非常感谢你的帮助。 - Error404
嗨mrip,我怎样可以使用t.test来测量概率密度函数之间的距离?我将如何存储概率,并如何度量距离? - aliocee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接