如何在不更改 pvalue 的情况下为 kruskal wallis 测试执行循环比较多列上的 3 个组?
Posted
技术标签:
【中文标题】如何在不更改 pvalue 的情况下为 kruskal wallis 测试执行循环比较多列上的 3 个组?【英文标题】:How do I perform a loop for kruskal wallis test comparing 3 groups over multiple columns without changing the pvalue? 【发布时间】:2020-07-27 16:39:42 【问题描述】:我对 R 相当陌生,我正在尝试进行 kruskal wallis 测试,以查看在查看不同基因时三组之间是否存在差异。我有 3 组和 127 种蛋白质。我已经能够创建一个可以做到这一点的代码,
样本数据“
groups <- c("control","control","control","control","control","group1","group1","group1","group1","group1","group1","group1","group1","group1","group1","group1","group1","group1","group2","group2","group2","group2","group2","group2","group2","group2")
gene1 <- c(8,7,4,5,0,2,8,5,6,4,4,6,5,4,6,4,7,4,8,1,6,3,5,6,3,1)
gene2 <- c(8,10,10,9,7,5,8,10,8,9,10,9,6,9,8,7,8,7,8,9,9,7,7,6,9,8)
gene3 <- c(10,11,10,11,5,6,9,11,10,11,12,8,4,7,7,10,10,3,2,11,9,10,9,3,10,10)
gene4 <- c(4,4,3,2,0,2,4,4,3,3,4,1,1,1,4,4,3,2,3,4,4,1,4,3,2,2)
gene5 <- c(8,10,11,10,7,6,8,8,8,12,11,8,7,8,8,10,10,9,10,8,10,7,8,7,10,7)
mydata <- data.frame(groups,gene1,gene2,gene3,gene4,gene5)
i <- 2 #ignore 1st column as this is not a "protein"
pval <-NULL
repeat
K <- kruskal.test(df[,i], df[,1], data = df, paired=FALSE, p.adjust.methods="none")
pval <- c(as.matrix(sapply(K[3],as.numeric)),pval)
i <- i+1
if(i>ncol(df))break
不幸的是,获得的 pvalue 与我一次只对一个基因进行 kruskal wallis 测试得到的 pvalue 不同。例如:
对于 Gene1,从循环中获得的 pvalue 是 0.0389,但是当我运行 kruskal.test(Gene1,group, data=df) 时,我得到的 pvalue 是 0.84。
我遇到这种情况是因为在进行 kruskal wallist 检验后,我进行了成对的 Mann Whitney 检验,并注意到 Kruskal wallis 的“显着”p 值与 Mann Whitney 的“显着”p 值不相关。
此外,我继续使用 VassarStats 和 minitab,得到的 p 值为 0.84(平局调整)。我想知道如何在不影响 p 值的情况下循环运行这个 Kruskal wallis 测试。有什么我没有看到我做错了吗?
另外,我使用了我在上一篇文章中看到的 getAnywhere(kruskal.test.default),但我找不到在反复执行测试时会导致这种情况发生的原因。
【问题讨论】:
欢迎来到***。您可能会在stats.stackexchange.com 上得到更好的答案 您需要提供可用形式的数据样本。在数据样本上使用dput()
,而不是数据图片。当等级中存在关联时(就像您的数据中那样),任何非参数测试都将难以计算 p 值。最后,您对kruskal.test
的调用是错误的,应该会产生错误消息,除非您使用了来自不同包的版本而不是基本函数。
@dcarlson 您好,感谢您抽出宝贵时间查看我的问题。我已经对其进行了编辑并创建了一个更有用的示例。此外,正如您所指出的,我的数据中有联系,但我不明白为什么如果我使用其他在线计算得到相同的答案,这会影响循环时的输出。我使用 base R 来运行测试,这是我使用的代码的最后一个版本,我添加了 ("paired=FALSE, p.adjust.methods="none") 因为我想看看 pvalues 是否会类似于 kruskal 测试一次只做一个基因。是错误的部分还是我的整个代码?谢谢
【参考方案1】:
当我隔离 kruskal 测试线时,我没有得到您的结果。
df <- mydata
i <- 2
kruskal.test(df[,i], df[,1], data = df, paired=FALSE, p.adjust.methods="none")
#
# Kruskal-Wallis rank sum test
#
# data: df[, i] and df[, 1]
# Kruskal-Wallis chi-squared = 0.66988, df = 2, p-value = 0.7154
我认为您的 pval 分配行导致了问题。但是您并没有充分利用 R。首先,请始终阅读函数的手册页。 kruskal.test
函数不采用 data=
参数,除非您指定公式,也不采用 paired=
参数(仅与两组之间的测试相关),也不采用 p.adjust.methods=
参数。你只是在猜测和浪费你的时间。获取 R 教程并花一天左右的时间学习基础知识。你的整个代码可以表达如下:
pval <- sapply(2:6, function(x) kruskal.test(mydata[,x], mydata[,1])$p.value)
pval
# [1] 0.7153797 0.4424115 0.5360940 0.9816007 0.6118471
【讨论】:
以上是关于如何在不更改 pvalue 的情况下为 kruskal wallis 测试执行循环比较多列上的 3 个组?的主要内容,如果未能解决你的问题,请参考以下文章
如何在不影响 SYSTEM/IE 代理的情况下为 Webbrowser Control 设置代理
在不使用 MVC 更改 URL 的情况下为特定 URL 创建路由
如何在不调用该 Activity 的 API 调用的情况下为横向和纵向模式使用不同的设计?
如何在不使用 @Composable 注释的情况下为撰写函数创建扩展?