Как рассчитать доверительный интервал, используя numpy.percentile () в Python - PullRequest
0 голосов
/ 26 апреля 2019

Вопрос на домашнюю работу попросил меня рассчитать доверительный интервал для среднего значения. Когда я сделал это традиционным методом и с помощью numpy.percentile () - я получил разные ответы.

Я думаю, что я могу неправильно понять, как и когда использовать np.percentile (). Мои два вопроса: 1. Я использую это неправильно - неправильные данные и т. Д 2. Использую ли я его не в том месте - следует использовать для начальной загрузки CI, а не обычные методы?

Я рассчитал CI по традиционной формуле и np.percentile ()


price = np.random.normal(11427, 5845, 30)
# u = mean of orginal vector
# s = std of original vector
print(price)

[14209.99205723 7793.06283131 10403.87407888 10910.59681669 14427,87437741 4426,8122023 13890,22030853 5652,39284669 22436,9686157 9591.28194843 15543.24262609 11951.15170839 16242,64433138 3673.40741792 18962,90840397 11320,92073514 12984,61905211 8716,97883291 15539.80873528 19324,24734807 12507,9268783 11226,36772026 8869,27092532 9117,52393498 11786.21064418 11273.61893921 17093.20022578 10163.75037277 13962.10004709 17094.70579814]

x_bar = np.mean(price) # mean of vector
s = np.std(price) # std of vector
n = len(price) # number of obs
z = 1.96 # for a 95% CI

lower = x_bar - (z * (s/math.sqrt(n)))
upper = x_bar + (z * (s/math.sqrt(n)))
med = np.median(price)

print(lower, med, upper)

10838.458908888499 11868.68117628698 13901.386475143861

np.percentile(price, [2.5, 50, 97.5])

[4219.6258866 11868.68117629 20180.24569667]

ss.scoreatpercentile(price, [2.5, 50, 97.5])

[4219.6258866 11868.68117629 20180.24569667]

Я ожидаю, что нижний, средний и верхний будут равны выводу np.percentile ().

Хотя медианные значения одинаковы - верхнее и нижнее значения немного отличаются друг от друга.

Более того, scipy.stats.percentile дает тот же результат, что и numpy.percentile.

Есть мысли?

Спасибо!

Отредактировано, чтобы показать вектор цены.

1 Ответ

0 голосов
/ 26 апреля 2019

Доверительный интервал и процентиль - это не одно и то же.Формулы для двух вещей очень разные

Количество ваших выборок повлияет на ваш доверительный интервал, но не изменит (сильно) процентили.

например

price = np.random.normal(0, 1, 10000)
print (np.percentile(price, [2.5, 50, 97.5])

дает

[-1.97681778  0.01808908  1.93659551]

и

price = np.random.normal(0, 1, 100000000)
print (np.percentile(price, [2.5, 50, 97.5]))

дает в значительной степени то же самое:

[-1.96012643  9.82108813e-05  1.96030460]

Но если запустить код расчета CI, если выМассово увеличивая количество выборок, ваш доверительный интервал сократится - потому что вы теперь на 95% уверены, что среднее значение распределения находится в меньшем диапазоне.

Использование тех же двух ценовых массивов (среднее = 0, с.д.= 1) с 10 выборками и 10 000 выборками ваши результаты:

-0.5051688819759096 0.17504324224822834 0.744716862363091 # 10 samples
-0.02645090158517636 -0.006759616493022626 0.012353106820212557 # 10000 samples

Как вы можете видеть, CI намного меньше с большим количеством выборок (как и следовало ожидать, учитывая формулу для CI!)

...