Эмпирический размер эффекта квантильного сравнения
Я пытаюсь воссоздать следующий интеграл с эмпирическими данными:
где F, G - cdfs, а их инверсии - квантильные функции.
Вот мой код:
def eqces(u,v):
import numpy as np
import statsmodels.api as sm
from scipy.stats.mstats import mquantiles
ecdfu = sm.distributions.ECDF(u)
ecdfv = sm.distributions.ECDF(v)
p = np.concatenate([ecdfu.y, ecdfv.y])
p = np.unique(p)
p.sort()
qfu = mquantiles(u, p)
qfv = mquantiles(v, p)
uvinv = ecdfu(qfv)
vuinv = ecdfv(qfu)
result = abs(uvinv - p) + abs(vuinv - p)
return np.dot(result, np.ones(p.size))
С этим я бы ожидал, что eqces(u,u) = 0
за u = np.random.uniform(0,1,50)
но это, как правило, не так. Может кто-нибудь сказать, если я делаю что-то не так или предложить альтернативы?
Edit
Этот код, кажется, лучше работает с некоторыми аналитическими результатами:
def eqces(u,v):
ecdfu = sm.distributions.ECDF(u)
ecdfv = sm.distributions.ECDF(v)
p = np.concatenate([ecdfu.y, ecdfv.y])
X = np.concatenate([ecdfu.x, ecdfv.x])
return 2*np.dot(np.abs(ecdfu(X)-p)+np.abs(ecdfv(X)-p), np.ones(p.size))/p.size
1 ответ
Я думаю, что ECDF
а также mquantiles
не используйте одни и те же позиции
mquantiles
имеет дополнительные ключевые слова alphap=0.4, betap=0.4
,
p
а также uvinv
не будет в оба конца в этом случае.
Однако в большой выборке разница должна быть небольшой.
scipy.stats.ks_2samp
делает нечто подобное, но работает напрямую с NumPy без вспомогательных функций.
Кстати: есть ли у этого измерения расстояния между двумя распределениями имя?