如何在 R 中获得精确的极低 P 值(在对数刻度或其他方面)[已关闭]

How to get exact extremely low P-value in R (on log scale or otherwise) [closed]

提问人:Chirag Krishna 提问时间:4/1/2023 最后编辑:Chirag Krishna 更新时间:4/3/2023 访问量:178

问:


这个问题是由错别字或无法再现的问题引起的。虽然类似的问题可能在这里是主题,但这个问题的解决方式不太可能帮助未来的读者。

8个月前关闭。

我在 R 中运行线性回归模型,这种关联非常显着——P 值远低于标准的 2.2e-16。

回归的 t 统计量为 -44.85 自由度为33689。

有没有办法获得确切的 P 值,甚至是 -log10(P)?我尝试了几种不同的东西——首先,Rmpfr 包对学生的 T 发行版没有很好的支持。

另外,还有这篇文章: 小数点 - 语言 R 中的概率值为 0,但投票最多的评论中的答案并不完全正确。假设我们在那篇帖子中使用了给定的例子:

d <- data.frame(x=rep(1:5,each=10))
set.seed(101)
d$y <- rnorm(50,mean=d$x,sd=0.0001)
lm1 <- lm(y~x,data=d)

从我们可以看出,P = 9.690173e-203coef(summary(lm1))

答案是我们可以从以下位置获得 log(P)(这是我想要的):

tval <- coef(summary(lm1))["x","t value"] 2*pt(abs(tval),df=48,lower.tail=FALSE,log.p=TRUE)/log(10)

这给出了 -404.6294。此值不是 log(P)。如果我们执行 -log10(9.690173e-203),答案是 202.0137;它不等于 404.6294 或 404.6294/2 = 202.3147。

有没有解决方法?非常感谢您的帮助。谢谢!

R 浮点 回归 精度 数值

评论

2赞 Onyambu 4/1/2023
log以 10 为基数,而不是以 10 为基数e
0赞 Onyambu 4/1/2023
检查 VSlog(coef(summary(lm1))[2,4])pt(coef(summary(lm1))["x","t value"] , 48, lower.tail = FALSE, log.p = TRUE)
0赞 Chirag Krishna 4/1/2023
谢谢@onyambu,我检查了它们,它们很接近,但并不完全相等。您建议如何获得正确的对数(以 e 为基数或以 10 为基数)pval?对不起,如果我错过了一些非常基本的东西......
0赞 Onyambu 4/1/2023
他们相等的唯一方法是获得 2*pt。IE 与log(pt(coef(summary(lm1))["x","t value"] , 48, lower.tail = FALSE)*2)log(coef(summary(lm1))[2,4])
0赞 Chirag Krishna 4/1/2023
谢谢@onyambu,我想如果我们想要我原始示例的对数(基数 e)p 值,其中无法获得确切的 p 值,那么最好的方法是将结果四舍五入到最接近的整体?pt(coef(summary(lm1))["x","t value"] , 48, lower.tail = FALSE, log.p = TRUE)

答:

1赞 Onyambu 4/1/2023 #1

您可以使用:

log(2) + pt(coef(summary(lm1))["x","t value"] , 48, lower.tail = FALSE, log.p = TRUE) 
[1] -465.1537

这与 p 值的对数完全相似:

log(coef(summary(lm1))[2,4])
[1] -465.1537

评论

0赞 Chirag Krishna 4/12/2023
谢谢@onyambu,非常感谢您的帮助。您知道从对数 P 值获取 z 分数的方法吗?例如,如果 P 是 5e-08,那么 z 分数是 - 但如果 p 太小,这将返回 Inf......qnorm(5e-08/2, lower.tail = FALSE, log.p = FALSE)
0赞 Chirag Krishna 4/12/2023
没关系,@Ben Bolker 很好地回答了这个问题!stackoverflow.com/questions/67560210/......