计算R中两个群之间马氏距离的简单例子
我试图用Excel重现这个例子来计算两组之间的马氏距离 在我看来,这个例子很好地解释了这个概念。然而,我无法在R中复制 使用Excel在示例中获得的结果是计算R中两个群之间马氏距离的简单例子,r,excel,mahalanobis,R,Excel,Mahalanobis,我试图用Excel重现这个例子来计算两组之间的马氏距离 在我看来,这个例子很好地解释了这个概念。然而,我无法在R中复制 使用Excel在示例中获得的结果是Mahalanobis(g1,g2)=1.4104 根据R给出的答案,并将其应用于上述数据,如下所示: # dataset used in the Excel example g1 <- matrix(c(2, 2, 2, 5, 6, 5, 7, 3, 4, 7, 6, 4, 5, 3, 4, 6, 2, 5, 1, 3), ncol
Mahalanobis(g1,g2)=1.4104
根据R给出的答案,并将其应用于上述数据,如下所示:
# dataset used in the Excel example
g1 <- matrix(c(2, 2, 2, 5, 6, 5, 7, 3, 4, 7, 6, 4, 5, 3, 4, 6, 2, 5, 1, 3), ncol = 2, byrow = TRUE)
g2 <- matrix(c(6, 5, 7, 4, 8, 7, 5, 6, 5, 4), ncol = 2, byrow = TRUE)
# function adopted from R example
D.sq <- function (g1, g2) {
dbar <- as.vector(colMeans(g1) - colMeans(g2))
S1 <- cov(g1)
S2 <- cov(g2)
n1 <- nrow(g1)
n2 <- nrow(g2)
V <- as.matrix((1/(n1 + n2 - 2)) * (((n1 - 1) * S1) + ((n2 - 1) * S2)))
D.sq <- t(dbar) %*% solve(V) %*% dbar
res <- list()
res$D.sq <- D.sq
res$V <- V
res
}
D.sq(g1,g2)
Afaik
$D.sq
表示距离,1.724
与Excel示例中的1.4101
结果显著不同。由于我不熟悉马氏距离的概念,我想知道我是否做错了什么和/或有更好的方法来计算它,例如,使用?得到不同结果的原因如下
- Excel算法在计算合并协方差矩阵的方式上实际上与R算法不同,R版本提供协方差矩阵的无偏估计结果,而Excel版本提供MLE估计。在R版本中,计算矩阵如下:
;在Excel版本中:((n1-1)*cov(g1)+(n2-1)*cov(g2))/(n1+n2-2)
((n1-1)*cov(g1)+(n2-1)*cov(g2))/(n1+n2)
- 您参考的Excel post中的最后一个计算步骤不正确,结果应为1.989278
cov
或var
时,你得到的是协方差矩阵的无偏估计量,而不是MLE估计量
编辑2:
R中的马氏函数计算从点到分布的马氏距离。它不计算两个样本的马氏距离
结论:总之,计算两个样本之间马氏距离的最标准方法是原始post中的R码,它使用合并协方差矩阵的无偏估计。很好的解释。cov中是否存在处理该问题的参数,或者是否应该为其创建自定义函数?@Consistency非常感谢您的回复,这肯定有助于阐明该问题!我还没有把它标记为接受答案,因为我有两个问题要回答你的答案:1。计算合并协方差矩阵是否有“正确的”标准方法?例如,马哈拉诺比斯()中使用了什么。例如,在post中,它被计算为:
((n1/n3)*cov(g1))+((n2/n3)*cov(g2))
,其中n3=n1+n2
。2.为什么得到的结果是1.989278
,而不是1.724
?@Sotos似乎R的cov
和var
都给出了协方差的无偏估计(在这种情况下使用n-1作为分母而不是n),没有理由让它给出MLE估计。如果你经常使用MLE估计,也许你应该为它创建一个自定义函数。是的,我也这么认为。我已经为我构建的异常检测方法实现了mahalanobis,该方法已经实现到一个商业工具中,效果很好。不需要MLE。我只是好奇。Cheers@raumkundschafter据我所知,合并协方差矩阵的无偏估计量,如原始R码,是最常用的估计量。如果你想要一个标准的方法,就使用这个方法,尽管你不能说MLE方法是错误的。
$D.sq
[,1]
[1,] 1.724041
$V
[,1] [,2]
[1,] 3.5153846 0.3153846
[2,] 0.3153846 2.2230769