Как рассчитать обратное нецентральное f-распределение в python? - PullRequest
1 голос
/ 05 апреля 2019

Я пытаюсь использовать функции здесь для вычисления обратной величины cdf нецентрального F-распределения

scipy.special import ncfdtr,ncfdtri, ncfdtridfd, ncfdtridfn,ncfdtrinc '

Я использую

  • 2 и 5-2=3 как степень свободы
  • 5/ (0.001042**2 ) как nc, что, я думаю, должно быть правильным.
  • 1-0.0027=0.9973 как p длягде я думаю, что это должен быть вывод cdf

Но я пробовал каждую функцию, но все, что я получаю, это nan и 0.0.

Я также пытался использовать Excelверсия с здесь , с p=0.0027, но я не могу получить то же значение при использовании python

print(ncfdtri( dfd, dfn, ncp, a )) = 264386.8371546744, когда это 259533,97396 в Excel

print(ncfdtri(dfn, dfd, ncp, a )) = 496074.40359445167, когда это 487951.32384 в Excel

Но когда я попытался использовать a=1-0.0027, что дает мне 1e+100 для обоих, что я думаю, это не ответ.

Может кто-нибудь помочь мне вэто пожалуйста.

1 Ответ

0 голосов
/ 06 апреля 2019

Чтобы получить обратный CDF, вам нужно вызвать функцию Percent point, или PPF.

Во-первых, есть вопросы по поводу вашего параметра nc - он составляет около 5 000 000, что делает очень резкий шаг на графике.Итак, код

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import ncf

dfn = 2
dfd = 3
nc  = 5 / (0.001042**2) # 1.0

rv = ncf(dfn, dfd, nc) # RV of non-central F distribution

x = np.linspace(0.01, 0.99, 100) # for inverse CDF, [0...1] is proper X interval

fig, ax = plt.subplots(1, 1)
ax.plot(x, rv.ppf(x), 'r-', lw=5, alpha=0.6, label='ncf PPF(inv.CDF)')

plt.show()

print(rv.ppf(0.9973))

создаст график

enter image description here

Если вы измените nc на несколько разумных 1,0, вы будетеполучить график

enter image description here

В любом случае, вот код для обратного CDF (он же PPF), который вы просили.Последний вопрос: что такое 0.9973 as the p - остались только параметры: масштаб или местоположение.Вы можете легко добавить его к вызову ncf(dfn, dfd, nc, loc, scale).

ОБНОВЛЕНИЕ

На самом деле, если вы испортили параметры, такие что nc на самом деле равен 0.9973, то мой второй график был бы в значительной степениответ на ваш вопрос.

ОБНОВЛЕНИЕ II

Ну, если nc на самом деле около 5 миллионов, то print(rv.ppf(0.9973)) действительно выдает результат 1 100 .Посмотрите на первый график и отметьте номер в левом верхнем углу.

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