我是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)
在此先感谢您,如果您还有其他需要,请与我联系。
这是我尝试组合这些功能的尝试。
请不要在我的个人资料中警告我从长远来看不是专家-我回答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
,并rFromWilcox
为每个组合在for循环内调用。
额外说明:在您发布的原始功能中,要测试的组必须位于称为“组”的列中。现在,您可以使用您选择的列名进行测试,例如,test.fun(iris, 1, 'Species')
将在iris
数据集中按“种类”对Sepal.Length进行测试
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句