【问题标题】:How to do Wilcoxon test on columns between two dataframes如何对两个数据框之间的列进行 Wilcoxon 测试
【发布时间】:2018-03-21 05:22:43
【问题描述】:

我有两个数据框:

D9 <- as.data.frame(DF$As,DF$Cd,DF$Cu,DF$Cr,DF$Ni,DF$Pb,DF$Zn)
D10 <- as.data.frame(DO$As,DO$Cd,DO$Cu,DO$Cr,DO$Ni,DO$Pb,DO$Zn)

并希望对每一列(DF$As,DO$As)应用 wilcox 测试,依此类推。 我尝试了以下代码:

lapply(ncol(D9), function(i) {wilcox.test((D9[,i]),(D10[,i]))})

输出是:

[[1]]
Wilcoxon rank sum test
data:  (D9[, i]) and (D10[, i])
W = 107, p-value = 0.9834
alternative hypothesis: true location shift is not equal to 0

所以我的问题是 - 我做错了什么?

感谢任何帮助。

【问题讨论】:

  • 请提供reproducible example,其中定义了所有变量,以便我们可以复制/粘贴到 R 中以测试可能的解决方案。

标签: r dataframe statistics hypothesis-test


【解决方案1】:

请注意,ncol(D9) 只会返回一个数字,因此lapply 只会遍历该单个数字。使用1:ncol(D9)从第一列开始(或使用seq.int(ncol(D9))。查看lapply(9, print)lapply(1:9, print)之间的区别

或者你可以直接映射列

Map(wilcox.test, D9, D10)

因为 data.frames 实际上只是列表。

【讨论】:

    【解决方案2】:

    lapply 需要一个向量,所以@MrFlick 的建议可能会有所帮助(您实际上只进行了一次 wilcox 测试)

    您还可以通过循环获得迭代打印输出

    for(i in 1:ncol(D9)){
        summary(wilcox.text(D9[,i],D10[,i]))
    }
    

    【讨论】:

      【解决方案3】:

      我们有两个不同的数据框 d1d2 大小 N 观察 X 变量和 Y 个变量进行strong>N 次观察。
      为了在这两个不同数据帧 d1d2 的每一列之间找到 Wilcoxon-Matt-Whitney 检验:
      1. 读取数据:

      d1 <- data.frame(read.table("data1", header = TRUE, stringsAsFactors = FALSE, sep = ""))
      d2 <- data.frame(read.table("data2", header = TRUE, stringsAsFactors = FALSE, sep = ""))
      

      假设 d1 中的列数大于 d2 中的列数

      length(colnames(d1)) >= length(colnames(d2))  
      

      2.声明一个矩阵来存储p值

      pvalue <- matrix(nrow = length(colnames(d2)), ncol = (length(colnames(d1)))  
      

      3. 现在对 d2$1 的每一列进行 Wilcoxon-Matt-Whitney 检验,其中 d1$1, d1$2, d1$3, ...等等

      for(i in 1:length(colnames(d2))){
        for(j in 1:length(colnames(d1))){
          pvalue[i,j]<-wilcox.test(d2[,i], d1[,j], paired=TRUE)$p.value 
          colnames(pvalue) <- colnames(d1)
          rownames(pvalue) <- colnames(d2)} }  
      

      注意:如果我们想对单个数据框执行 Wilcoxon-Matt-Whitney 检验以查找同一数据框的一列与另一列之间的关系,此方法也可以正常工作。

      d3 <- data.frame(read.table("data3", header = TRUE, stringsAsFactors = FALSE, sep = ""))  
      pvalue <- matrix(nrow = length(colnames(d3)), ncol = (length(colnames(d3)))
      

      现在对 d3$1 的每一列进行 Wilcoxon-Matt-Whitney 检验,其中 d3$1, d3$2, d3$3, ... 等等

      for(i in 1:length(colnames(d3))){
        for(j in 1:length(colnames(d3))){
          pvalue[i,j]<-wilcox.test(d3[,i], d3[,j], paired=TRUE)$p.value 
          colnames(pvalue) <- colnames(d3)
          rownames(pvalue) <- colnames(d3)} }
      

      【讨论】:

        【解决方案4】:

        这里是使用包的替代方法,在 iris 第一列 1-2 和列 3-4 之间进行 wilcox 测试。

        library(matrixTests)
        col_wilcoxon_twosample(iris[,1:2], iris[,3:4])
        
                     obs.x obs.y obs.tot statistic       pvalue alternative location.null exact corrected
        Sepal.Length   150   150     300     19249 1.702530e-26   two.sided             0 FALSE      TRUE
        Sepal.Width    150   150     300     22362 1.295486e-49   two.sided             0 FALSE      TRUE
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-09-29
          • 2020-09-13
          • 2022-11-15
          • 2018-03-29
          • 2017-11-05
          • 2018-03-01
          • 1970-01-01
          相关资源
          最近更新 更多