我将三个种群存储为单个向量。我需要对这三个人口中的每一个人口进行统计检验(如果需要的话,是wilcoxon)。
我想在一个代码块中输入三个向量,并获得6个p值的向量的输出(一个测试值是一个p值,是一个双精度值)。
我有一个可行的方法,但是我是R语言的新手,从我的阅读中我感觉应该有更好的方法,可能涉及将向量存储为数据帧并使用向量化来编写此代码。
这是我的代码:
library(arrangements)
runAllTests <- function(pop1,pop2,pop3) {
populations <- list(pop1=pop1,pop2=pop2,pop3=pop3)
colLabels <- c("pop1", "pop2", "pop3")
#This line makes a data frame where each column is a pair of labels
perms <- data.frame(t(permutations(colLabels,2)))
pvals <- vector()
#This for loop gets each column of that data frame
for (pair in perms[,]) {
pair <- as.vector(pair)
p1 <- as.numeric(unlist(populations[pair[1]]))
p2 <- as.numeric(unlist(populations[pair[2]]))
pvals <- append(pvals, wilcox.test(p1, p2,alternative=c("less"))$p.value)
}
return(pvals)
}
哪种更适合R的方式编写此代码?
注意:生成种群并将它们相互比较是一件很普通的事情(并且很棘手,很难编码),我认为这个问题比我本人更适用。
编辑:我忘记了我的实际人口大小不同。这意味着我无法从矢量中制作出数据帧(据我所知)。我可以列出向量。我已经用可以正常工作的版本更新了代码。
答案 0 :(得分:3)
是的,这确实很普遍;确实如此普遍,以至于R在这种情况下具有内置功能:pairwise.table
。
p <- list(pop1, pop2, pop3)
pairwise.table(function(i, j) {
wilcox.test(p[[i]], p[[j]])$p.value
}, 1:3)
还有t检验,比例检验和Wilcoxon检验的特定版本;这是使用pairwise.wilcox.test
的示例。
p <- list(pop1, pop2, pop3)
d <- data.frame(x=unlist(p), g=rep(seq_along(p), sapply(p, length)))
with(d, pairwise.wilcox.test(x, g))
此外,请确保您查看p.adjust.method
参数以正确调整多个比较。
根据您的评论,您对订单重要的测试感兴趣;真的很难想象(对于您提到的Wilcoxon测试也不是真的),但仍然...
这是pairwise.table
函数,经过编辑可以在两个方向上进行测试。
pairwise.table.all <- function (compare.levels, level.names, p.adjust.method) {
ix <- setNames(seq_along(level.names), level.names)
pp <- outer(ix, ix, function(ivec, jvec)
sapply(seq_along(ivec), function(k) {
i <- ivec[k]; j <- jvec[k]
if (i != j) compare.levels(i, j) else NA }))
pp[] <- p.adjust(pp[], p.adjust.method)
pp
}
这是pairwise.wilcox.test
的一个版本,它使用上述功能,并且也运行在向量列表上,而不是长格式的数据帧。
pairwise.lazerbeam.test <- function(dat, p.adjust.method=p.adjust.methods) {
p.adjust.method <- match.arg(p.adjust.method)
level.names <- if(!is.null(names(dat))) names(dat) else seq_along(dat)
PVAL <- pairwise.table.all(function(i, j) {
wilcox.test(dat[[i]], dat[[j]])$p.value
}, level.names, p.adjust.method = p.adjust.method)
ans <- list(method = "Lazerbeam's special method",
data.name = paste(level.names, collapse=", "),
p.value = PVAL, p.adjust.method = p.adjust.method)
class(ans) <- "pairwise.htest"
ans
}
整理之前和之后的输出看起来像这样:
> p <- list(a=1:5, b=2:8, c=10:16)
> out <- pairwise.lazerbeam.test(p)
> out
Pairwise comparisons using Lazerbeams special method
data: a, b, c
a b c
a - 0.2821 0.0101
b 0.2821 - 0.0035
c 0.0101 0.0035 -
P value adjustment method: holm
> pairwise.lazerbeam.test(p) %>% broom::tidy()
# A tibble: 6 x 3
group1 group2 p.value
<chr> <chr> <dbl>
1 b a 0.282
2 c a 0.0101
3 a b 0.282
4 c b 0.00350
5 a c 0.0101
6 b c 0.00350
答案 1 :(得分:2)
这里是使用combn()
的一种方法的示例,该方法具有一个函数自变量,可用于轻松地将wilcox.test()
应用于所有变量组合。
set.seed(234)
# Create dummy data
df <- data.frame(replicate(3, sample(1:5, 100, replace = TRUE)))
# Apply wilcox.test to all combinations of variables in data frame.
res <- combn(names(df), 2, function(x) list(data = c(paste(x[1], x[2])), p = wilcox.test(x = df[[x[1]]], y = df[[x[2]]])$p.value), simplify = FALSE)
# Bind results
do.call(rbind, res)
data p
[1,] "X1 X2" 0.45282
[2,] "X1 X3" 0.06095539
[3,] "X2 X3" 0.3162251