如何对两个数据框之间的列进行 Wilcoxon 测试

Posted

技术标签:

【中文标题】如何对两个数据框之间的列进行 Wilcoxon 测试【英文标题】:How to do Wilcoxon test on columns between two dataframes 【发布时间】: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 中以测试可能的解决方案。 【参考方案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

【讨论】:

以上是关于如何对两个数据框之间的列进行 Wilcoxon 测试的主要内容,如果未能解决你的问题,请参考以下文章

python - 如何选择两个数据框之间的差异及其不同的列

如何在以下数据框的列之间进行迭代? [复制]

如何计算不同数据框的列之间的数值差异?

如何同时对熊猫数据框中的列进行排序[重复]

如何对数据框中有日期的列进行排序?

如何根据基于其他列的列对数据框进行排序[重复]