Вычислить построчное расстояние Махаланобиса по заранее определенной ковариационной матрице - PullRequest
0 голосов
/ 01 марта 2020

Мои данные выглядят примерно так:

> data.table(vara = rnorm(10), varb = rnorm(10), centa = rnorm(10), centb = rnorm(10))
           vara        varb       centa       centb
 1:  1.00419673  0.69347399  1.01359426 -0.98483999
 2:  0.49754529  0.93508341 -0.05607498 -0.77689024
 3: -2.37846521  0.66655093  1.52329674  0.13905182
 4:  0.30811512  0.07880182 -0.06553791 -1.64129333
 5: -0.87033370 -0.52522052 -0.79229174  0.92361533
 6: -1.02852317  0.54176228  1.17719753 -1.90073183
 7:  0.50358147  1.09485983 -1.71104946  1.80488113
 8: -0.77273213  0.25078481  0.42496541  0.21571760
 9:  0.05100357 -0.56005040 -0.39855705  1.69918850
10: -0.34916896  0.15693242  1.30007343 -0.03628893

Я хочу вычислить расстояние Махаланобиса для пары (vara, varb) с центром в центре (centa, centb) , Ковариационная матрица предопределена. Это была бы матрица 2х2. Мне нужна мера расстояния для каждого ряда.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 02 марта 2020

Поскольку матрица 2x2, инвертировать ее не слишком дорого. Вы можете попробовать

Minv <- solve(matrix(c(1,0.2,0.2,1), nrow=2L))
DT[, mah_dist := {
        x <- c(vara - centa, varb - centb) 
        sqrt(x %*% Minv %*% x)
    }, 1L:nrow(DT)]

вывод:

            vara       varb       centa      centb  mah_dist
 1:  1.262954285  0.7635935 -0.22426789 -0.2357066 1.6507441
 2: -0.326233361 -0.7990092  0.37739565 -0.5428883 0.7134176
 3:  1.329799263 -1.1476570  0.13333636 -0.4333103 1.5423502
 4:  1.272429321 -0.2894616  0.80418951 -0.6494716 0.5414365
 5:  0.414641434 -0.2992151 -0.05710677  0.7267507 1.2369112
 6: -1.539950042 -0.4115108  0.50360797  1.1519118 2.3590344
 7: -0.928567035  0.2522234  1.08576936  0.9921604 2.0435022
 8: -0.294720447 -0.8919211 -0.69095384 -0.4295131 0.6801583
 9: -0.005767173  0.4356833 -1.28459935  1.2383041 1.6739981
10:  2.404653389 -1.2375384  0.04672617 -0.2793463 2.7729519

данные:

set.seed(0L)
DT <- data.table(vara = rnorm(10), varb = rnorm(10), centa = rnorm(10), centb = rnorm(10))
Minv <- solve(matrix(c(1,0.2,0.2,1), nrow=2L))
0 голосов
/ 01 марта 2020

попробуйте таким образом

library(distances)
library(dplyr)
df <- data.frame(vara = rnorm(10), varb = rnorm(10), centa = rnorm(10), centb = rnorm(10)) 

df_1 <- df%>% 
  transmute(vara_centa = vara - centa,
            varb_centb = varb - centb)

distances(df_1, normalize = "mahalanobize")

Пользовательская матрица нормализации

mcov <- matrix(c(1, 0.2, 0.2, 1), nrow = 2)
distances(df_1, normalize = mcov)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...