P-значение из теста Chi sq с использованием Scipy - PullRequest
1 голос
/ 01 апреля 2020

Я вычисляю тестовую статистику c, которая распределена в виде квадрата хи с 1 степенью свободы. Я также вычисляю P-значение, соответствующее этому, используя два различных метода из scipy.stats.

У меня есть наблюдения и ожидаемые значения в виде numpy массивов.

observation = np.array([  9.21899399e-04,   4.04363991e-01,   3.51713820e-02,
         3.00816946e-03,   1.80976731e-03,   6.46172153e-02,
         8.61549065e-05,   9.41395390e-03,   1.00946008e-03,
         1.25621846e-02,   1.06806251e-02,   6.66856795e-03,
         2.67380732e-01,   0.00000000e+00,   1.60859798e-02,
         3.63681803e-01,   1.06230978e-05])

expectation = np.array([ 0.07043956,  0.07043956,  0.07043956,  0.07043956,  0.07043956,
        0.07043956,  0.07043956,  0.07043956,  0.07043956,  0.07043956,
        0.07043956,  0.07043956,  0.07043956,  0.07043956,  0.07043956,
        0.07043956,  0.07043956])

Для первого подхода я сослался на эту публикацию stackoverflow. Вот что я делаю в первом подходе:

from scipy import stats

chi_sq = np.sum(np.divide(np.square(observation - expectation), expectation)) 
p_value = 1 - stats.chi2.cdf(chi_sq, 1)

print(chi_sq, p_value)

>> (4.1029225303927959, 0.042809154353783851)

Во втором подходе я использую метод chi-square из spicy.stats. В частности, я использую эту ссылку. Вот как я реализую второй метод.

from scipy import stats
print( stats.chisquare(f_obs=observation, f_exp=expectation, ddof=0) )

>> Power_divergenceResult(statistic=4.1029225303927959, pvalue=0.99871467077385223)

Я получаю одинаковое значение хи-квадрат statisti c в обоих методах (то есть статистика = 4.1029225303927959), но разные значения р. При первом подходе я получаю p_value=0.042809154353783851. Во втором подходе я получаю pvalue=0.99871467077385223.

Почему я не получаю одинаковые p-значения в обоих подходах? Спасибо.

1 Ответ

1 голос
/ 02 апреля 2020

Для stats.chisquare ddof определяется как

ddofint, optional
“Delta degrees of freedom”: adjustment to the degrees of freedom for the p-value. 
The p-value is computed using a chi-squared distribution with 
k - 1 - ddof degrees of freedom, 
where k is the number of observed frequencies. The default value of ddof is 0.

То, что вы делаете, это в основном критерий хи-квадрат Пирсона , а степень свободы равна k-1, где n - количество наблюдений. Из того, что я вижу, ваше ожидание - это в основном среднее от наблюдаемого, то есть вы оценили 1 параметр, поэтому ddof верен на 0. Но для stats.chi2.cdf, df должно быть 16.

Так :

chi_sq = np.sum(np.divide(np.square(observation - expectation), expectation)) 
[1 - stats.chi2.cdf(chi_sq, len(observation)-1),
stats.chisquare(f_obs=observation, ddof=0)[1]]

[0.9987146707738522, 0.9987146706997099]

Небольшая разница, но масштаб более или менее правильный ..

...