Blame doc/examples/movstat2.c

Packit 67cb25
#include <stdio.h>
Packit 67cb25
#include <stdlib.h>
Packit 67cb25
Packit 67cb25
#include <gsl/gsl_math.h>
Packit 67cb25
#include <gsl/gsl_movstat.h>
Packit 67cb25
#include <gsl/gsl_rng.h>
Packit 67cb25
#include <gsl/gsl_randist.h>
Packit 67cb25
#include <gsl/gsl_vector.h>
Packit 67cb25
Packit 67cb25
int
Packit 67cb25
main(void)
Packit 67cb25
{
Packit 67cb25
  const size_t N = 1000;                                 /* length of time series */
Packit 67cb25
  const double sigma[] = { 1.0, 5.0, 1.0, 3.0, 5.0 };    /* variances */
Packit 67cb25
  const size_t N_sigma[] = { 200, 450, 600, 850, 1000 }; /* samples where variance changes */
Packit 67cb25
  const size_t K = 41;                                   /* window size */
Packit 67cb25
  gsl_vector *x = gsl_vector_alloc(N);
Packit 67cb25
  gsl_vector *xmedian = gsl_vector_alloc(N);
Packit 67cb25
  gsl_vector *xmad = gsl_vector_alloc(N);
Packit 67cb25
  gsl_vector *xiqr = gsl_vector_alloc(N);
Packit 67cb25
  gsl_vector *xSn = gsl_vector_alloc(N);
Packit 67cb25
  gsl_vector *xQn = gsl_vector_alloc(N);
Packit 67cb25
  gsl_vector *xsd = gsl_vector_alloc(N);
Packit 67cb25
  gsl_rng *r = gsl_rng_alloc(gsl_rng_default);
Packit 67cb25
  gsl_movstat_workspace * w = gsl_movstat_alloc(K);
Packit 67cb25
  size_t idx = 0;
Packit 67cb25
  size_t i;
Packit 67cb25
Packit 67cb25
  for (i = 0; i < N; ++i)
Packit 67cb25
    {
Packit 67cb25
      double gi = gsl_ran_gaussian(r, sigma[idx]);
Packit 67cb25
      double u = gsl_rng_uniform(r);
Packit 67cb25
      double outlier = (u < 0.01) ? 15.0*GSL_SIGN(gi) : 0.0;
Packit 67cb25
      double xi = gi + outlier;
Packit 67cb25
Packit 67cb25
      gsl_vector_set(x, i, xi);
Packit 67cb25
Packit 67cb25
      if (i == N_sigma[idx] - 1)
Packit 67cb25
        ++idx;
Packit 67cb25
    }
Packit 67cb25
Packit 67cb25
  /* compute moving statistics */
Packit 67cb25
  gsl_movstat_mad(GSL_MOVSTAT_END_TRUNCATE, x, xmedian, xmad, w);
Packit 67cb25
  gsl_movstat_qqr(GSL_MOVSTAT_END_TRUNCATE, x, 0.25, xiqr, w);
Packit 67cb25
  gsl_movstat_Sn(GSL_MOVSTAT_END_TRUNCATE, x, xSn, w);
Packit 67cb25
  gsl_movstat_Qn(GSL_MOVSTAT_END_TRUNCATE, x, xQn, w);
Packit 67cb25
  gsl_movstat_sd(GSL_MOVSTAT_END_TRUNCATE, x, xsd, w);
Packit 67cb25
Packit 67cb25
  /* scale IQR by factor to approximate standard deviation */
Packit 67cb25
  gsl_vector_scale(xiqr, 0.7413);
Packit 67cb25
Packit 67cb25
  /* print results */
Packit 67cb25
  idx = 0;
Packit 67cb25
  for (i = 0; i < N; ++i)
Packit 67cb25
    {
Packit 67cb25
      printf("%zu %f %f %f %f %f %f %f\n",
Packit 67cb25
             i,
Packit 67cb25
             gsl_vector_get(x, i),
Packit 67cb25
             sigma[idx],
Packit 67cb25
             gsl_vector_get(xmad, i),
Packit 67cb25
             gsl_vector_get(xiqr, i),
Packit 67cb25
             gsl_vector_get(xSn, i),
Packit 67cb25
             gsl_vector_get(xQn, i),
Packit 67cb25
             gsl_vector_get(xsd, i));
Packit 67cb25
Packit 67cb25
      if (i == N_sigma[idx] - 1)
Packit 67cb25
        ++idx;
Packit 67cb25
    }
Packit 67cb25
Packit 67cb25
  gsl_vector_free(x);
Packit 67cb25
  gsl_vector_free(xmedian);
Packit 67cb25
  gsl_vector_free(xmad);
Packit 67cb25
  gsl_vector_free(xiqr);
Packit 67cb25
  gsl_vector_free(xSn);
Packit 67cb25
  gsl_vector_free(xQn);
Packit 67cb25
  gsl_vector_free(xsd);
Packit 67cb25
  gsl_rng_free(r);
Packit 67cb25
  gsl_movstat_free(w);
Packit 67cb25
Packit 67cb25
  return 0;
Packit 67cb25
}