用适当的精度数字校正R中的"摘要"

Ite*_*tor 17 precision formatting r

一个简单的问题简单的貌似无辜的功能:summary.

直到我看到Min和Max的结果超出了我的数据范围,我才意识到它summary有一个digits参数来指定输出结果的精度.我的问题是如何以干净,普遍的方式解决这个问题.

以下是此问题的示例:

set.seed(0)
vals    <- 1 + 10 * 1:50000
df      <- cbind(rnorm(10000),sample(vals, 10000), runif(10000))
Run Code Online (Sandbox Code Playgroud)

应用summaryrange,我们得到以下输出 - 注意范围值与最小值和最大值之间的差异:

    > apply(df, 2, summary)

                [,1]   [,2]      [,3]
    Min.    -3.703000     11 6.791e-05
    1st Qu. -0.668500 122800 2.498e-01
    Median   0.009778 248000 5.014e-01
    Mean     0.010450 248800 5.001e-01
    3rd Qu.  0.688800 374000 7.502e-01
    Max.     3.568000 499900 9.999e-01

    >     apply(df, 2, range)
            [,1]   [,2]         [,3]
    [1,] -3.703236     11 6.790622e-05
    [2,]  3.568101 499931 9.998686e-01
Run Code Online (Sandbox Code Playgroud)

看到错误的范围summary有点令人不安,所以我查看了该digits选项,但这只是格式化输出的标准表示法. 另请注意:除Min之外的每个分位数都显示数据集中不存在的值(这就是为什么我1 +在定义中添加了一个vals),也不会在大多数标准分位数计算中看到这些分位数,甚至允许在中点选择.(当我在原始数据中看到这个时,我想知道我从一切中失去了1的值!)

之间是有差别可解释计算行为(即格式化和精度)和统计学激励expecations(这样的值识别为实际上是分位数的数据集的范围内).由于我们无法改变期望,我们需要改变代码的行为或至少改进它.

问题:是否有更合适的方法来设置输出以确定范围,而不是将其设置为较大的值,例如digits = 16?16甚至是最合适的普遍默认值吗?使用16位数似乎是双浮点精度的最佳保证,尽管看起来输出实际上不会有16位数(输出似乎仍然被截断为8位或9位).


更新1:正如@BrianDiggs所指出的那样,通过链接记录了行为,但出乎意料.为了澄清我的问题,相对于Brian提供的链接上的答案(除了Brian自己的回答):并不是行为没有记录,但是将Min和Max值表示为Min和Max是完全错误的.在默认设置中提供错误输出的文档化功能需要与非默认设置一起使用(或不应使用).(也许有人可能会争辩"Min"和"Max"是否应该重命名为"Approximate Min"和"Approximate Max",但是我们不要去那里.)

更新2:正如@Dwin所说,summary()默认情况下max(3, getOption("digits") - 3).我之前错误地说默认值为3.有趣的是,这意味着有两种方法来设置输出的行为.如果我们同时使用两者,行为会变得奇怪:

> options(digits = 20)
> apply(df, 2, summary, digits = 10)

                             [,1]                  [,2]                      [,3]
Min.    -3.7032358429999998605808     11.00000000000000 6.7906221370000004927e-05
1st Qu. -0.6684710537000000396546 122798.50000000000000 2.4977348059999998631e-01
Median   0.0097783099960000001427 247971.00000000000000 5.0137970539999998643e-01
Mean     0.0104475229200000005458 248776.38699999998789 5.0011818200000002221e-01
3rd Qu.  0.6887842181000000119084 374031.00000000000000 7.5024240300000000214e-01
Max.     3.5681007909999999938577 499931.00000000000000 9.9986864070000003313e-01
Run Code Online (Sandbox Code Playgroud)

请注意,这现在有20位输出,即使传递的参数指定了10位精度.如果我们将数字的全局选项设置为像16这样的"理智"值,如果我们提供summary10的参数,我们仍然会遇到问题.

我相信文档是不完整的,Brian Diggs在与R-help链接的深思熟虑的答案中指出了其他问题.

尽管存在这些皱纹,但问题依然存在,但也许无法回答.我怀疑最好的结果只是按原样保留全局数字选项(尽管我对上述行为的含义有点不安),而是将值16传递给summary.在指定输出精度的位置并不是很明显,但是4个值的相互作用 - 全局选项(和全局选项-3),传递的值和12的硬编码值summary.data.frame看起来像(有meRcy)在我的灵魂上说这个)黑客.

更新3:我接受了DWin的回答 - 这让我了解了这种香肠是如何制作的.看到发生了什么,我认为没有办法做我要求的,没有重写summary.

42-*_*42- 15

默认值summary.data.frame不是数字= 3,而是:

   ... max(3, getOption("digits") - 3)  # set in the argument list
getOption("digits")    # the default setting
[1] 7
options(digits=10)
> summary(df)
       V1                    V2                 V3              
 Min.   :-3.70323584   Min.   :    11.0   Min.   :6.790622e-05  
 1st Qu.:-0.66847105   1st Qu.:122798.5   1st Qu.:2.497735e-01  
 Median : 0.00977831   Median :247971.0   Median :5.013797e-01  
 Mean   : 0.01044752   Mean   :248776.4   Mean   :5.001182e-01  
 3rd Qu.: 0.68878422   3rd Qu.:374031.0   3rd Qu.:7.502424e-01  
 Max.   : 3.56810079   Max.   :499931.0   Max.   :9.998686e-01  
Run Code Online (Sandbox Code Playgroud)

  • 看看这个我不会期望summary.data.frame的默认值发挥作用,因为你没有将类"data.frame"的对象传递给summary.但我错了.而且输出看起来很可疑是病态的. (2认同)