计算R中两组之间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 = 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) 

并在数据上执行该函数返回如下输出:

 $D.sq [,1] [1,] 1.724041 $V [,1] [,2] [1,] 3.5153846 0.3153846 [2,] 0.3153846 2.2230769 

Afaik $D.sq代表距离, 1.724与Excel例子中的1.4101结果有很大的不同。 由于我是马哈拉诺比斯距离的概念的新手,我想知道如果我做了错误的和/或有更好的方法来计算,例如使用mahalanobis() ?

你得到不同结果的原因是什么

  • Excelalgorithm实际上与Ralgorithm在计算汇总协方差matrix方面有所不同,R版本为您提供了协方差matrix的无偏估计结果,而Excel版本则为您提供了MLE估算。 在R版本中,计算如下matrix: ((n1 - 1) * cov(g1) + (n2 - 1) * cov(g2)) / (n1 + n2 - 2) 。 而在Excel版本中: ((n1 - 1) * cov(g1) + (n2 - 1) * cov(g2)) / (n1 + n2)

  • Excel引用中最后一个计算步骤是不正确的,结果应该是1.989278。

编辑:

汇总协方差matrix的无偏估计是标准方法,如维基百科页面所示: https : //en.wikipedia.org/wiki/Pooled_variance 。 一个相关的事实是,在R中,当使用covvar ,您将得到一个无偏估计量,而不是协方差matrix的MLE估计量。

编辑2:R中的mahalanobis函数计算从点到分布的马氏距离。 它不计算两个样本的马氏距离。

结论:总而言之,计算两个样本之间马氏距离的最为标准的方法是原始文章中的R代码,它使用了合并协方差matrix的无偏估计。