为何R语言中summary函数与min函数返回的最小值存在差异?
关于R语言summary函数极小值显示异常的问题
我使用的是一组极小的风险概率数据,在R语言中调用summary()函数时,得到如下结果:
> summary(prob_ann) ## Min. 1st Qu. Median Mean 3rd Qu. Max. ## 0.000e+00 1.000e-16 1.034e-13 3.959e-12 7.880e-13 8.222e-10
但调用min()函数查询实际最小值时,得到了正确结果:
> min(prob_ann) ## [1] 1.199446e-35
问题:为什么summary函数明明采用科学计数法输出,却返回0而非正确的1.199e-35?
更新#1
明明已有足够信息排查问题(且已有解答),却有人以「无法复现」为由关闭问题,这让人费解。以下是复现代码:
set.seed(123) prob_ann <- c(1.199446e-35, runif(100, 3.33e-15, 9.99e-10)) summary(prob_ann) min(prob_ann) quantile(prob_ann,probs=c(0,1))
问题原因
核心在于summary()和min()的计算逻辑完全不同:
min()是直接遍历整个向量,精准取出最小的那个数值,所以能返回1.199446e-35;summary()底层依赖quantile()函数计算分位数,默认用的是type=7算法。当数据里存在一个远小于其他样本量级的极小值时,这个算法会对0分位数(即最小值)进行近似处理,最终输出0。
你可以自行验证:调用quantile(prob_ann, probs=0, type=7)会返回0;但如果指定用type=1算法(直接取实际最小值),quantile(prob_ann, probs=0, type=1)就能给出正确的极小值。
解决办法
如果想要summary()返回真实的最小值,可以自定义一个summary函数,指定分位数算法为type=1:
# 自定义summary函数 custom_summary <- function(x) { # 用type=1计算分位数 q_vals <- quantile(x, probs = c(0, 0.25, 0.5, 0.75, 1), type = 1) # 组装summary的结果结构 res <- c(q_vals[1], q_vals[2], q_vals[3], mean(x), q_vals[4], q_vals[5]) names(res) <- c("Min.", "1st Qu.", "Median", "Mean", "3rd Qu.", "Max.") res } # 使用自定义函数查看结果 custom_summary(prob_ann)
内容的提问来源于stack exchange,提问作者Gregg H
相关产品推荐
相关产品推荐

