Вычисление доверительного интервала из выборочных данных
У меня есть примеры данных, для которых я хотел бы вычислить доверительный интервал, предполагая нормальное распределение.
Я нашел и установил пакеты numpy и scipy и получил numpy для возврата среднего и стандартного отклонения (numpy.среднее (данные) с данными, являющимися списком). Любые советы по получению доверительного интервала выборки будут высоко оценены.
3 ответов:
import numpy as np import scipy.stats def mean_confidence_interval(data, confidence=0.95): a = 1.0 * np.array(data) n = len(a) m, se = np.mean(a), scipy.stats.sem(a) h = se * scipy.stats.t.ppf((1 + confidence) / 2., n-1) return m, m-h, m+hвы можете рассчитать таким образом.
здесь сокращенная версия кода шасана, вычисляющая 95% доверительный интервал среднего значения массива
a:import numpy as np, scipy.stats as st st.t.interval(0.95, len(a)-1, loc=np.mean(a), scale=st.sem(a))но с помощью StatsModels' tconfint_mean возможно, даже лучше:
import statsmodels.stats.api as sms sms.DescrStatsW(a).tconfint_mean()основные предположения для обоих являются то, что образец (массив
a) был нарисован независимо друг от нормального распределения с неизвестным стандартным отклонением (см. MathWorld или Википедия).для большого размера выборки n среднее значение выборки обычно распределено, и можно рассчитать его доверительный интервал с помощью
st.norm.interval()(как было предложено в комментарии Хайме). Но приведенные выше решения верны и для малых n, гдеst.norm.interval()дает слишком узкие доверительные интервалы (т. е. "поддельную уверенность"). Смотрите мой ответ к аналогичному вопросу для более подробной информации (и один из комментариев Русса здесь).вот пример где правильные параметры дают (по существу) одинаковые доверительные интервалы:
In [9]: a = range(10,14) In [10]: mean_confidence_interval(a) Out[10]: (11.5, 9.4457397432391215, 13.554260256760879) In [11]: st.t.interval(0.95, len(a)-1, loc=np.mean(a), scale=st.sem(a)) Out[11]: (9.4457397432391215, 13.554260256760879) In [12]: sms.DescrStatsW(a).tconfint_mean() Out[12]: (9.4457397432391197, 13.55426025676088)и, наконец, неверный результат, используя
st.norm.interval():In [13]: st.norm.interval(0.95, loc=np.mean(a), scale=st.sem(a)) Out[13]: (10.23484868811834, 12.76515131188166)
начните с поиска z-значение для заданного доверительного интервала с таблица. Доверительный интервал тогда
mean +/- z*sigma, гдеsigma- это расчетное стандартное отклонение среднего значения выборки, заданноеsigma = s / sqrt(n), гдеs- Это стандартное отклонение, вычисленное из ваших выборочных данных иn- это размер выборки.
Comments