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)

この測定では、((1.666 * --1)+7)/ 7 = 0.761であるため、X1とX3の間の距離は0.761になります。

私の数式の問題は、テーブル内のすべての値の範囲を使用していることです。したがって、「maxmin」は常に7であり、類似性の計算にバイアスがかかります。類似度を計算するときは、テーブルではなく列の範囲を使用する必要があります。列1と3のmaxmin値は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を使用してmax-min値(maxmin)の距離行列を作成する必要がありました。これは、パッケージ「proxy」の関数「dist」を使用してのみ実行できます。

于 2012-05-24T06:21:26.027 に答える