我正在尝试计算数据集的每个观测值之间的马哈拉诺比斯距离dat
,其中每行是一个观察值,每列是一个变量。该距离定义为:
我写了一个函数来做到这一点,但我觉得它很慢。在 R 中是否有更好的方法来计算它?
生成一些数据来测试该功能:
generateData <- function(nObs, nVar){
library(MASS)
mvrnorm(n=nObs, rep(0,nVar), diag(nVar))
}
这是我到目前为止编写的函数。它们都有效,对于我的数据(800 个观测值和 90 个变量),大约需要 30 和 33 秒method = "forLoop"
and method = "apply"
, 分别。
mhbd_calc2 <- function(dat, method) { #Method is either "forLoop" or "apply"
dat <- as.matrix(na.omit(dat))
nObs <- nrow(dat)
mhbd <- matrix(nrow=nObs,ncol = nObs)
cv_mat_inv = solve(var(dat))
distMH = function(x){ #Mahalanobis distance function
diff = dat[x[1],]-dat[x[2],]
diff %*% cv_mat_inv %*% diff
}
if(method=="forLoop")
{
for (i in 1:nObs){
for(j in 1:i){
mhbd[i,j] <- distMH(c(i,j))
}
}
}
if(method=="apply")
{
mhbd[lower.tri(mhbd)] = apply(combn(nrow(dat),2),2, distMH)
}
result = sqrt(mhbd)
colnames(result)=rownames(dat)
rownames(result)=rownames(dat)
return(as.dist(result))
}
注意:我尝试使用outer()
但更慢(60秒)