1

我正在尝试使用 R 包 multtest 来调整 p 值列表以进行多次测试。但是,multtest 将仅返回与分析的 p 值列表等长的“1”字符列表。

输入文件是一个文本文件,其中 pvalue 由换行符分隔。该文件的一部分复制如下:

0.182942602
0.333002877
0.282000206
0.161501682
0.161501682  

我从 Bioconductor 下载了 multtest 包 (multtest_2.14.0),并在 R 版本 x64 2.15.2 中运行它。有谁知道 multtest 和 R 2.15.2 之间是否存在兼容性问题?

我的代码:

library(multtest, verbose = FALSE)
table1 <- read.table("p-values.txt", header = FALSE, colClasses = "double")
table2 <-as.vector(as.double(table1[,1]))
results<-p.adjust(table2, method = c("holm", "hochberg", "hommel", "bonferroni", "BH", "BY", "fdr", "none"))
write.table(results, file = "output.txt")
4

1 回答 1

1

这不是错误——当在该 p 值向量中没有可被视为显着的 p 值时,这是正确的调整。

您的代码执行 Holm 校正(method仅接受一个参数,在这种情况下将使用"holm"方法,即向量中的第一项)。Holm 方法将在以下情况下正确返回所有

min(p) * length(p) > 1

在那种情况下(使用这个多重假设检验框架),向量中没有可以被认为是显着的 p 值。


如果您想查看血淋淋的细节,该holm方法的代码(直接取自 multtest 包)是

i <- seq_len(lp)
o <- order(p)
ro <- order(o)
pmin(1, cummax((n - i + 1L) * p[o]))[ro]

其中p是输入向量, 和lpn向量的长度。该表达式(n - i + 1L) * p[o]是说“对于排序列表中的每个项目,n+1减去它的索引,然后乘以它的值”。对于最小项目,即(n + 1 - 1) * min(p)-> n * min(p)。表示累积最大值- 这cummax意味着后续项都不能小于第一个值。并且pmin(1, ...)意味着对于向量中的每个项目,如果项目大于 1,则将值设置为等于 1(因为大约 1 的 p 值是没有意义的)。

这意味着如果n * min(p)大于 1,则最小项的调整 p 值为 1,这意味着每个项目的调整 p 值必须为 1。

于 2013-03-14T15:04:40.643 回答