2013-11-17 2 views
6

я узнал, как найти 95% доверительный интервал с scipy.stats.t как такКак визуализировать 95% -ный доверительный интервал в matplotlib?

In [1]: from scipy.stats import t 
In [2]: t.interval(0.95, 10, loc=1, scale=2) # 95% confidence interval 
Out[2]: (-3.4562777039298762, 5.4562777039298762) 
In [3]: t.interval(0.99, 10, loc=1, scale=2) # 99% confidence interval 
Out[3]: (-5.338545334351676, 7.338545334351676) 

Однако, визуализация важна для меня. Мне интересно, как я могу показать панель доверительных интервалов на каждом узле моей кривой в matplotlib?

Что я ожидал что-то вроде этого

enter image description here

+0

'errorbar'? Вы что-то пробовали? Вы посмотрели галерею? – tacaswell

+0

@tcaswell по ошибке Я имею в виду форму '工' в каждой точке графика. –

+0

Я считаю, что @tcaswell ссылается на [функцию matplotlib, называемую 'errorbar'] (http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.errorbar). Вы пробовали использовать его? [Вот пример работы] (http://matplotlib.org/examples/statistics/errorbar_demo_features.html) – askewchan

ответ

7

Вам не нужно .interval метод, чтобы получить размер доверительного интервала, нужно просто метод .ppf.

import numpy as np 
import scipy.stats as ss 
data_m=np.array([1,2,3,4]) #(Means of your data) 
data_df=np.array([5,6,7,8]) #(Degree-of-freedoms of your data) 
data_sd=np.array([11,12,12,14]) #(Standard Deviations of your data) 
import matplotlib.pyplot as plt 
plt.errorbar([0,1,2,3], data_m, yerr=ss.t.ppf(0.95, data_df)*data_sd) 
plt.xlim((-1,4)) 

ss.t.ppf(0.95, data_df)*data_sd является полностью векторизовать способом, чтобы получить (половина) размер интервала, с учетом степени свободы и стандартного отклонения.

enter image description here

+1

Разве вы не должны разделять стандартные отклонения на квадратный корень степеней свободы: например, '' 'ss.t.ppf (0.95, data_df) * data_sd/np.sqrt (data_df)' '' вместо этого? – Anis

-1

Я не могу комментировать из-за низкой репутации, так что я буду комментировать в ответ. Во-первых, я также считаю, что вам нужно разделить стандартное отклонение, и, во-вторых, если ваши данные двусторонние (как предполагает сюжет), вам нужно разрешить 2,5% промахов по каждой стороне гауссова, то есть:

ss.t.ppf(0.975, data_df)/np.sqrt(data_df) 

Поскольку вы пропустили 2,5% с обеих сторон, вы получаете общую пропущенность 5%.