计算不一致对的功能不起作用
function for counting discordant pairs is not working
我正在计算不一致对的数量。例如:
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。
我错过了什么?
根据@Cath 的初始评论,将字符向量转换为因子似乎可以通过将文本值映射到随后可在函数中使用的整数来提供解决方法。编辑:请注意,重新排序因子水平会改变最终结果。我对 discordance 函数的了解还不够多,无法说明这是否是预期的行为。
# 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
我认为您误解了 ConDis.matrix
的工作原理。
它引用的对是元素的索引对,函数检查每对,它们是否在两个向量中以相同的方式移动。
因此,在您的向量中,您确实有 5 个不一致的对,即(考虑具有有序定量视图的字母):
- 在 obs1 和 obs3 之间("a" 在 arg1 中低于 "b" 但在 arg2 中 "d" 较高)
- 在 obs1 和 obs4 之间("a" 在 arg2 中低于 "b" 但在 arg1 中 "d" 较高)
- 在 obs2 和 obs3 之间("a" 在 arg1 中低于 "c" 但在 arg2 中 "d" 较高)
- 在 obs2 和 obs4 之间("a" 在 arg2 中低于 "c" 但在 arg1 中 "d" 较高)
- 介于 obs3 和 obs4 之间("a" 低于 arg1 中的 "d" 但 "d" 高于 arg2 中的 "a")
我正在计算不一致对的数量。例如:
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。
我错过了什么?
根据@Cath 的初始评论,将字符向量转换为因子似乎可以通过将文本值映射到随后可在函数中使用的整数来提供解决方法。编辑:请注意,重新排序因子水平会改变最终结果。我对 discordance 函数的了解还不够多,无法说明这是否是预期的行为。
# 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
我认为您误解了 ConDis.matrix
的工作原理。
它引用的对是元素的索引对,函数检查每对,它们是否在两个向量中以相同的方式移动。
因此,在您的向量中,您确实有 5 个不一致的对,即(考虑具有有序定量视图的字母):
- 在 obs1 和 obs3 之间("a" 在 arg1 中低于 "b" 但在 arg2 中 "d" 较高)
- 在 obs1 和 obs4 之间("a" 在 arg2 中低于 "b" 但在 arg1 中 "d" 较高)
- 在 obs2 和 obs3 之间("a" 在 arg1 中低于 "c" 但在 arg2 中 "d" 较高)
- 在 obs2 和 obs4 之间("a" 在 arg2 中低于 "c" 但在 arg1 中 "d" 较高)
- 介于 obs3 和 obs4 之间("a" 低于 arg1 中的 "d" 但 "d" 高于 arg2 中的 "a")