Дискретное тестирование Колмогорова-Смирнова: получение неверного значения при использовании rpy2 по сравнению с чистым R
Я пытаюсь использовать dgof
модуль из R, в Python 3 через rpy2
,
Я использую это внутри Python, как так:
# import rpy2's package module
import rpy2.robjects.packages as rpackages
# Import R's utility package
utils = rpackages.importr('utils')
# Select a mirror for R packages
utils.chooseCRANmirror(ind=1) # select the first mirror in the list
# R vector of strings
from rpy2.robjects.vectors import StrVector
# Install R package name: 'dgof' (discrete goodness-of-fit) is what we're interested in
if rpackages.isinstalled('dgof') is False:
utils.install_packages(StrVector('dgof'))
# Import dgof
dgof = rpackages.importr('dgof')
Работает шарм (т.е. я могу импортировать его, что само по себе является большой победой). Теперь в качестве теста я хотел воспроизвести приведенный здесь пример из документации API.
Для ясности, в чистом R, примером является (и чтобы быть ясным, эта функция НЕ stats::ks.test(rep(1, 3), ecdf(1:3))
но родной dgof
):
ks.test(rep(1, 3), ecdf(1:3))
что приводит к р-значению 0.07407
(чтобы убедиться в этом, нажмите зеленую кнопку "Запустить этот код" в этой ссылке). Обратите внимание, что:
> ecdf(1:3)
Empirical CDF
Call: ecdf(1:3)
x[1:3] = 1, 2, 3
> rep(1,3)
[1] 1 1 1
В Python воспроизводимый пример:
import numpy as np
a = np.array([1,1,1])
b = np.arange(1,4)
dgof.ks_test(a,b)
Но в этом примере р-значение, которое я нахожу, 0.517551
, Сама KS-статистика рассчитана правильно. Но почему моделируемое значение p отличается? Снова, чтобы увидеть выход dgof
пример в ссылке, нажмите Run this example
и вы увидите числа, на которые я ссылаюсь (воспроизведенные выше).