|
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 |
}
|