Исправление «сводки» в R с соответствующим количеством цифр точности

простого вопроса по простому ], казалось бы, невинная функция: сводка .

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

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

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

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

    > 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

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

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

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


Обновление 1: Как заметил @BrianDiggs по ссылкам, поведение задокументировано, но неожиданно. Чтобы прояснить мою проблему, относительно ответов на ссылку, предоставленную Брайаном (за исключением ответа самого Брайана): дело не в том, что поведение недокументировано, но категорически неправильно обозначать как значения Min и Max, которые не являются Min и Max. Задокументированная функция, которая дает неправильный вывод в настройках по умолчанию, должна использоваться с настройками, отличными от настроек по умолчанию (или не должна использоваться). (Может быть, можно было бы поспорить, следует ли переименовывать «Мин» и «Макс» в «Приблизительный минимум» и «Приблизительный максимум», но не будем вдаваться в подробности.)

Обновление 2: как отметил @Dwin, сводка () принимает по умолчанию max (3, getOption ("цифры") - 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 в сводке . data.frame выглядит как ( мне жаль душу за то, что я сказал это ) как хакер.

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

17
задан Iterator 22 October 2011 в 04:00
поделиться