Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R-对多个总体的每个排列运行统计测试的最干净方法_R - Fatal编程技术网

R-对多个总体的每个排列运行统计测试的最干净方法

R-对多个总体的每个排列运行统计测试的最干净方法,r,R,我有三个种群作为单独的载体存储。我需要对这三个群体中的每一对进行统计测试(威尔科克森,如果有必要的话) 我想在代码块中输入三个向量,并得到一个6个p值的向量作为输出(一个p值是一个测试的结果,是一个双精度) 我有一个有效的方法,但我对R是新手,从我一直阅读的内容来看,我觉得应该有更好的方法,可能包括将向量存储为数据帧并使用向量化来编写代码 以下是我的代码: library(arrangements) runAllTests <- function(pop1,pop2,pop3) {

我有三个种群作为单独的载体存储。我需要对这三个群体中的每一对进行统计测试(威尔科克森,如果有必要的话)

我想在代码块中输入三个向量,并得到一个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)
}
库(安排)

runAllTests这里是一个使用
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 
set.seed(234)
#创建虚拟数据

df是的,这确实很常见;事实上,R非常常见,它有一个内置函数,正好适用于这种情况:
pairwise.table

p <- list(pop1, pop2, pop3)
pairwise.table(function(i, j) { 
   wilcox.test(p[[i]], p[[j]])$p.value 
}, 1:3)
另外,请确保查看
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
}
整理前后的输出如下所示:

> 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
>p out
用Lazerbeams特殊方法进行两两比较
数据:a、b、c
a、b、c
a-0.2821 0.0101
b 0.2821-0.0035
c 0.0101 0.0035-
P值调整方法:holm
>成对.lazerbeam.测试(p)%>%broom::tidy()
#一个tibble:6x3
第1组第2组p.值
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

Wow,从来都不知道combn的函数参数!始终在之后运行
lappy
。谢谢,输出看起来很棒。有一件事,我可以让它一次完成所有6个组合,或者我需要调用它两次并合并结果吗?(我比较的人口比其他人口多,所以测试(pop1,pop2)!=测试(pop2,pop1))。好的,我想是时候选择一个答案了。由于这一次的投票数较少,我想解释一下,输出与问题最为匹配,并注意,为了得到其他三次迭代,我只交换了x[1]和x[2]。谢谢。这看起来不错,但我有两个问题:1)我能在一行中获得所有6个比较(test(pop1,pop2)!=test(pop2,pop1))吗?还是我只需要调用两次并返回结果?2)我可以将输出作为向量或数据框,并将测试名称与p值匹配,还是作为矩阵,并用数字标记行和列?首先,我只需要制作我自己的函数版本。关于第二个问题,请参见
broom::tidy
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