Когда я вычисляю расстояния Джакарта для объектов во фрейме данных, я путаюсь, сравнивая результаты proxy :: dist () и philentropy :: distance ().
Кроме того, оба результата не соответствуют тому, что я ожидал (так что я думаю, что путаница вызвана мной, а не пакетами).
Вот MWE для двоичных данных с некоторыми комментариями. прокси и филентропия почти одинаковы, хотя в матрице расстояний филентропии есть пропуски.
rm(list=ls())
library("philentropy")
library("proxy")
#5 objects and 2 variables (binary coded)
data01 <- data.frame(var1 = c(0,1,0,0,1),
var2 = c(0,1,0,0,0))
# jaccard-distand of object A and B:= 1-(count(A equals B) / count(A + B)
# example jaccard-distance
# object 1 and 2: no correspondance, maximum distance = 1
# object 1 and 3: same coding, minimum distance = 0
# object 1 and 5: different coding on variable 1 and same coding on variable 2, medium distance = .5
Stats01 <- dist(data01, method="binary", diag=TRUE, upper = TRUE)
Proxy01 <- proxy::dist(data01, method="jaccard", diag=TRUE, upper = TRUE)
Philentropy01 <- philentropy::distance(data01, method="jaccard")
Stats01 #maximum distance object 1 and object 2 (as expected), but object 1 and object 5 as well maximum distance
Proxy01 #same results as Stats01
Philentropy01 #NaN for most zero-values
1 2 3 4 5
1 0.0 1.0 0.0 0.0 1.0
2 1.0 0.0 1.0 1.0 0.5
3 0.0 1.0 0.0 0.0 1.0
4 0.0 1.0 0.0 0.0 1.0
5 1.0 0.5 1.0 1.0 0.0
v1 v2 v3 v4 v5
v1 NaN 1.0 NaN NaN 1.0
v2 1 0.0 1 1 0.5
v3 NaN 1.0 NaN NaN 1.0
v4 NaN 1.0 NaN NaN 1.0
v5 1 0.5 1 1 0.0
Вот MWE для закодированных данных со значениями 1, 2, 3. Прокси и филентропия отличаются и оба отличаются от того, что я ожидал.
#5 objects and 2 variables (three categories coded starting from 1)
data123 <- data.frame(var1 = c(1,2,3,1,2),
var2 = c(1,2,3,1,1))
Stats123 <- dist(data123, method="binary", diag=TRUE, upper = TRUE)
Proxy123 <- proxy::dist(data123, method="jaccard", diag=TRUE, upper = TRUE)
Philentropy123 <- philentropy::distance(data123, method="jaccard")
Stats123 #only zero-distances, it's a pitty, but expected because binary interprets everything not-zero as 1
Proxy123 #same results as Stats123
Philentropy123 #for object 1 I expected same distance to object 2 and 3
1 2 3 4 5
1 0 0 0 0 0
2 0 0 0 0 0
3 0 0 0 0 0
4 0 0 0 0 0
5 0 0 0 0 0
v1 v2 v3 v4 v5
v1 0.0000000 0.3333333 0.5714286 0.0000000 0.2500000
v2 0.3333333 0.0000000 0.1428571 0.3333333 0.1428571
v3 0.5714286 0.1428571 0.0000000 0.5714286 0.3571429
v4 0.0000000 0.3333333 0.5714286 0.0000000 0.2500000
v5 0.2500000 0.1428571 0.3571429 0.2500000 0.0000000
Я хотел бы знать:
Почему филентропия дает NaN-значения для некоторых нулевых расстояний (и как их избежать) в случае двоично-кодированных данных?
Почему соответствие приводит к различным значениям расстояния в зависимости от того, согласуются ли нули или 1, или для переменных с кодированием 1, 2, 3 в зависимости от этих значений.