ti-enxame.com

Calcular um intervalo de confiança de dados de amostra

Eu tenho dados de amostra que gostaria de calcular um intervalo de confiança para, assumindo uma distribuição normal.

Eu encontrei e instalei os pacotes numpy e scipy e obtive um numpy para retornar uma média e um desvio padrão (numpy.mean (data) com dados sendo uma lista). Qualquer conselho sobre obter um intervalo de confiança da amostra seria muito apreciado.

79
Bmayer0122
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

você pode calcular assim.

119
shasan

Aqui está uma versão abreviada do código de shasan, calculando o intervalo de confiança de 95% da média da matriz 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))

Mas usar StatsModels ' tconfint_mean é indiscutivelmente ainda melhor:

import statsmodels.stats.api as sms

sms.DescrStatsW(a).tconfint_mean()

Os pressupostos subjacentes para ambos são que a amostra (array a) foi desenhada independentemente de uma distribuição normal com desvio padrão desconhecido (veja MathWorld ou Wikipedia ).

Para amostras de tamanho grande n, a média da amostra é normalmente distribuída e é possível calcular seu intervalo de confiança usando st.norm.interval() (como sugerido no comentário de Jaime). Mas as soluções acima estão corretas também para n pequeno, onde st.norm.interval() fornece intervalos de confiança que são muito estreitos (ou seja, "confiança falsa"). Veja minha resposta para uma pergunta semelhante para mais detalhes (e um dos comentários de Russ aqui).

Aqui um exemplo onde as opções corretas fornecem (essencialmente) intervalos de confiança idênticos:

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)

E finalmente, o resultado incorreto usando st.norm.interval():

In [13]: st.norm.interval(0.95, loc=np.mean(a), scale=st.sem(a))
Out[13]: (10.23484868811834, 12.76515131188166)
83
Ulrich Stern

Comece com a procura do valor z para o intervalo de confiança desejado de um tabela de consulta . O intervalo de confiança é mean +/- z*sigma, onde sigma é o desvio padrão estimado da média da amostra, dado por sigma = s / sqrt(n), em que s é o desvio padrão calculado a partir dos dados da amostra e n é o tamanho da amostra.

11
bogatron

Iniciando Python 3.8, a biblioteca padrão fornece o objeto NormalDist como parte do módulo statistics :

from statistics import NormalDist

def confidence_interval(data, confidence=0.95):
  dist = NormalDist.from_samples(data)
  z = NormalDist().inv_cdf((1 + confidence) / 2.)
  h = dist.stdev * z / ((len(data) - 1) ** .5)
  return dist.mean - h, dist.mean + h

Este:

  • Cria um objeto NormalDist a partir da amostra de dados ( NormalDist.from_samples(data) , que nos dá acesso à média e desvio padrão da amostra via NormalDist.mean e NormalDist.stdev .

  • Calcule o Z-score baseado na distribuição normal padrão (representada por NormalDist()) para a confiança dada usando o inverso da função de distribuição cumulativa ( inv_cdf ).

  • Produz o intervalo de confiança com base no desvio padrão e na média da amostra.


Isso pressupõe que o tamanho da amostra é grande o suficiente (digamos, mais de ~ 100 pontos) para usar a distribuição normal padrão em vez da distribuição t do aluno para calcular o valor de z.

1
Xavier Guihot