2

我正在尝试计算不一致对的数量。例如:

arg1=c("b","c","a","d")
arg2 = c("b","c","d","a")

上面有 1 个不一致的对(对:“a”和“d”)

但是当我运行时:

require(asbio)
sum(ConDis.matrix(arg1,arg2)==-1,na.rm=TRUE)

我收到的答案是:5(而不是正确答案 - 1)

我也试过:

require(RankAggreg)
require(DescTools)
xy <- table(arg1,arg2)
cd <- ConDisPairs(xy)
cd$D

答案又是 5。

我错过了什么?

4

2 回答 2

7

我认为你误解了它的ConDis.matrix工作原理。

它所指的对是元素的索引对,对于每一对,函数检查它们是否在两个向量中以相同的方式移动。

因此,在您的向量中,您确实有 5 个不一致的对,即(考虑具有有序定量视图的字母):

  1. 在 obs1 和 obs3 之间(“a”在 arg1 中低于“b”,但“d”在 arg2 中高于)
  2. 在 obs1 和 obs4 之间(“a”在 arg2 中低于“b”,但在 arg1 中“d”高于)
  3. 在 obs2 和 obs3 之间(“a”在 arg1 中低于“c”,但“d”在 arg2 中高于)
  4. 在 obs2 和 obs4 之间(“a”在 arg2 中低于“c”,但在 arg1 中“d”高于)
  5. 在 obs3 和 obs4 之间(“a”在 arg1 中低于“d”,但“d”在 arg2 中高于“a”)
于 2017-07-20T13:26:55.683 回答
2

根据@Cath 的初始评论,将字符向量转换为因子似乎可以通过将文本值映射到可以在函数中使用的整数来提供一种解决方法。编辑:请注意,重新排序因子水平会改变最终结果。我对不和谐函数的了解还不够,无法说出这是否是预期的行为。

# Original Character vectors
arg1 <- c("b","c","a","d")
arg2 <-  c("b","c","d","a")

# Translate character vectors into factors
all_levels <- unique(arg1, arg2)
arg1 <- factor(arg1, levels = all_levels)
arg1
[1] b c a d
Levels: b c a d

arg2 <- factor(arg2, levels = all_levels)
arg2
[1] b c d a
Levels: b c a d

# This maps each text string to a number 
as.numeric(arg1)
[1] 1 2 3 4
as.numeric(arg2)
[1] 1 2 4 3

# Use the underlying numeric data in the function
require(asbio)
sum(ConDis.matrix(as.numeric(arg1), as.numeric(arg2))==-1,na.rm=TRUE)
[1] 1

编辑:对因子水平进行排序会改变最终输出

arg1 <- c("b","c","a","d")
arg2 <- c("b","c","d","a")

all_levels <- sort(unique(arg1, arg2))  # sorted

arg1 <- factor(arg1, levels = all_levels)
arg2 <- factor(arg2, levels = all_levels)

sum(ConDis.matrix(as.numeric(arg1), as.numeric(arg2))==-1,na.rm=TRUE)
[1] 5
于 2017-07-20T13:16:41.790 回答