Hmisc包rcorr函数输出p值为0,如何获取精确极小p值?
解决Hmisc::rcorr极小p值显示为0的问题
当使用Hmisc包的rcorr函数计算矩阵的Pearson相关系数及p值时,极小的p值会因为默认打印格式的位数限制显示为0,但实际数值是存在的,以下是获取精确p值的方法:
1. 可复现示例
library(Hmisc) set.seed(123) # 构造高度相关的变量对A/B,以及无关变量C A <- rnorm(1000) B <- A + rnorm(1000, sd = 0.01) C <- rnorm(1000) mat <- cbind(A, B, C) # 执行rcorr计算 rcorr_res <- rcorr(mat, type = "pearson") # 默认打印p值矩阵,A/B对显示为0 rcorr_res$P
此时用cor.test(A, B)$p.value能得到精确的1.036733e-59,但rcorr_res$P里A/B的p值显示为0。
2. 获取精确p值的方法
方法一:调整打印精度
直接修改print函数的digits参数,设置足够多的有效数字,就能显示出极小的p值:
# 设置显示20位有效数字 print(rcorr_res$P, digits = 20)
此时A/B对的p值会显示为1.03673297280607e-59,和cor.test的结果一致。
方法二:直接提取矩阵元素
rcorr返回的P矩阵中存储的是原始精确数值,只是打印时被格式化了,直接访问对应位置的元素就能获取精确值:
# 获取A和B对应的p值 rcorr_res$P["A", "B"]
方法三:保存原始数据到文件
如果需要批量导出精确p值,避免格式化问题,可以用write.table或saveRDS保存:
# 导出为制表符分隔的文本文件 write.table(rcorr_res$P, "p_values_exact.txt", quote = FALSE, sep = "\t", row.names = TRUE) # 保存为R数据文件,后续可直接读取使用 saveRDS(rcorr_res$P, "p_values_exact.rds")
原因说明
rcorr默认的打印逻辑会限制显示的数字位数,当p值远小于1e-16时,默认打印就会显示为0,但矩阵内部实际存储的是完整的浮点数值,只要调整打印精度或直接访问元素就能获取精确值。
内容的提问来源于stack exchange,提问作者Fabrice
相关产品推荐
相关产品推荐

