使用r包"effsize“,我试图计算数据中所有组对之间的cohens d,并将所有成对d估计输出为矩阵。我提供了一些测试数据来说明这一点。我想要一个所有组1、2和3对的d个估计值的矩阵。
我正在努力寻找从哪里开始做这个。我知道这可以使用循环来完成,但由于我的实际数据包含1000个组,每个组有6000个数据点,所以我认为这会很慢。
library("effsize")
test <- data.frame(
score=c(2,3,42,1,2,3,4,5,5,6,8,2),
group=c(1,1,1,1,2,2,2,2,3,3,3,3)
)这与使用pairwise.wilcox.test()为wilcox秩和提供的功能类似。
发布于 2019-09-12 00:14:13
您所要做的就是注意到,combn函数一次输出n元素的组合( k ),并且还可以将一个函数应用于每个结果组合。在这种情况下,问题要求一次两个组的组合,并将函数fun应用于每个组。
fun <- function(x) {
cohen.d(x[[1]]$score, x[[2]]$score)
}
sp <- split(test, test$group)
cmb <- combn(sp, 2, fun)
cmb[, 1]
#[[1]]
#[1] "Cohen's d"
#
#[[2]]
#[1] "d"
#
#[[3]]
#[1] 0.5992954
#
#[[4]]
# lower upper
#-1.169345 2.367936
#
#[[5]]
#[1] 0.95
#
#[[6]]
#[1] medium
#Levels: negligible < small < medium < large上面的代码可以写成一个完成所有工作并返回一个矩阵的函数。
cohen.d.pairwise.test <- function(DF, scoreCol, groupCol){
fun <- function(x) {
eff <- cohen.d(x[[1]][[scoreCol]], x[[2]][[scoreCol]])
c(eff[["estimate"]],
eff[["conf.int"]][1],
eff[["conf.int"]][2],
eff[["conf.level"]])
}
sp <- split(DF, DF[[groupCol]])
cmb <- combn(sp, 2, fun)
rownames(cmb) <- c("estimate", "lower", "upper", "conf.level")
t(cmb)
}
cohen.d.pairwise.test(test, scoreCol = "score", groupCol = "group")
# estimate lower upper conf.level
#[1,] 0.5992954 -1.169345 2.3679357 0.95
#[2,] 0.4732232 -1.281054 2.2275008 0.95
#[3,] -0.8795932 -2.691556 0.9323698 0.95https://stackoverflow.com/questions/57892707
复制相似问题