⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 arima-model.c

📁 时间序列工具
💻 C
📖 第 1 页 / 共 2 页
字号:
/* *   This file is part of TISEAN * *   Copyright (c) 1998-2007 Rainer Hegger, Holger Kantz, Thomas Schreiber * *   TISEAN is free software; you can redistribute it and/or modify *   it under the terms of the GNU General Public License as published by *   the Free Software Foundation; either version 2 of the License, or *   (at your option) any later version. * *   TISEAN is distributed in the hope that it will be useful, *   but WITHOUT ANY WARRANTY; without even the implied warranty of *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *   GNU General Public License for more details. * *   You should have received a copy of the GNU General Public License *   along with TISEAN; if not, write to the Free Software *   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA *//*Author: Rainer Hegger, Last modified: Feb 6, 2006 *//*Changes:  Feb 4, 2006: First version  Feb 6, 2006: Find and remove bugs (1)  Feb 11, 2006: Add rand_arb_dist to iterate_***_model */#include <stdio.h>#include <stdlib.h>#include <string.h>#include <limits.h>#include <math.h>#include "routines/tsa.h"#define WID_STR "Fits an multivariate ARIMA model to the data and gives\ the coefficients\n\tand the residues (or an iterated model)"unsigned long length=ULONG_MAX,exclude=0;unsigned int dim=1,poles=10,ilength,ITER=50;unsigned int arpoles=0,ipoles=0,mapoles=0,offset;unsigned int verbosity=1;char *outfile=NULL,*column=NULL,stdo=1,dimset=0,run_model=0,arimaset=0;char *infile=NULL;double **series,convergence=1.0e-3;double *my_average;unsigned long ardim,armadim;unsigned int **aindex;void show_options(char *progname){  what_i_do(progname,WID_STR);  fprintf(stderr," Usage: %s [options]\n",progname);  fprintf(stderr," Options:\n");  fprintf(stderr,"Everything not being a valid option will be interpreted"	  " as a possible"	  " datafile.\nIf no datafile is given stdin is read. Just - also"	  " means stdin\n");  fprintf(stderr,"\t-l length of file [default is whole file]\n");  fprintf(stderr,"\t-x # of lines to be ignored [default is 0]\n");  fprintf(stderr,"\t-m dimension [default is 1]\n");  fprintf(stderr,"\t-c columns to read [default is 1,...,dimension]\n");  fprintf(stderr,"\t-p order of initial AR-Fit [default is %u]\n",poles);  fprintf(stderr,"\t-P order of AR,I,MA-Fit [default is %u,%u,%u]\n",	  arpoles,ipoles,mapoles);  fprintf(stderr,"\t-I # of arima iterations [default is %u]\n",ITER);  fprintf(stderr,"\t-e accuracy of convergence [default is %lf]\n",convergence);  fprintf(stderr,"\t-s length of iterated model [default no iteration]\n");  fprintf(stderr,"\t-o output file name [default is 'datafile'.ari]\n");  fprintf(stderr,"\t-V verbosity level [default is 1]\n\t\t"	  "0='only panic messages'\n\t\t"	  "1='+ input/output messages'\n\t\t"	  "2='+ print residuals though iterating a model'\n\t\t"	  "4='+ print original data plus residuals'\n");  fprintf(stderr,"\t-h show these options\n\n");  exit(0);}void scan_options(int argc,char **argv){  char *out;  if ((out=check_option(argv,argc,'p','u')) != NULL) {    sscanf(out,"%u",&poles);    if (poles < 1) {      fprintf(stderr,"The order should at least be one!\n");      exit(127);    }  }  if ((out=check_option(argv,argc,'l','u')) != NULL)    sscanf(out,"%lu",&length);  if ((out=check_option(argv,argc,'x','u')) != NULL)    sscanf(out,"%lu",&exclude);  if ((out=check_option(argv,argc,'m','u')) != NULL) {    sscanf(out,"%u",&dim);    dimset=1;  }  if ((out=check_option(argv,argc,'P','3')) != NULL) {    sscanf(out,"%u,%u,%u",&arpoles,&ipoles,&mapoles);    if ((arpoles+ipoles+mapoles)>0)      arimaset=1;  }  if ((out=check_option(argv,argc,'I','u')) != NULL)    sscanf(out,"%u",&ITER);  if ((out=check_option(argv,argc,'e','f')) != NULL)    sscanf(out,"%lf",&convergence);  if ((out=check_option(argv,argc,'c','u')) != NULL)    column=out;  if ((out=check_option(argv,argc,'V','u')) != NULL)    sscanf(out,"%u",&verbosity);  if ((out=check_option(argv,argc,'s','u')) != NULL) {    sscanf(out,"%u",&ilength);    run_model=1;  }  if ((out=check_option(argv,argc,'o','o')) != NULL) {    stdo=0;    if (strlen(out) > 0)      outfile=out;  }}void make_difference(void){  unsigned long i,d;  for (i=length-1;i>0;i--)    for (d=0;d<dim;d++)      series[d][i]=series[d][i]-series[d][i-1];}unsigned int** make_ar_index(void){  unsigned int** ar_index;  unsigned long i;  check_alloc(ar_index=(unsigned int**)malloc(sizeof(unsigned int*)*2));  for (i=0;i<2;i++)    check_alloc(ar_index[i]=(unsigned int*)		malloc(sizeof(unsigned int)*ardim));  for (i=0;i<ardim;i++) {    ar_index[0][i]=i/poles;    ar_index[1][i]=i%poles;  }  return ar_index;}unsigned int** make_arima_index(unsigned int ars,unsigned int mas){  unsigned int** arima_index;  unsigned int armad;  unsigned long i,i0;  armad=(ars+mas)*dim;  check_alloc(arima_index=(unsigned int**)malloc(sizeof(unsigned int*)*2));  for (i=0;i<2;i++)    check_alloc(arima_index[i]=(unsigned int*)		malloc(sizeof(unsigned int)*armad));  for (i=0;i<ars*dim;i++) {    arima_index[0][i]=i/ars;    arima_index[1][i]=i%ars;  }  i0=ars*dim;  for (i=0;i<mas*dim;i++) {    arima_index[0][i+i0]=dim+i/mas;    arima_index[1][i+i0]=i%mas;  }  return arima_index;}void set_averages_to_zero(void){  double var;  long i,j;    for (i=0;i<dim;i++) {    variance(series[i],length,&my_average[i],&var);    for (j=0;j<length;j++)      series[i][j] -= my_average[i];  }}double** build_matrix(double **mat,unsigned int size){  long n,i,j,is,id,js,jd;  double norm;    norm=1./((double)length-1.0-(double)poles-(double)offset);  for (i=0;i<size;i++) {    id=aindex[0][i];    is=aindex[1][i];    for (j=i;j<size;j++) {      jd=aindex[0][j];      js=aindex[1][j];      mat[i][j]=0.0;      for (n=offset+poles-1;n<length-1;n++)	mat[i][j] += series[id][n-is]*series[jd][n-js];      mat[i][j] *= norm;      mat[j][i]=mat[i][j];    }  }  return invert_matrix(mat,size);}void build_vector(double *vec,unsigned int size,long comp){  long i,is,id,n;  double norm;  norm=1./((double)length-1.0-(double)poles-(double)offset);  for (i=0;i<size;i++) {    id=aindex[0][i];    is=aindex[1][i];    vec[i]=0.0;    for (n=offset+poles-1;n<length-1;n++)      vec[i] += series[comp][n+1]*series[id][n-is];    vec[i] *= norm;  }}double* multiply_matrix_vector(double **mat,double *vec,unsigned int size){  long i,j;  double *new_vec;  check_alloc(new_vec=(double*)malloc(sizeof(double)*size));  for (i=0;i<size;i++) {    new_vec[i]=0.0;    for (j=0;j<size;j++)      new_vec[i] += mat[i][j]*vec[j];  }  return new_vec;}double* make_residuals(double **diff,double **coeff,unsigned int size){  long n,n1,d,i,is,id;  double *resi;    check_alloc(resi=(double*)malloc(sizeof(double)*dim));  for (i=0;i<dim;i++)    resi[i]=0.0;  for (n=poles-1;n<length-1;n++) {    n1=n+1;    for (d=0;d<dim;d++) {      diff[d][n1]=series[d][n1];      for (i=0;i<size;i++) {	id=aindex[0][i];	is=aindex[1][i];	diff[d][n1] -= coeff[d][i]*series[id][n-is];      }      resi[d] += sqr(diff[d][n1]);    }  }  for (i=0;i<dim;i++)    resi[i]=sqrt(resi[i]/((double)length-(double)poles));  return resi;}void iterate_model(double **coeff,double *sigma,double **diff,FILE *file){  long i,j,i1,i2,n,d;  double **iterate,*swap,**myrand;    check_alloc(iterate=(double**)malloc(sizeof(double*)*(poles+1)));  for (i=0;i<=poles;i++)    check_alloc(iterate[i]=(double*)malloc(sizeof(double)*dim));  check_alloc(myrand=(double**)malloc(sizeof(double*)*dim));  for (i=0;i<dim;i++)    myrand[i]=rand_arb_dist(diff[i],length,ilength+poles,100,0x44325);  rnd_init(0x44325);  for (i=0;i<1000;i++)    rnd_long();  for (i=0;i<dim;i++)    for (j=0;j<poles;j++)      iterate[j][i]=myrand[i][j];    for (n=0;n<ilength;n++) {    for (d=0;d<dim;d++) {      iterate[poles][d]=myrand[d][n+poles];      for (i1=0;i1<dim;i1++)	for (i2=0;i2<poles;i2++)	  iterate[poles][d] += coeff[d][i1*poles+i2]*iterate[poles-1-i2][i1];    }    if (file != NULL) {      for (d=0;d<dim;d++)	fprintf(file,"%e ",iterate[poles][d]);      fprintf(file,"\n");    }    else {      for (d=0;d<dim;d++)	printf("%e ",iterate[poles][d]);      printf("\n");    }    swap=iterate[0];    for (i=0;i<poles;i++)      iterate[i]=iterate[i+1];    iterate[poles]=swap;  }  for (i=0;i<=poles;i++)    free(iterate[i]);  free(iterate);  for (i=0;i<dim;i++)    free(myrand[i]);  free(myrand);}void iterate_arima_model(double **coeff,double *sigma,double **diff,FILE *file){  double **iterate,*swap,**myrand;  unsigned long i,j,n,is,id;  check_alloc(iterate=(double**)malloc(sizeof(double*)*(poles+1)));  for (i=0;i<=poles;i++)    check_alloc(iterate[i]=(double*)malloc(sizeof(double)*2*dim));  check_alloc(myrand=(double**)malloc(sizeof(double*)*dim));  for (i=0;i<dim;i++)    myrand[i]=rand_arb_dist(diff[i],length,ilength+poles,100,0x44325);  rnd_init(0x44325);  for (i=0;i<1000;i++)    rnd_long();  for (i=0;i<dim;i++)    for (j=0;j<poles;j++)      iterate[j][i]=iterate[j][dim+i]=myrand[i][j];  for (n=0;n<ilength;n++) {    for (i=0;i<dim;i++)      iterate[poles][i]=iterate[poles][i+dim]=myrand[i][n+poles];    for (j=0;j<dim;j++) {      for (i=0;i<armadim;i++) {	id=aindex[0][i];	is=aindex[1][i];	iterate[poles][j] += coeff[j][i]*iterate[poles-1-is][id];      }    }    if (file != NULL) {      for (i=0;i<dim;i++)	fprintf(file,"%e ",iterate[poles][i]);      fprintf(file,"\n");    }    else {      for (i=0;i<dim;i++)	printf("%e ",iterate[poles][i]);      printf("\n");    }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -