计算R

时间:2017-06-19 16:09:28

标签: r excel mahalanobis

我正在尝试使用Excel重现this示例来计算两组之间的马哈拉诺比斯距离。

Plot of data from example

在我看来,这个例子提供了对这个概念的一个很好的解释。但是,我无法在R中重现。

使用Excel的示例中获得的结果是Mahalanobis(g1, g2) = 1.4104

根据R给出here的答案并将其应用于上述数据,如下所示:

# 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()

1 个答案:

答案 0 :(得分: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中,当你使用covvar时,你得到一个无偏估计量而不是协方差矩阵的MLE估计量。

EDIT2: R中的马哈拉诺比斯函数计算从点到分布的马哈拉诺比斯距离。它不计算两个样本的马哈拉诺比斯距离。

结论:总之,计算两个样本之间马哈拉诺比斯距离的最标准方法是原始帖子中的R代码,它使用合并协方差矩阵的无偏估计。