0

考虑以下矩阵:

structure(list(X1 = c(1L, 2L, 3L, 4L, 2L, 5L), X2 = c(2L, 3L, 
4L, 5L, 3L, 6L), X3 = c(3L, 4L, 4L, 5L, 3L, 2L), X4 = c(2L, 4L, 
6L, 5L, 3L, 8L), X5 = c(1L, 3L, 2L, 4L, 6L, 4L)), .Names = c("X1", 
"X2", "X3", "X4", "X5"), class = "data.frame", row.names = c(NA, 
-6L))

每列对应一个受访者,每行包含受访者分配给特定对象的排名编号。请注意,排名的范围可能因受访者而异。

我正在尝试创建一个相似性度量,根据每列的范围对距离进行加权。这是我到目前为止所尝试的:

m <- test
d <- dist(m, "manhattan", diag=FALSE, upper=TRUE)/nrow(m) 
maxmin <- max(m, na.rm=TRUE) - min(m,na.rm=TRUE)
WeightedAgreement <- as.matrix((-1 * d + maxmin) / maxmin)

使用此度量,X1 和 X3 之间的距离 = 0.761,因为 ((1.666 * - 1)+7)/7 = 0.761。

我的公式的问题在于它使用了表中所有值的范围——因此“maxmin”始终为 7,这会使相似度的计算产生偏差。在计算相似度时,我需要使用列的范围而不是表格。第 1 列和第 3 列的最大值应为 4 (5-1),X1 和 X3 之间的相似度应为 0.583。

4

2 回答 2

1

如果我理解正确,我认为您要定义maxmin如下:

maxmin <- outer(names(m), names(m),
                Vectorize(function(i,j) max(m[c(i,j)], na.rm = TRUE) -
                                        min(m[c(i,j)], na.rm = TRUE)))

#      [,1] [,2] [,3] [,4] [,5]
# [1,]    4    5    4    7    5
# [2,]    5    4    4    6    5
# [3,]    4    4    3    6    5
# [4,]    7    6    6    6    7
# [5,]    5    5    5    7    5
于 2012-05-24T01:26:27.280 回答
0

好的,还有一个替代解决方案。这是代码:

require(proxy)
m <- test
d <- dist(t(m), "manhattan", diag=FALSE, upper=TRUE)/nrow(m)
f <- function(x,y) max(x,y, na.rm=TRUE) - min(x,y, na.rm=TRUE)
maxmin <- dist(t(test), f, upper=TRUE, diag=TRUE)
RawAgreementWeighted <- as.matrix((-1 * d + maxmin) / maxmin)
diag(RawAgreementWeighted) <- 1

基本上我必须使用函数 f 创建一个最大最小值(maxmin)的距离矩阵。这只能使用包“proxy”中的函数“dist”来完成。

于 2012-05-24T06:21:26.027 回答