Парное расстояние Махаланобиса, сгруппированное по двум факторам в петле
Я хотел бы рассчитать попарно расстояние Махаланобиса между переменными в матрице. HDMD::pairwise.mahalanobis работает хорошо, но сложность состоит в том, что я не хочу, чтобы вычисления производились по всей структуре данных - они должны быть сгруппированы по двум дискретным переменным. Кроме того, поскольку парные вычисления Махаланобиса встречаются реже, документации не так много, и я не могу интерпретировать полученную ошибку.
У меня большой массив данных с двумя группирующими переменными и рядом числовых переменных:
Голова (ДФ)
X_variable Y_variable one two three four five six seven eight nine
one A D 1.879389 2.619558 2.170685 1.114137 2.449536 2.231820 1.480205 2.493513 1.585385
two B E 2.619558 5.357394 5.250237 2.577334 4.626581 5.447670 3.729916 5.238132 4.622757
three C F 2.170685 5.250237 5.730018 2.948394 4.221243 5.802600 4.086648 5.147827 5.537414
Я перебираю структуру данных следующим образом:
df$X_variable <- droplevels(df$X_variable) # remove empty levels
for (i in unique(df$Y_variable)){
print(i) # sanity check
m_df <- subset(df, Y_variable==i) # create a df for each level
m <- data.matrix(df[df$Y_variable==i, [3:11]) # make a matrix
m[] <- as.numeric(m) # work around to avoid as.numeric() changing matrix structure
grouping_m = t(m_df$X_variable) # group by variable
cov_m = var(m)
m_dist = pairwise.mahalanobis(m, grouping_m, cov_m, cols)
}
Но это приводит к непрозрачной (для меня) ошибке, которую я не могу расшифровать:
Error in !inverted : invalid argument type
In addition: Warning message:
In if (dim(cov) != c(p, p)) stop("cov matrix not of dim = (p,p)\n") :
the condition has length > 1 and only the first element will be used