[ << ] [ < ] [ Acima ] [ > ] [ >> ]         [Topo] [Conteúdo] [Índice] [ ? ]

21 Estatísticas

Esse capítulo descreve as funções estatísticas na biblioteca. As funções estatísticas básicas incluem rotinas para calcular a média, a variância e o desvio padrão. Funções mais avançadas permitem a você calcular desvios absolutos, assimetria, e curtose bem como a mediana e percentís arbitrários. Os algoritmos usam relações de recorrência para calcular quantidades médias de uma forma estável, sem grandes valores intermediários que podem causar overflow.

As funções estão disponíveis em varsões para conjuntos de dados nos tipos padronizados em ponto flutuante e inteiro. As versões para dados em precisão dupla de ponto flutuante possuem o prefixo gsl_stats e são declaradas no arquivo de cabeçalho ‘gsl_statistics_double.h’. As versões para dados inteiros possuem o prefixo gsl_stats_int e são declaradas no arquivo de cabeçalho ‘gsl_statistics_int.h’. Todas as funções trabalham sobre vetores estáticos C com um parâmetro stride especificando o espaçamento entre elementos.


[ << ] [ < ] [ Acima ] [ > ] [ >> ]         [Topo] [Conteúdo] [Índice] [ ? ]

21.1 Média, Desvio Padrão e Variância

Function: double gsl_stats_mean (const double data[], size_t stride, size_t n)

Essa função retorna a média aritmética de data, um conjunto de dados de comprimento n com salto stride. A média artimética, ou média de amostra, é denotada por \Hat\mu e definida como,

^
μ
 
= 1

N

xi
onde os x_i são elementos do conjunto de dados data. Para amostras desenhadas a partir de uma distribuição de Gauss a variância de \Hat\mu é \sigma^2 / N.

Function: double gsl_stats_variance (const double data[], size_t stride, size_t n)

Essa função retorna a variância estimada, ou amostra, de data, um conjunto de dados de comprimento n com salto stride. A variância estimada é denotada por \Hat\sigma^2 e é definida por,


^
σ
 
2 = 1

(N−1)


(xi − 
^
μ
 
)2
onde os x_i são os elementos do conjunto de dados data. Note que o fator de normalização de 1/(N-1) resulta da derivação de \Hat\sigma^2 como um estimador imparcial da variância da população \sigma^2. Para amostras desenhadas a partir de um distribuição de Gauss a variância de \Hat\sigma^2 propriamente dita é 2 \sigma^4 / N.

Essa função calcula a média aritmética simples por meio de uma chamada a gsl_stats_mean. Se você já estiver calculado a média aritmética simples então você pode informar essa média calculada anteriormente diretamente a gsl_stats_variance_m.

Function: double gsl_stats_variance_m (const double data[], size_t stride, size_t n, double mean)

Essa função retorna a variância amostral de data relativa ao valor fornecido da média aritmética simples mean. A função é calculada com \Hat\mu substituída pelo valor de mean que você forneceu,

^
σ
 
2
 
= 1

(N−1)

(xi − mean)2

Function: double gsl_stats_sd (const double data[], size_t stride, size_t n)
Function: double gsl_stats_sd_m (const double data[], size_t stride, size_t n, double mean)

O desvio padrão é definido como a raíz quadrada da variância. Essas funções retornam a raíz quadrada da função de variância correspondente acima.

Function: double gsl_stats_tss (const double data[], size_t stride, size_t n)
Function: double gsl_stats_tss_m (const double data[], size_t stride, size_t n, double mean)

Essas funções retornam o somatório total de quadrados (TSS) dos dados data sobre a média aritmética simples. Para gsl_stats_tss_m o valor fornecido pelo usuário da mia aritmética simples mean é usado, e para gsl_stats_tss o somatório total de quadrados é calculado usando gsl_stats_mean.

TSS =
(xi − mean)2

Function: double gsl_stats_variance_with_fixed_mean (const double data[], size_t stride, size_t n, double mean)

Essa função calcula uma estimativa imparcialda variância de data quando a média da população mean da distribuição base for conhecida a priori. Nesse caso o estimador para a variância usa o fator 1/N e a média da amostra \Hat\mu é substituída pela média conhecida da população \mu,

^
σ
 
2
 
= 1

N

(xi − μ)2

Function: double gsl_stats_sd_with_fixed_mean (const double data[], size_t stride, size_t n, double mean)

Essa função calcula o desvio padrão dos data para uma média de população fixada mean. O resultado é a raíz quadrada da correspondente função de variância.


[ << ] [ < ] [ Acima ] [ > ] [ >> ]         [Topo] [Conteúdo] [Índice] [ ? ]

21.2 Desvio absoluto

Function: double gsl_stats_absdev (const double data[], size_t stride, size_t n)

Essa função calcula o desvio absoluto a partir da média aritmética simples dos data, o conjunto de dados de comprimento n com salto stride. O desvio absoluto a partir da média aritmética simples é definido como,

absdev = 1

N

|xi
^
μ
 
|
onde os x_i são os elementos do conjunto de dados data. O desvio absoluto a partir da média aritmética simples fornece uma medição mais robusta do largura de uma distribuição que a variância. Essa função calcula a média aritmética simples dos dados contidos em data por meio de uma chamada a gsl_stats_mean.

Function: double gsl_stats_absdev_m (const double data[], size_t stride, size_t n, double mean)

Essa função calcula o desvio absoluto do conjunto de dados data relativamente ao valor fornecido da média aritmética simples mean,

absdev = 1

N

|xi − mean|
Essa função é útil se você já tiver calculado a média aritmética simples dos data (e deseja evitar recalcular essa mesma média), ou deseja calcular o desvio absoluto relativamente a outro valor (tal como zero, ou tal como a mediana).


[ << ] [ < ] [ Acima ] [ > ] [ >> ]         [Topo] [Conteúdo] [Índice] [ ? ]

21.3 Momentos mais altos (assimetria e kurtose)

Function: double gsl_stats_skew (const double data[], size_t stride, size_t n)

Essa função calcula a assimetria dos data, um conjunto de dados de comprimento n com salto stride. A assimetria é definida como,

skew = 1

N



xi
^
μ
 

^
σ


3


 
onde x_i são os elementos do conjunto de dados data. A assimetria mede a assimetria dos caudas de uma distribuição.

A função calcula a média aritmética simples e desvio padrão estimado dos data através de chamada a gsl_stats_mean e a gsl_stats_sd.

Function: double gsl_stats_skew_m_sd (const double data[], size_t stride, size_t n, double mean, double sd)

Essa função calcula a assimetria do conjunto de dados data usando os valores fornecidos da média aritmética simples mean e desvio padrão sd,

skew = 1

N


xi − mean

sd

3

 
Essas funções são úteis se você já tem calculado a média aritmética simples e o desvio padrão dos data e deseja evitar recalculá-los.

Function: double gsl_stats_kurtosis (const double data[], size_t stride, size_t n)

Essa função calcula a curtose dos data, um conjunto de dados de comprimento n com salto stride. A curtose é definida como,

kurtosis =

1

N



xi
^
μ
 

^
σ


4


 


− 3
A curtose mede quanto nitidamente pontiaguda uma distribuição é, relativamente à sua largura. A curtose é normalizada para zero para uma distribuição de Gauss.

Function: double gsl_stats_kurtosis_m_sd (const double data[], size_t stride, size_t n, double mean, double sd)

Essa função calcula a curtose do conjunto de dados data usando os valores fornecidos da média aritmética simples mean e desvio padrão sd,

kurtosis = 1

N



xi − mean

sd

4

 

− 3
Essa função é útil se você já tem calculado a média aritmética simples e o desvio padrão de data e deseja evitar recalculá-los.


[ << ] [ < ] [ Acima ] [ > ] [ >> ]         [Topo] [Conteúdo] [Índice] [ ? ]

21.4 Autocorrelação

Function: double gsl_stats_lag1_autocorrelation (const double data[], const size_t stride, const size_t n)

Essa função calcula a autocorrelação lag-1 do conjunto de dados data.

a1 =
n

i = 1 
(xi
^
μ
 
) (xi−1
^
μ
 
)

n

i = 1 
(xi
^
μ
 
) (xi
^
μ
 
)

Function: double gsl_stats_lag1_autocorrelation_m (const double data[], const size_t stride, const size_t n, const double mean)

Essa função calcula a autocorrelação lag-1 do conjunto de dados data usando o valor fornecido da média aritmética simples mean.


[ << ] [ < ] [ Acima ] [ > ] [ >> ]         [Topo] [Conteúdo] [Índice] [ ? ]

21.5 Covariância

Function: double gsl_stats_covariance (const double data1[], const size_t stride1, const double data2[], const size_t stride2, const size_t n)

Essa função calcula a covariância dos conjuntos de dados data1 e data2 que devem ambos serem do mesmo comprimento n.

covar = 1

(n − 1)
n

i = 1 
(xi
^
x
 
) (yi
^
y
 
)

Function: double gsl_stats_covariance_m (const double data1[], const size_t stride1, const double data2[], const size_t stride2, const size_t n, const double mean1, const double mean2)

Essa função calcula a covariância dos conjuntos de dados data1 e data2 usando os valores fornecidos das média aritmética simples, mean1 e mean2. Essa função é útil se você já tem calculado as médias aritméticas simples de data1 e data2 e deseja evitar recalcular essas duas médias.


[ << ] [ < ] [ Acima ] [ > ] [ >> ]         [Topo] [Conteúdo] [Índice] [ ? ]

21.6 Correlação

Function: double gsl_stats_correlation (const double data1[], const size_t stride1, const double data2[], const size_t stride2, const size_t n)

Essa função calcula eficientemente o coeficiente de correlação de Pearson entre os conjuntos de dados data1 e data2 que devem ambos erem de mesmo comprimento n.

r = cov(x, y)

^
σ
 

x 
^
σ
 

y 
=
1

n−1

(xi
^
x
 
) (yi
^
y
 
)

  ⎛


1

n−1

(xi
^
x
 
)2
 
  ⎛


1

n−1

(yi
^
y
 
)2
 

Function: double gsl_stats_spearman (const double data1[], const size_t stride1, const double data2[], const size_t stride2, const size_t n, double work[])

Essa função calcula o coeficiente de correlação de posto de Spearman entre os conjuntos de dados data1 e data2 que devem ser ambos de mesmo comprimento n. Espaço de trabalho adicional de tamanho 2*n é requerido em work. A correlação de posto de Spearman entre vetores x e y é equivalente à correlação de Pearson entre os vetores rankeados x_R e y_R, ondes os postos são definidos para serem as médias das posições de um elementos na ordem ascendente dos valores.


[ << ] [ < ] [ Acima ] [ > ] [ >> ]         [Topo] [Conteúdo] [Índice] [ ? ]

21.7 Amostras Ponderadas

As funções descritas nessa seção permitem o cálculo estatístico para amostras ponderadas. As funções aceitam um vetor estático de amostras, x_i, com pesos associados, w_i. Cada amostra x_i é considerada como tendo sido desenhada a partir de uma distribuição de Gauss com variância \sigma_i^2. O peso da amostra w_i é definido como o recíproco dessa variância, w_i = 1/\sigma_i^2. Ajustar um peso para zero corresponde a remover uma amostra de um conjunto de dados.

Function: double gsl_stats_wmean (const double w[], size_t wstride, const double data[], size_t stride, size_t n)

Essa função retorna a média ponderada do conjunto de dados data com salto stride e comprimento n, usando o conjutno de pesos w com salto wstride e comprimento n. A média ponderada é definida como,

^
μ
 
=

wi xi


wi

Function: double gsl_stats_wvariance (const double w[], size_t wstride, const double data[], size_t stride, size_t n)

Essa função retorna a variância estimada do conjunto de dados data com salto stride e comprimento n, usando o conjunto de pesos w com salto wstride e comprimento n. A variância estimada de um conjunto de dados ponderados é calculado como,

^
σ
 
2
 
=

wi

(
wi)2
(wi2)

wi (xi
^
μ
 
)2
Note que essa expressão se reduz a uma variância sem pesos com o fator familiar 1/(N-1) quando houverem N pesos iguais não nulos.

Function: double gsl_stats_wvariance_m (const double w[], size_t wstride, const double data[], size_t stride, size_t n, double wmean)

Essa função retorna a variância estimada do conjunto de dados ponderados data usando a média ponderada wmean.

Function: double gsl_stats_wsd (const double w[], size_t wstride, const double data[], size_t stride, size_t n)

O desvio padrão é definido como a raíz quadrada da variância. Essa função retorna a raíz quadrada da correspondente função de variância gsl_stats_wvariance acima.

Function: double gsl_stats_wsd_m (const double w[], size_t wstride, const double data[], size_t stride, size_t n, double wmean)

Essa função retorna a raíz quadrada da correspondente função de variância gsl_stats_wvariance_m acima.

Function: double gsl_stats_wvariance_with_fixed_mean (const double w[], size_t wstride, const double data[], size_t stride, size_t n, const double mean)

Essa função calcula uma estimativa imparcial da variância do conjunto de dados com pesos data quando a média da população mean da distribuição base for conhecida a priori. Nesse caso o valor estimado para a variância substitui a média da amostra \Hat\mu pela conhecida média da população \mu,

^
σ
 
2
 
=

wi (xi − μ)2


wi

Function: double gsl_stats_wsd_with_fixed_mean (const double w[], size_t wstride, const double data[], size_t stride, size_t n, const double mean)

O desvio padrão é definido como a raíz quadrada da variância. Essa função retorna a raíz quadrada da correspondente função de variância acima.

Function: double gsl_stats_wtss (const double w[], const size_t wstride, const double data[], size_t stride, size_t n)
Function: double gsl_stats_wtss_m (const double w[], const size_t wstride, const double data[], size_t stride, size_t n, double wmean)

Essas funções retornam a soma de quadrados (TSS) total ponderada dos dados contidos em data sobre a média ponderada. Para gsl_stats_wtss_m o valor fornecido pelo usuário de wmean é usada, e para gsl_stats_wtss A soma de quadrados (TSS) total ponderada é calculada usando gsl_stats_wmean.

TSS =
wi (xi − wmean)2

Function: double gsl_stats_wabsdev (const double w[], size_t wstride, const double data[], size_t stride, size_t n)

Essa função calcula o desvio absouluto ponderado a partir da média ponderada dos dados contidos em data. O desvio absoluto a partir da média aritmética simples é definido como,

absdev =

wi |xi
^
μ
 
|


wi

Function: double gsl_stats_wabsdev_m (const double w[], size_t wstride, const double data[], size_t stride, size_t n, double wmean)

Essa função calcula o desvio absoluto do conjunto de dados ponderados data sobre a fornecida média ponderada wmean.

Function: double gsl_stats_wskew (const double w[], size_t wstride, const double data[], size_t stride, size_t n)

Essa função calcula a assimetria ponderada do conjunto de dados data.

skew =

wi ((xi
^
x
 
)/
^
σ
 
)3


wi

Function: double gsl_stats_wskew_m_sd (const double w[], size_t wstride, const double data[], size_t stride, size_t n, double wmean, double wsd)

Essa função calcula a assimetria ponderada do conjunto de dados data usando os valores fornecidos de média ponderada e desvio padrão ponderado, wmean e wsd.

Function: double gsl_stats_wkurtosis (const double w[], size_t wstride, const double data[], size_t stride, size_t n)

Essa função calcula a curtose ponderada do conjunto de dados data.

kurtosis =

wi ((xi
^
x
 
)/
^
σ
 
)4


wi
− 3

Function: double gsl_stats_wkurtosis_m_sd (const double w[], size_t wstride, const double data[], size_t stride, size_t n, double wmean, double wsd)

Essa função calcula a curtose ponderada do conjunto de dados data usando os valores fornecidos de média ponderada e desvio padrão ponderado, wmean e wsd.


[ << ] [ < ] [ Acima ] [ > ] [ >> ]         [Topo] [Conteúdo] [Índice] [ ? ]

21.8 Valores de Máximo e Mínimo

As seguintes funções encontram os valores maior e menor de um conjunto de dados (ou seus índices). Se os dados possuem NaNs (45) então um NaN irá ser retornado, uma vez que os valores maior e menor são indefinidos para NaN. Para funções que retornam um índice, a localização do primeiro NaN no vetor estático é retornada.

Function: double gsl_stats_max (const double data[], size_t stride, size_t n)

Essa função retorna o maior valor em data, um conjunto de dados de comprimento n com salto stride. O maior valor é definido como o valor do elemento x_i que satisfaz x_i >= x_j para todo j.

Se você deseja ao invés de encontra o elementos com o maior módulo absoluto você irá precisar aplicar fabs ou abs a seus dados antes de chamar essa função.

Function: double gsl_stats_min (const double data[], size_t stride, size_t n)

Essa função retorna o menor valor em data, um conjunto de dados de comprimento n com salto stride. O menor valor é definido como o valor do elemento x_i que satisfaz x_i <= x_j para todo j.

Se você deseja ao invés encontrar o elemento com o menor módulo absoluto você irá precisar aplicar fabs ou abs a seus dados antes de chamar essa função.

Function: void gsl_stats_minmax (double * min, double * max, const double data[], size_t stride, size_t n)

Essa função encontra ambos o maior e o menor valor min, max em data em um passo apenas.

Function: size_t gsl_stats_max_index (const double data[], size_t stride, size_t n)

Essa função retorna os índices do maior valor em data, um conjunto de dados de comprimento n com salto stride. O maior valor é definido com o valor do elemento x_i que satisfaz x_i >= x_j para todo j. Quando houverem muitos maiores elementos iguais então o primeiro é escolhido.

Function: size_t gsl_stats_min_index (const double data[], size_t stride, size_t n)

Essa função retorna os índices do menor valor em data, um conjunto de dados de comprimento n com salto stride. O menor valor é definido como o valor do elementos x_i que satisfaz x_i >= x_j para todo j. Quando houverem muitos menores elementos iguais então o primeiro é escolhido.

Function: void gsl_stats_minmax_index (size_t * min_index, size_t * max_index, const double data[], size_t stride, size_t n)

Essa função retorna os índices min_index, max_index dos menores e maiores valores em data em um passo apenas.


[ << ] [ < ] [ Acima ] [ > ] [ >> ]         [Topo] [Conteúdo] [Índice] [ ? ]

21.9 Medianas e Percentís

As funções de mediana e percentís descritas nessa seção trabalham sobre dados ordenados. Por conveniência usamos quantís, medidos sobre uma escada de 0 a 1, ao invés de percentís (que usam uma escala de 0 a 100).

Function: double gsl_stats_median_from_sorted_data (const double sorted_data[], size_t stride, size_t n)

Essa função retorna o valor da mediana de sorted_data, um conjunto de dados de comprimento n com salto stride. Os elementos do vetor estático devem estar em ordem ascendente numérica. Não existe verificação para ver se os dados estão ordenados, de forma que a função gsl_sort sempre deve ser usada primeiramente para garantir a ordenação requerida.

Quando conjunto de dados tiver um número ímpar de elementos a mediana é o valor do elemento (n-1)/2. Quando o conjunto de dados tiver um número ímpar de elementos a mediana é a média aritmética simples dos dois valores mais próximos da posição na qual deveria estar o valor de mediana, os elementos (n-1)/2 e n/2. Uma vez que o algoritmo para o cálculo da mediana envolve interpolação essa função sempre retorna um número em ponto flutuante, mesmo para dados do tipo inteiro.

Function: double gsl_stats_quantile_from_sorted_data (const double sorted_data[], size_t stride, size_t n, double f)

Essa função retorna um valor de quantil de sorted_data, um vetor estático de precisão dupla de comprimento n com salto stride. Os elementos do vetor estático devem estar em ordem numérica ascendente. O quantil é determindao pelo f, uma fração entre 0 e 1. Por exemplo, para calcular o valor do 75-ésimo (septuagésimo quinto) percentil f deve ter o valor de 0.75.

Não existe verificação para ver se os dados estão ordenados, de forma que a função gsl_sort deve sempre ser usada primeiramente para garantir a ordenação requerida.

O quantil é encontrado por interpolação, usando a fórmula

quantile = (1 − δ) xi + δxi+1
onde i é floor((n - 1)f) e \delta is (n-1)f - i.

Dessa forma o menor valor do evtor estático (data[0*stride]) é fornecido por f igual a zero, o maior valor (data[(n-1)*stride]) é fornecido por f igual à unidade e o valor da mediana é fornecido por f igual a 0.5. Uma vez que o algoritmo para o cálculo dos quantís envolve interpolação essa função sempre retorna um número em ponto flutuante, mesmo para tipos de dados inteiros.


[ << ] [ < ] [ Acima ] [ > ] [ >> ]         [Topo] [Conteúdo] [Índice] [ ? ]

21.10 Exemplos

Aqui está um exemplo básico de como usar as funções estatísticas:

#include <stdio.h>
#include <gsl/gsl_statistics.h>

int
main(void)
{
  double data[5] = {17.2, 18.1, 16.5, 18.3, 12.6};
  double mean, variance, largest, smallest;

  mean     = gsl_stats_mean(data, 1, 5);
  variance = gsl_stats_variance(data, 1, 5);
  largest  = gsl_stats_max(data, 1, 5);
  smallest = gsl_stats_min(data, 1, 5);

  printf ("The dataset is %g, %g, %g, %g, %g\n",
         data[0], data[1], data[2], data[3], data[4]);

  printf ("The sample mean is %g\n", mean);
  printf ("The estimated variance is %g\n", variance);
  printf ("The largest value is %g\n", largest);
  printf ("The smallest value is %g\n", smallest);
  return 0;
}

O programa deve produzir a seguinte saída,

The dataset is 17.2, 18.1, 16.5, 18.3, 12.6
The sample mean is 16.54
The estimated variance is 5.373
The largest value is 18.3
The smallest value is 12.6

Aqui está um exemplo usando dados ordenados,

#include <stdio.h>
#include <gsl/gsl_sort.h>
#include <gsl/gsl_statistics.h>

int
main(void)
{
  double data[5] = {17.2, 18.1, 16.5, 18.3, 12.6};
  double median, upperq, lowerq;

  printf ("Original dataset:  %g, %g, %g, %g, %g\n",
         data[0], data[1], data[2], data[3], data[4]);

  gsl_sort (data, 1, 5);

  printf ("Sorted dataset: %g, %g, %g, %g, %g\n",
         data[0], data[1], data[2], data[3], data[4]);

  median 
    = gsl_stats_median_from_sorted_data (data, 
                                         1, 5);

  upperq 
    = gsl_stats_quantile_from_sorted_data (data, 
                                           1, 5,
                                           0.75);
  lowerq 
    = gsl_stats_quantile_from_sorted_data (data, 
                                           1, 5,
                                           0.25);

  printf ("The median is %g\n", median);
  printf ("The upper quartile is %g\n", upperq);
  printf ("The lower quartile is %g\n", lowerq);
  return 0;
}

Esse programa deve produzir a seguinte saída,

Original dataset: 17.2, 18.1, 16.5, 18.3, 12.6
Sorted dataset: 12.6, 16.5, 17.2, 18.1, 18.3
The median is 17.2
The upper quartile is 18.1
The lower quartile is 16.5

[ << ] [ < ] [ Acima ] [ > ] [ >> ]         [Topo] [Conteúdo] [Índice] [ ? ]

21.11 Referências e Leituras Adicionais

A referência padrão para quase qualquer tópico em estatística é o multi-volume Advanced Theory of Estatísticas de Kendall e Stuart.

  • Maurice Kendall, Alan Stuart, e J. Keith Ord. The Advanced Theory of Estatísticas (multiplos volumes) reimpresso como Kendall’s Advanced Theory of Estatísticas. Wiley, ISBN 047023380X.

Muitos conceitos estatísticos podem ser mais facilmente entendidos por uma aproximação Bayesiana. O seguinte livro de Gelman, Carlin, Stern e Rubin fornecem uma abrangência compreensível sobre o assunto.

  • Andrew Gelman, John B. Carlin, Hal S. Stern, Donald B. Rubin. Bayesian Data Analysis. Chapman & Hall, ISBN 0412039915.

Para físicos o Particle Data Group fornece artigos úteis de Probabilidade e Estatística na seção “Mathematical Tools” de seu Annual Review of Particle Physics.

  • Review of Particle Properties R.M. Barnett et al., Physical Review D54, 1 (1996)

O Review of Particle Physics está disponível online no sítio http://pdg.lbl.gov/.


[ << ] [ >> ]           [Topo] [Conteúdo] [Índice] [ ? ]

Esse documento foi gerado em 23 de Julho de 2013 usando texi2html 5.0.