Меняют ли R классы числовые значения? - PullRequest
1 голос
/ 09 мая 2019

Поскольку у меня уже были подобные проблемы здесь , я просто задал другой вопрос: stats::t.test возвращает p-value < 2.2e-16. Но из математики я получаю p_value <- 2 * pt(-abs(t), df) # [1] 1.929352e-17. Что не так?

Я только начал отладку, как было предложено:

debug(stats:::t.test.default)
vals <- data.frame(a = c(4, 2, 4, 7, 3, 4, 8, 8, 3, 0, 1, 5, 4, 6, 4, 8, 7, 
                         9, 6, 6, 3, 6, 7, 4), 
                   b = c(5, 7, 6, 13, 12, 6, 14, 16, 4, 2, 7, 7, 4, 8, 9, 9, 
                         11, 13, 12, 8, 3, 8, 7, 7))

stats::t.test(x = vals)
# One Sample t-test
# data:  vals
# t = 13.214, df = 47, p-value < 2.2e-16

Затем вы шагаете до линии 98,

enter image description here

, где pval оценивается как 1.929352e-17, что я и ожидал. Это остается неизменным до строки 112, где установлен класс class(rval) <- "htest".

enter image description here

Что не так? Меняют ли классы значения? К сожалению, я не знаю, как понять / отладить код за строкой 112.

1 Ответ

4 голосов
/ 09 мая 2019

Нет. Классы не меняют значения, но они меняют способ их печати. Поскольку возвращаемый класс является htest объектом, stats:::print.htest() используется для получения результата. Чтобы сделать вещи более привлекательными, эта функция форматирует числа, чтобы у них было разумное количество десятичных знаков. Он использует функцию format.pval, чтобы p-значения выглядели красиво. После того, как p-значения станут действительно маленькими, не будет смысла показывать все цифры, поэтому R просто скажет вам, что в какой-то момент оно меньше определенного значения. Например

format.pval(1e-20)
# [1] "< 2.22e-16

«Реальное» значение все еще сохраняется в объекте

x <- stats::t.test(x = vals)
x$p.value
# [1] 1.929352e-17

Это очень распространенный шаблон в R, где просто значение print() не обязательно показывает, что там «на самом деле»; это просто симпатичное отображение этого объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...