простого вопроса по простому ], казалось бы, невинная функция: сводка
.
Пока я не увидел результаты для 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 - он помог мне понять, как делается эта колбаса. Видя, что происходит, я не думаю, что есть способ сделать то, о чем я прошу, без переписывания резюме
.