Я пытаюсь использовать модуль 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))
, что приводит к значению p 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)
Но в этом примере p-значение, которое я нахожу, составляет 0.517551
. Сама KS-статистика рассчитана правильно. Но почему моделируемое значение p отличается? Снова, чтобы увидеть вывод примера dgof
в ссылке, нажмите Run this example
, и вы увидите числа, на которые я ссылаюсь (воспроизведено выше).