我是新手/中级R用户,从未真正进入循环和编写函数。昨天我偶然发现了一段很好的代码,它允许我对我的整个数据集进行Wilcoxon测试。但是,我还想计算效果大小,似乎我无法将该函数添加到现有代码中。您的任何输入将不胜感激。
Wilcoxon循环:
test.fun <- function(data, col) {
c1 <- combn(unique(data$group),2)
sigs <- list()
for(i in 1:ncol(c1)) {
sigs[[i]] <- wilcox.test(
as.numeric(data[data$group == c1[1,i],col]),
as.numeric(data[data$group == c1[2,i],col])
)
}
names(sigs) <- paste("Group",c1[1,],"by Group",c1[2,])
tests <- data.frame(Test=names(sigs),
W=unlist(lapply(sigs,function(x) x$statistic)),
p=unlist(lapply(sigs,function(x) x$p.value)),row.names=NULL)
return(tests)
}
我想粘贴到此代码中的函数:
rFromWilcox <-function(wilcoxModel, N){
z<- qnorm(wilcoxModel$p.value/2)
r<- z/ sqrt(N)
cat(wilcoxModel$data.name, "Effect Size, r = ", r)
}
rFromWilcox(wilcoxModel, N)
提前致谢,如果您还有其他需要,请告诉我。
答案 0 :(得分:0)
这是我尝试组合这些功能。
请不要在我的个人资料中提醒我,我不是一个专家 - 我回答SO的动机是a)兴趣和b)我自己的进步。因此,在您相信之前,请仔细检查任何结果。至少它会让你去,直到别人解决我的错误:)。
考虑到这一点:
首先,您应该从cat
删除rFromWilcoxon
行,然后将其替换为r
然后像这样更改test.fun
:
test.fun <- function(data, col, group = 'group') {
c1 <- combn(unique(data[[group]]),2)
N <- nrow(data) / ncol(c1) # Calculates N assuming all groups are equal size
sigs <- list()
for(i in 1:ncol(c1)) {
sigs[[i]] <- wilcox.test(
as.numeric(data[data[[group]] == c1[1, i], col]),
as.numeric(data[data[[group]] == c1[2, i], col])
)
}
r <- lapply(sigs, function(i) rFromWilcox(i, N)) # Applies rFromWilcox function
names(sigs) <- paste("Group",c1[1,],"by Group",c1[2,])
tests <- data.frame(Test = names(sigs),
W = unlist(lapply(sigs,function(x) x$statistic)),
p = unlist(lapply(sigs,function(x) x$p.value)),row.names=NULL,
r = unlist(r))
tests
}
也不是因为我认为所有组的大小都相同。如果您的论坛不相等,我认为您只需要计算N
,并在for循环内为每个组合调用rFromWilcox
。
额外注意事项:在您发布的原始函数中,要测试的组必须位于名为&#39; group&#39;的列中。您现在可以在您选择的列名称下进行测试,例如test.fun(iris, 1, 'Species')
将在Sepal.Length上运行&#39; Species&#39;在iris
数据集