簡體   English   中英

計算R中兩組之間馬氏距離的簡單示例

[英]Simple example calculating Mahalanobis distance between two groups in R

我正在嘗試使用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()

您得到不同結果的原因是

  • 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。

編輯:

合並協方差矩陣的無偏估計量是標准方法,就像Wikipedia頁面上一樣: https : //en.wikipedia.org/wiki/Pooled_variance 一個相關的事實是,在R中,當您使用covvar ,對於協方差矩陣,您將獲得一個無偏估計量而不是MLE估計量。

Edit2:R中的馬哈拉諾比斯函數計算從點到分布的馬哈拉諾比斯距離。 它不計算兩個樣本的馬氏距離。

結論:總而言之,計算兩個樣本之間馬哈拉諾比斯距離的最標准方法是原始文章中的R代碼,該代碼使用合並協方差矩陣的無偏估計量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM