如何对两个数据框之间的列进行 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】:我们有两个不同的数据框 d1 和 d2 大小 N 观察 X 变量和 Y 个变量进行strong>N 次观察。 为了在这两个不同数据帧 d1 和 d2 的每一列之间找到 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 测试的主要内容,如果未能解决你的问题,请参考以下文章