Исправление «сводки» в R с соответствующим количеством цифр точности - PullRequest
15 голосов
/ 20 октября 2011

A простой вопрос о простой , казалось бы, невинной функции: summary.

Пока я не увидел результаты для Min и Max, которые выходили за пределы диапазона моих данных, я не знал, что summary имеет аргумент digits для указания точности выходных результатов. Мой вопрос о том, как решить эту проблему чисто и универсально.

Вот пример проблемы:

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

Применяя summary и range, мы получаем следующий вывод - обратите внимание на расхождение значений диапазона по сравнению с минимальным и максимальным значениями:

    > 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

Просмотр ошибочных диапазонов в summary немного сбивает с толку, поэтому я посмотрел на параметр digits, но это просто стандартная запись для форматирования вывода. Также обратите внимание: Каждый отдельный квантиль, кроме Min, показывает значение, которое не существует в наборе данных (именно поэтому я поставил 1 + в определение для vals), и мы не увидим эти квантили в большинстве стандартных вычислений квантиля, даже учитывая различия в выборе средней точки. (Когда я увидел это в исходных данных, мне стало интересно, как я потерял значение 1 из всего!)

Существует разница между объяснимым вычислительным поведением (то есть форматированием и точностью) и статистически мотивированными предположениями (такие значения, идентифицированные как квантили, фактически находятся в пределах диапазона набора данных). Поскольку мы не можем изменить ожидания, нам нужно изменить поведение кода или хотя бы улучшить его.

Вопрос: есть ли более подходящий способ установить выходной сигнал, чтобы быть уверенным в диапазоне, кроме как установить его на большое значение, например digits = 16? 16 - даже самый подходящий универсальный дефолт? Использование 16 цифр представляется наилучшей гарантией точности для двойных чисел, хотя, похоже, что на самом деле выходные данные не будут иметь 16 цифр (кажется, что вывод все еще усекается до 8 или 9 цифр).


Обновление 1: как заметил @BrianDiggs, по ссылкам поведение документировано, но неожиданно. Чтобы прояснить мою проблему, относительно ответов по ссылке, предоставленной Брайаном (исключая ответ самого Брайана): это не значит, что поведение недокументировано, но категорически неправильно обозначать как минимальные и максимальные значения, которые не являются минимальными и максимальными. Документированная функция, которая дает неправильный вывод в своих настройках по умолчанию, должна использоваться с настройками не по умолчанию (или не должна использоваться). (Возможно, можно поспорить, следует ли переименовать «Min» и «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

Обратите внимание, что теперь это имеет 20 цифр вывода, хотя передаваемый аргумент задает 10 цифр точности. Если мы установим глобальный параметр для цифр равным какому-либо «нормальному» значению, например 16, у нас все равно останутся проблемы, если мы предоставим summary с аргументом 10.

Я полагаю, что документация неполная, и Брайан Диггс указал на другие проблемы в своем вдумчивом ответе в ссылке на R-help.

Несмотря на эти морщины, вопрос остается открытым, но, возможно, на него нельзя ответить. Я подозреваю, что лучший результат - это просто оставить параметр глобальных цифр как есть (хотя меня немного беспокоят последствия описанного выше поведения) и вместо этого передать значение от 16 до summary. Не сразу очевидно, где указана точность вывода, но это взаимодействие 4 значений - глобального параметра (и глобального параметра - 3), переданного значения и жестко заданного значения 12 в summary.data.frame выглядит следующим образом ( будь милостив к моей душе за то, что сказал ) хак.

Обновление 3: я принимаю ответ DWin - это помогло мне понять, как изготавливается эта колбаса. Видя, что происходит, я не думаю, что есть способ сделать то, что я прошу, без переписывания summary.

1 Ответ

14 голосов
/ 20 октября 2011

Значение по умолчанию для 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  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...