Вычисление мельчайших чисел для численной точности распределения хи-квадрат

Я использую функцию pchisq в R для вычисления кумулятивной функции распределения для распределения хи-квадрат. Я хотел бы рассчитать очень маленькие значения, чтобы 1-pchisq(...) могло иметь значение меньше 2,2e-16 (что является числовым пределом точности для числового формата R). Прямо сейчас эти очень маленькие значения просто становятся 0.

Что я пробовал:

  • Установка параметра отображения цифр на 22 (макс.)

  • Использование пакета Rmpfr для повышения точности, но этот числовой формат не работает с функцией pchisq

  • Разбиение функции CDF на составляющие ее гамма-функции, но это приводит к аналогичным ограничениям точности. Любые идеи о том, как я могу рассчитать то, что я хочу?

Предыстория: я использую метод Фишера для объединения множества p-значений. Да, я знаю, что эти p-значения ничтожны, но на самом деле они полезны для того, что я анализирую.


person Vance    schedule 20.10.2016    source источник
comment
это, вероятно, неправильное место, чтобы спросить о статистике.   -  person Mox    schedule 20.10.2016
comment
не могли бы вы вычислить log(1-pchisq)?   -  person Severin Pappadeux    schedule 20.10.2016


Ответы (1)


Несколько вещей.

  • 2.2e-16 не является нижним пределом точности значений в R; это просто способ, которым R печатает очень маленькие p-значения по умолчанию, используя format.pval:
format.pval(1e-20)
## [1] "< 2.22e-16"
  • значения меньше приблизительно 1e-320 делают округляют до нуля:
1e-330
## [1] 0

Предложение @SeverinPappadeux совершенно верно:

pchisq(121231,1,lower.tail=FALSE,log.p=TRUE)
## [1] -60621.58

Это эквивалентно 10^(-26327):

-60621.58/log(10)
## -26327.62

Проверьте менее экстремальное значение:

log10(pchisq(100,1,lower.tail=FALSE) )
## [1] -22.81702
pchisq(100,1,lower.tail=FALSE,log.p=TRUE)/log(10)
## [1] -22.81702

Кроме того, log(p) — это именно то, что вам нужно использовать для метода Фишера.

person Ben Bolker    schedule 20.10.2016