這裏的另一種方法。我想你在問估計概率積分變換。這段代碼產生了一個相當細緻的估計,即inverted_edf
。
它通過以不同的值計算SAMPLE
中點之間的線性內插來進行。然後它計算樣本經驗df,最後是inverted_edf
。
我應該提到,即使樣本量爲1,000,尾巴的百分位數也會有相當大的統計變異性,儘管0.5的樣本量會少一些。
import statsmodels.distributions.empirical_distribution as edf
from scipy.interpolate import interp1d
import numpy as np
import matplotlib.pyplot as plt
SAMPLE = np.random.normal(0, 1, 1000)
sample_edf = edf.ECDF(SAMPLE)
slope_changes = sorted(set(SAMPLE))
sample_edf_values_at_slope_changes = [ sample_edf(item) for item in slope_changes]
inverted_edf = interp1d(sample_edf_values_at_slope_changes, slope_changes)
x = np.linspace(0.005, 1)
y = inverted_edf(x)
#~ plt.plot(x, y, 'ro', x, y, 'b-')
plt.plot(x, y, 'b-')
plt.show()
p = 0.5
print ('%s percentile:' % (100*p), inverted_edf(p))
下面是兩次運行的圖形和文本輸出。
50.0 percentile: -0.05917394517540461
50.0 percentile: -0.0034011090849578695