计算现有循环中Wilcoxon的效果大小

时间:2017-01-26 10:35:25

标签: r statistics

我是新手/中级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)

提前致谢,如果您还有其他需要,请告诉我。

1 个答案:

答案 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数据集