Подтвердить что ты не робот

Вычисление доверительного интервала из данных выборки

У меня есть пример данных, которые я хотел бы вычислить доверительный интервал для, предполагая нормальное распределение.

Я нашел и установил пакеты numpy и scipy и получил numpy, чтобы вернуть среднее и стандартное отклонение (numpy.mean(data) с данными, являющимися списком). Любые советы по получению доверительного интервала выборки будут высоко оценены.

4b9b3361

Ответ 1

import numpy as np
import scipy as sp
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 * sp.stats.t._ppf((1+confidence)/2., n-1)
    return m, m-h, m+h

вы можете рассчитать так.

Ответ 2

Здесь сокращенная версия кода шасана, вычисляющая доверительный интервал 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 или Wikipedia).

Для большого размера выборки n среднее значение выборки обычно распределяется, и можно вычислить его доверительный интервал, используя st.norm.interval() (как указано в комментарии Хайме). Но приведенные выше решения верны и для малых n, где st.norm.interval() дает слишком узкие доверительные интервалы (т.е. "Поддельную уверенность" ). См. Мой ответ на аналогичный вопрос для получения дополнительной информации (и один из комментариев Russ здесь).

Здесь пример, где правильные параметры дают (по существу) идентичные доверительные интервалы:

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)

Ответ 3

Начните с поиска z-value для желаемого доверительного интервала с справочная таблица. Тогда доверительный интервал mean +/- z*sigma, где sigma - оценочное стандартное отклонение вашего выборочного среднего, заданное sigma = s / sqrt(n), где s - стандартное отклонение, вычисленное из ваших данных образца, а n - ваш размер выборки.