Используемый здесь набор данных представляет собой риск (вероятность), а вероятности очень малы. При использовании функции summary
в R получается следующее
> summary(prob_ann)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.000e+00 1.000e-16 1.034e-13 3.959e-12 7.880e-13 8.222e-10
Однако запрос фактического минимума дает правильное значение:
> min(prob_ann)
## [1] 1.199446e-35
У меня такой вопрос: ¿почему summary
использует научную запись, но по-прежнему сообщает значение ИСТИННЫЙ НУЛЬ вместо правильного значения 1.199e-35
?
Обновление №1
Несмотря на то, что информации для «отладки» этого вопроса было более чем достаточно (как было продемонстрировано пользователем, который фактически ответил на вопрос), кто-то «закрыл» этот вопрос, потому что не было достаточно информации для воспроизведения проблемы. Опять же, любопытно, что это было оправданием, когда принятый ответ ясно доказал их неправоту... что поднимает вопрос: «почему этот вопрос был закрыт?»
Но вот «запрошенный» код:
set.seed(123)
prob_ann <- c(1.199446e-35, runif (100, 3.33e-15, 9.99e-10))
summary(prob_ann)
min(prob_ann)
quantile(prob_ann,probs=c(0,1))
Почти уверен, что это относится к точности плавающих чисел. Если вы запустите all.equal(1.199446e-35, 0)
, результат будет TRUE
, поэтому для большинства целей можно утверждать, что summary
и min
возвращают одно и то же значение.
Из онлайн-документа: ## S3 method for class data.frame summary(object, maxsum = 7, digits = max(3, getOption("digits")-3), ...)
. Поэтому попробуйте указать другое значение digits
при вызове summary
.
Что касается того, почему он отображается по-другому, у summary
есть собственный метод печати, и он использует функцию quantile()
для получения минимума и максимума, а не min()
и max()
, поэтому выполняется немного другой код.
Когда я устанавливаю цифры = 4, он все равно показывает 0,000e+00. И когда я использую функцию квантиля с пробами = c (0,1), она дает правильное научное-нет с 7 цифрами. Так что... похоже, проблема не в этом.
Это касательная, поскольку она не дает прямого ответа на ваш вопрос. но вы можете проверить точность вашей машины с помощью .Machine$double.eps ; вообще говоря, любой рассчитанный вами результат, который меньше этого, не следует считать заслуживающим доверия, «ложной точностью».
Вам следует использовать «summary(log10(prob_ann))». Если у вас малые вероятности, всегда лучше работать в логарифмическом масштабе.
Еще лучше (точнее), если вероятности сначала будут рассчитаны в логарифмическом масштабе.
Кстати...(1) Я знаю о проблеме точности станка; (2) Я работаю с журналами значений, когда могу (а здесь не могу); и (3) я даже использую соответствующие приближения для решения проблем с точностью машины, такие как $1-e^{-x}\approx x$. Но я хочу знать, почему функция решает точно сообщить некоторые значения с помощью sci-not, а не других... и ни один из этих обходных путей не помогает мне решить этот вопрос.
Это не ИСТИННОЕ нулевое значение. Причина, по которой минимум, показанный summary
, отличается от фактического минимума, заключается в классе выходного значения.
set.seed(123)
prob_ann <- c(1.199446e-35, runif (100, 0, 8.222e-10))
res <- summary(prob_ann); res
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.000e+00 2.003e-10 3.831e-10 4.059e-10 6.203e-10 8.175e-10
min(prob_ann)
[1] 1.199446e-35
class(res)
#[1] "summaryDefault" "table"
Вторая последняя строка функции summary.default
:
class(value) <- c("summaryDefault", "table")
первый аргумент изменяет форматирование вывода благодаря функции print.summaryDefault
:
function (x, digits = max(3L, getOption("digits") - 3L), ...)
{
xx <- x
if (is.numeric(x) || is.complex(x)) {
finite <- is.finite(x)
xx[finite] <- zapsmall(x[finite])
}
...
print.table(xx, digits = digits, ...)
invisible(x)
}
Таким образом, результат округляется (доказательство см. в zapsmall
).
?zapsmall
zapsmall определяет аргумент цифр dr для вызова round(x, digits = dr) такие, что значения, близкие к нулю (по сравнению с максимальным абсолютным значение в векторе) «заменяются», т. е. заменяются на 0.
Если вы хотите увидеть неформатированный результат, вы можете использовать unclass
:
unclass(res)
Min. 1st Qu. Median Mean 3rd Qu. Max.
1.199446e-35 2.066278e-10 4.407913e-10 4.176800e-10 6.351261e-10 8.195258e-10
или используйте print.table
вместо этого:
print.table(res)
Min. 1st Qu. Median Mean 3rd Qu. Max.
1.199446e-35 2.066278e-10 4.407913e-10 4.176800e-10 6.351261e-10 8.195258e-10
Спасибо... мое незнание информации о классе поставило меня в тупик. Я поиграю с этим, но предполагаю, что если бы все вероятности были < 10^-16, тогда класс автоматически обновился бы, чтобы отображать все # в правильном научном значении.
Буду рад поделиться миниатюрным набором данных, если это поможет.