Реализация логарифмического распределения в SciPy не параметризована так же, как в коде R. Ищите здесь [scipy] lognorm
в stackoverflow, чтобы найти много похожих вопросов, и обратите внимание на примечание о параметризации в строке документации lognorm
. Также обратите внимание, что для соответствия результату R параметр местоположения loc
должен быть зафиксирован на значении 0 с помощью аргумента floc=0
. Реализация R не включает параметр местоположения.
Вот скрипт, который показывает, как получить те же значения, о которых сообщает R:
import numpy as np
from scipy.stats import lognorm, kstest
x = [341, 291, 283, 155, 271, 270, 250, 272, 209, 236,
295, 214, 443, 632, 310, 334, 376, 305, 216, 339]
sigma, loc, scale = lognorm.fit(x, floc=0)
mu = np.log(scale)
print("mu = %9.5f" % mu)
print("sigma = %9.5f" % sigma)
stat, p = kstest(x, 'lognorm', args=(sigma, 0, scale), alternative='two-sided')
print("KS Test:")
print("stat = %9.5f" % stat)
print("p-value = %9.5f" % p)
Выход:
mu = 5.66612
sigma = 0.29062
KS Test:
stat = 0.13421
p-value = 0.86403
Функция kstest
в SciPy не имеет возможности вычислить точное значение p. Чтобы сравнить его значение с R, вы можете использовать exact=FALSE
в fitdistr
:
> ks.test(series, "plnorm", meanlog=fit[1], sdlog=fit[2], exact=FALSE)
One-sample Kolmogorov-Smirnov test
data: series
D = 0.1342, p-value = 0.864
alternative hypothesis: two-sided