如果我有两个二元变量,我可以用不同的相似性度量很容易地确定这些变量的相似性,例如使用 Jaccard 相似性度量:
示例R
:
# Example data
N <- 1000
x1 <- rbinom(N, 1, 0.5)
x2 <- rbinom(N, 1, 0.5)
# Jaccard similarity measure
a <- sum(x1 == 1 & x2 == 1)
b <- sum(x1 == 1 & x2 == 0)
c <- sum(x1 == 0 & x2 == 1)
jacc <- a / (a + b + c)
jacc
但是,我有一组 1.000 个二进制变量,想确定整个组的相似性。
问题:确定两个以上二元变量相似度的最佳方法是什么?
一种想法是测量每个成对组合的相似性,然后取平均值。您可以在下面找到此过程的示例:
# Example data
N <- 1000 # Observations
N_vec <- 1000 # Amount of vectors
x <- rbinom(N * N_vec, 1, 0.5)
mat_x <- matrix(x, ncol = N_vec)
list_x <- split(mat_x, rep(1:ncol(mat_x), each = nrow(mat_x)))
# Function for calculation of Jaccard similarity
fun_jacc <- function(v1, v2) {
a <- sum(v1 == 1 & v2 == 1)
b <- sum(v1 == 1 & v2 == 0)
c <- sum(v1 == 0 & v2 == 1)
jacc <- a / (a + b + c)
return(jacc)
}
# Apply function to all combinations (takes approx. 1 min to calculate)
mat_jacc <- sapply(list_x, function(x) sapply(list_x, function(y) fun_jacc(x,y)))
mat_jacc[upper.tri(mat_jacc)] <- NA
diag(mat_jacc) <- NA
vec_jacc <- as.vector(mat_jacc)
vec_jacc <- vec_jacc[!is.na(vec_jacc)]
median(vec_jacc)
虽然这是非常低效的,我也不确定这在理论上是否是衡量此类变量相似性的最佳方法。
更新:根据 user43849 的建议,可以使用 Sorensen 的多站点相异性来计算相异性:
# Example data
N <- 1000 # Observations
N_vec <- 1000 # Amount of vectors
x <- rbinom(N * N_vec, 1, 0.5)
mat_x <- matrix(x, ncol = N_vec)
# Multiple-site dissimilarity according to Sorensen
library("betapart")
beta.multi(t(mat_x), index.family = "sor")$beta.SOR # Vectors are not similar --> almost 1