R 当Wilcoxon测试返回一些0 p值时,该怎么办?

R 当Wilcoxon测试返回一些0 p值时,该怎么办?,r,statistical-test,R,Statistical Test,我在一个大列表中使用R执行Wilcoxon测试(包含86个数据帧,行数和值数可变)。我不明白为什么在p值

我在一个大列表中使用R执行Wilcoxon测试(包含86个数据帧,行数和值数可变)。我不明白为什么在p值<10^-307之后,它返回一些p值=0,然后返回“正常”值。 这种情况发生在行数非常多(约4000行或更多)的数据帧中,但不发生在约1000行的数据帧中。 我是否得到了错误的脚本,或者是否可能得到0值?如果是的话,有没有特别的方法来解释它们

我在这里报告我的脚本:

for (i in 1 : length(List)) {   
    for(j in 2 : (nrow(List[[i]]) - 1)){
        divider <- (List[[i]][j,2])
        ValueInfe <- List[[i]][List[[i]][,2] < divider ,]
        ValueSupUgu <- List[[i]][List[[i]][,2] >= divider ,]
        if(j == 2){Num_ValoreInfe <- as.numeric(ValoreInfe[2])}
        if(j!= 2){Num_ValoreInfe <- as.numeric(ValoreInfe[,2])}
        Num_ValoreSupUgu <- as.numeric(ValoreSupUgu[,2])
        b <- wilcox.test(Num_ValoreInfe, Num_ValoreSupUgu)
        List2.0[[i]][j,3] <- b$p.value
    }

通常情况下,R能与零区分的最小数字约为1e-308(即10^(-308))——具体而言,
.Machine$double.xmin
=2.225074e-308。更准确地说,R可以处理稍小的值:
?机器说:

请注意,在大多数平台上,正值小于 可能出现“.Machine$double.xmin”。在典型的R平台上 最小的正双精度约为“5e-324”

如果你想处理比这个小的数字,你必须做一些聪明的事情,比如记录它们的对数(
log(.Machine$double.xmin)
is-708,这样你就可以很容易地记录小得多的数字)。R中的一些p值计算允许您检索log-p值而不是p值,但是Wilcoxon测试没有这样的功能


如果你非常需要的话,也许可以从头开始建立这样的能力,但研究人员通常只把这样的p值视为“非常小”;你可以说“我想象这可能是一个近似问题。但是为了消除任何疑问,我创建了一个值为1e-311的向量,奇怪的是它读得正确(所以它不近似于0)。也许r可以读这么小的值​​仅适用于向量,而不适用于数据帧?R可以处理稍小的值:尝试
10^(-301:-350)
(在到达1e-324之前,这些值实际上不会下溢到零)。从技术上讲,
.Machine$double.xmin
给出的值是“最小的非零规范化浮点数”“我必须深入到更多的技术细节来解释为什么我们可以降低一点。但是定性的想法是一样的。(参见编辑)不幸的是,我想我需要log p值。您能告诉我如何设置脚本以获取它吗?您可以在此处看到计算p值的代码:。此代码调用
pwilcox()
函数,该函数具有
log.p
参数。因此,如果提取测试统计数据并调用
pwilcox(…,log.p=TRUE)
,则可以获得log-p值…请参阅编辑。对于这样极端的样本量,我们需要的是近似值,而不是精确的p值。。。
0.000000e+00
8.343024e-02
1.435822e-02
2.716505e-03
5.370877e-04
1.089895e-04
2.250558e-05
4.706192e-06
9.936437e-07
2.114061e-07
4.526195e-08
9.741929e-09
2.106339e-09
4.572291e-10
9.960156e-11
9.960156e-11
[...]
0
0
0
0
0
[...]
2.114061e-07
9.936437e-07
4.706192e-06
2.250558e-05
1.089895e-04
5.370877e-04
2.716505e-03
1.435822e-02
0.000000e+00