计算R中两个群之间马氏距离的简单例子

计算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

我试图用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 = 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版本中,计算矩阵如下:
    ((n1-1)*cov(g1)+(n2-1)*cov(g2))/(n1+n2-2)
    ;在Excel版本中:
    ((n1-1)*cov(g1)+(n2-1)*cov(g2))/(n1+n2)

  • 您参考的Excel post中的最后一个计算步骤不正确,结果应为1.989278

编辑:

合并协方差矩阵的无偏估计是标准方法,如维基百科页面所示:。一个相关的事实是,在R中,当你使用
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