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

📄 arima-model.c

📁 时间序列工具
💻 C
📖 第 1 页 / 共 2 页
字号:
    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);}int main(int argc,char **argv){  char stdi=0;  double *pm;  long i,j,iter,hj,realiter=0;  unsigned int size,is,id;  FILE *file;  double **mat,**inverse,*vec,**coeff,**diff,**hseries;  double **oldcoeff,*diffcoeff=NULL;  double hdiff,**xdiff=NULL,avpm;  double loglikelihood,aic,alldiff;    if (scan_help(argc,argv))    show_options(argv[0]);    scan_options(argc,argv);#ifndef OMIT_WHAT_I_DO  if (verbosity&VER_INPUT)    what_i_do(argv[0],WID_STR);#endif  infile=search_datafile(argc,argv,NULL,verbosity);  if (infile == NULL)    stdi=1;  if (outfile == NULL) {    if (!stdi) {      check_alloc(outfile=(char*)calloc(strlen(infile)+5,(size_t)1));      strcpy(outfile,infile);      strcat(outfile,".ari");    }    else {      check_alloc(outfile=(char*)calloc((size_t)10,(size_t)1));      strcpy(outfile,"stdin.ari");    }  }  if (!stdo)    test_outfile(outfile);  if (column == NULL)    series=(double**)get_multi_series(infile,&length,exclude,&dim,"",dimset,				      verbosity);  else    series=(double**)get_multi_series(infile,&length,exclude,&dim,column,				      dimset,verbosity);  check_alloc(my_average=(double*)malloc(sizeof(double)*dim));  for (i=0;i<ipoles;i++)    make_difference();  for (i=0;i<dim;i++)    series[i] += ipoles;  length -= ipoles;  set_averages_to_zero();  if (poles >= length) {    fprintf(stderr,"It makes no sense to have more poles than data! Exiting\n");    exit(AR_MODEL_TOO_MANY_POLES);  }  if (arimaset) {    if ((arpoles >= length) || (mapoles >= length)) {      fprintf(stderr,"It makes no sense to have more poles than data! Exiting\n");      exit(AR_MODEL_TOO_MANY_POLES);    }  }   ardim=poles*dim;  aindex=make_ar_index();  check_alloc(vec=(double*)malloc(sizeof(double)*ardim));  check_alloc(mat=(double**)malloc(sizeof(double*)*ardim));  for (i=0;i<ardim;i++)    check_alloc(mat[i]=(double*)malloc(sizeof(double)*ardim));  check_alloc(coeff=(double**)malloc(sizeof(double*)*dim));  inverse=build_matrix(mat,ardim);  for (i=0;i<dim;i++) {    build_vector(vec,ardim,i);    coeff[i]=multiply_matrix_vector(inverse,vec,ardim);  }  check_alloc(diff=(double**)malloc(sizeof(double*)*dim));  for (i=0;i<dim;i++)    check_alloc(diff[i]=(double*)malloc(sizeof(double)*length));  pm=make_residuals(diff,coeff,ardim);  free(vec);  for (i=0;i<ardim;i++) {    free(mat[i]);    free(inverse[i]);  }  free(mat);  free(inverse);  size=ardim;    if (arimaset) {    offset=poles;    for (i=0;i<2;i++)      free(aindex[i]);    free(aindex);    for (i=0;i<dim;i++)      free(coeff[i]);    free(coeff);    check_alloc(xdiff=(double**)malloc(sizeof(double*)*ITER));    for (i=0;i<ITER;i++)      check_alloc(xdiff[i]=(double*)malloc(sizeof(double)*dim));    armadim=(arpoles+mapoles)*dim;    aindex=make_arima_index(arpoles,mapoles);    size=armadim;    check_alloc(hseries=(double**)malloc(sizeof(double*)*2*dim));    for (i=0;i<dim;i++) {      check_alloc(hseries[i]=(double*)malloc(sizeof(double)*length));      check_alloc(hseries[i+dim]=(double*)malloc(sizeof(double)*length));      for (j=0;j<length;j++) {	hseries[i][j]=series[i][j];	hseries[i+dim][j]=diff[i][j];      }    }    for (i=0;i<dim;i++)      free(series[i]-ipoles);    free(series);    series=hseries;    check_alloc(oldcoeff=(double**)malloc(sizeof(double*)*dim));    for (i=0;i<dim;i++) {      check_alloc(oldcoeff[i]=(double*)malloc(sizeof(double)*armadim));      for (j=0;j<armadim;j++)	oldcoeff[i][j]=0.0;    }    check_alloc(diffcoeff=(double*)malloc(sizeof(double)*ITER));    for (iter=1;iter<=ITER;iter++) {      check_alloc(vec=(double*)malloc(sizeof(double)*armadim));      check_alloc(mat=(double**)malloc(sizeof(double*)*armadim));      for (i=0;i<armadim;i++)	check_alloc(mat[i]=(double*)malloc(sizeof(double)*armadim));      check_alloc(coeff=(double**)malloc(sizeof(double*)*dim));      poles=(arpoles > mapoles)? arpoles:mapoles;      offset += poles;      inverse=build_matrix(mat,armadim);      for (i=0;i<dim;i++) {	build_vector(vec,armadim,i);	coeff[i]=multiply_matrix_vector(inverse,vec,armadim);      }      pm=make_residuals(diff,coeff,armadim);      for (j=0;j<dim;j++) {	hdiff=0.0;	hj=j+dim;	for (i=offset;i<length;i++)	  hdiff += sqr(series[hj][i]-diff[j][i]);	for (i=0;i<length;i++) {	  series[hj][i]=diff[j][i];	}	xdiff[iter-1][j]=sqrt(hdiff/(double)(length-offset));      }      free(vec);      for (i=0;i<armadim;i++) {	free(mat[i]);	free(inverse[i]);      }      free(mat);      free(inverse);      diffcoeff[iter-1]=0.0;      for (i=0;i<dim;i++)	for (j=0;j<dim;j++) {	  diffcoeff[iter-1] += sqr(coeff[i][j]-oldcoeff[i][j]);	  oldcoeff[i][j]=coeff[i][j];	}      diffcoeff[iter-1]=sqrt(diffcoeff[iter-1]/(double)armadim);      alldiff=xdiff[iter-1][0];      for (i=1;i<dim;i++)	if (xdiff[iter-1][i] > alldiff)	  alldiff=xdiff[iter-1][i];      realiter=iter;      if (alldiff < convergence)	iter=ITER;        if (iter < ITER) {	for (i=0;i<dim;i++)	  free(coeff[i]);	free(coeff);      }    }  }  if (stdo) {    if (arimaset) {      printf("#convergence of residuals in arima fit\n");      for (i=0;i<realiter;i++) {	printf("#iteration %ld ",i+1);	for (j=0;j<dim;j++)	  printf("%e ",xdiff[i][j]);	printf("%e",diffcoeff[i]);	printf("\n");      }    }    avpm=pm[0]*pm[0];    loglikelihood= -log(pm[0]);    for (i=1;i<dim;i++) {      avpm += pm[i]*pm[i];      loglikelihood -= log(pm[i]);    }    loglikelihood *= ((double)length);    loglikelihood += -((double)length)*      ((1.0+log(2.*M_PI))*dim)/2.0;    avpm=sqrt(avpm/dim);    printf("#average forcast error= %e\n",avpm);    printf("#individual forecast errors: ");     for (i=0;i<dim;i++)      printf("%e ",pm[i]);    printf("\n");    if (arimaset)      aic=2.0*(arpoles+mapoles)-2.0*loglikelihood;    else      aic=2.0*poles-2.0*loglikelihood;    printf("#Log-Likelihood= %e\t AIC= %e\n",loglikelihood,aic);    for (i=0;i<size;i++) {      id=aindex[0][i];      is=aindex[1][i];      if (id < dim)	printf("#x_%u(n-%u) ",id+1,is);      else	printf("#e_%u(n-%u) ",id+1-dim,is);      for (j=0;j<dim;j++)	printf("%e ",coeff[j][i]);      printf("\n");    }    if (!run_model || (verbosity&VER_USR1)) {      for (i=poles;i<length;i++) {	if (run_model)	  printf("#");	for (j=0;j<dim;j++)	  if (verbosity&VER_USR2)	    printf("%e %e ",series[j][i]+my_average[j],diff[j][i]);	  else	    printf("%e ",diff[j][i]);	printf("\n");      }    }    if (run_model && (ilength > 0)) {      if (!arimaset)	iterate_model(coeff,pm,diff,NULL);      else 	iterate_arima_model(coeff,pm,diff,NULL);    }  }  else {    file=fopen(outfile,"w");    if (verbosity&VER_INPUT)      fprintf(stderr,"Opened %s for output\n",outfile);    if (arimaset) {      fprintf(file,"#convergence of residuals in arima fit\n");      for (i=0;i<realiter;i++) {	fprintf(file,"#iteration %ld ",i+1);	for (j=0;j<dim;j++)	  fprintf(file,"%e ",xdiff[i][j]);	fprintf(file,"%e",diffcoeff[i]);	fprintf(file,"\n");      }    }    avpm=pm[0]*pm[0];    loglikelihood= -log(pm[0]);    for (i=1;i<dim;i++) {      avpm += pm[i]*pm[i];      loglikelihood -= log(pm[i]);    }    loglikelihood *= ((double)length);    loglikelihood += -((double)length)*      ((1.0+log(2.*M_PI))*dim)/2.0;    avpm=sqrt(avpm/dim);    fprintf(file,"#average forcast error= %e\n",avpm);    fprintf(file,"#individual forecast errors: ");    for (i=0;i<dim;i++)      fprintf(file,"%e ",pm[i]);    fprintf(file,"\n");    if (arimaset)      aic=2.0*(arpoles+mapoles)-2.0*loglikelihood;    else      aic=2.0*poles-2.0*loglikelihood;    fprintf(file,"#Log-Likelihood= %e\t AIC= %e\n",loglikelihood,aic);    for (i=0;i<size;i++) {      id=aindex[0][i];      is=aindex[1][i];      if (id < dim)	fprintf(file,"#x_%u(n-%u) ",id+1,is);      else	fprintf(file,"#e_%u(n-%u) ",id+1-dim,is);      for (j=0;j<dim;j++)	fprintf(file,"%e ",coeff[j][i]);      fprintf(file,"\n");    }    if (!run_model || (verbosity&VER_USR1)) {      for (i=poles;i<length;i++) {	if (run_model)	  fprintf(file,"#");	for (j=0;j<dim;j++)	  if (verbosity&VER_USR2)	    fprintf(file,"%e %e ",series[j][i]+my_average[j],diff[j][i]);	  else	    fprintf(file,"%e ",diff[j][i]);	fprintf(file,"\n");      }    }    if (run_model && (ilength > 0)) {      if (!arimaset)	iterate_model(coeff,pm,diff,file);      else	iterate_arima_model(coeff,pm,diff,file);    }    fclose(file);  }  if (outfile != NULL)    free(outfile);  if (infile != NULL)    free(infile);  for (i=0;i<dim;i++) {    free(coeff[i]);    free(diff[i]);    free(series[i]);    if (arimaset)      free(series[i+dim]);  }  free(coeff);  free(diff);  free(series);  free(pm);  return 0;}

⌨️ 快捷键说明

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