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
, мы получаем следующий результат: обратите внимание на несоответствие значений диапазона по сравнению с Min и Max:
> 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, которые не являются 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
.