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



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



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

1295   3  

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

    Ничего не найдено.