1

我正在尝试使用 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表示距离,与 Excel 示例1.724的结果有很大不同。1.4101由于我对马氏距离的概念不熟悉,我想知道我是否做错了什么和/或有更好的方法来计算这个,例如使用mahalanobis()

4

1 回答 1

2

你得到不同结果的原因是

  • 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帖子中的最后一个计算步骤不正确,结果应该是1.989278。

编辑:

池化协方差矩阵的无偏估计器是标准方法,就像在维基百科页面中一样:https ://en.wikipedia.org/wiki/Pooled_variance 。一个相关的事实是,在 R 中,当您使用covor时var,您会得到一个无偏估计器,而不是协方差矩阵的 MLE 估计器。

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

结论:总之,计算两个样本之间的马氏距离最标准的方法是原帖中的R代码,它使用了池化协方差矩阵的无偏估计。

于 2017-06-19T19:04:40.703 回答