// // This library implements several procedures // to obtain product estimates // // Authors: Rosangela H. Loschi // Frederico R. B. Cruz // Departamento de Estatistica // Universidade Federal de Minas Gerais // E-mail: {loschi,fcruz}@est.ufmg.br // // Version: 1.00 // // Date: Feb/2001 // #ifndef CHPOINT_H #define CHPOINT_H // inclusion of standard libraries #include #include #include // uniform generator #include "uni.c" // gamma function #include "gamma.cpp" #define PI (3.141592654) // prior parameters of mu #define mPrior(i,j) (0.0) #define vPrior(i,j) (1.0) // prior parameters of sqr(sigma) #define dPrior(i,j) (4.0) #define aPrior(i,j) (0.01) // class definition class ChangePoints { FILE *fileData; FILE *fileBurnIn; FILE *fileMuSig; FILE *fileNumBlo; FILE *filePartic; // maximum number of partition to be printed int numPartic; // time series and its size float *X; int tamX; // probability p float probP; // prior parameters of probability p float alpha; float beta; // posterior parameters of mu float **mPost; float **vPost; // posterior parameters of sqr(sigma) float **dPost; float **aPost; // predictive distribution float **fXij; // posterior cohesions float **cPost; // vector of u samples int **vecU; // size of each sample u int tamU; // number of samples u int numAmost; // burn-in period int burnIn; // lag to be taken into account int lag; // "net" number of samples u which is int((numAmost-burnIn)/lag) int numAmostU; // number of occurences of the i-th partition int *partic; // number of blocks of the i-th sample int *numBlocks; // number of occurences of this block int *blocks; // posterior relevance of the block [ij] int **relevPost; // posterior estimates of mu and sqr(sigma) float *muPost; float *sigma2Post; // private methods int ComputePostParam(void); int PrintPostParam(void); int ComputeVecUbeta(void); int ComputeNuBloc(void); int PrintNumBloc(void); int ComputePostRelev(void); int PrintPostRelev(void); int ComputePostMuSig(void); int PrintPostMuSig(void); int ComputePostRho(void); int PrintPostRho(void); int ComputePostPb(void); int PrintPostPb(void); public: ChangePoints(void); // default constructor ~ChangePoints(void); // destructor int ReadInputScript(char *scriptFileName); int LoGibbsBeta(void); }; // class implementation ChangePoints::ChangePoints(void) { fprintf(stdout, "Object ChangePoints created\n"); } ChangePoints::~ChangePoints(void) { fprintf(stdout, "Object ChangePoints destroied\n"); } int ChangePoints::ReadInputScript(char *scriptFileName) { const int LLENGTH = 256; char Line[LLENGTH]; int i; FILE *scriptFile; char fileName[LLENGTH]; float dummy; fprintf(stdout, "ChangePoints::ReadData\n"); // open script file i = 0; while ( (scriptFileName[i] != '\n')&&(ii; l--) { if ( vecU[k-1][l] == 0 ) y = l; } // compute Ri Ri = log(fXij[x][y]) - log(fXij[x][i]) - log(fXij[i][y]) + log(Gamma(numBlocks+alpha-2)) + log(Gamma(tamX+beta-numBlocks+1)) - log(Gamma(numBlocks+alpha-1)) - log(Gamma(tamX+beta-numBlocks)); Ri = exp(Ri); // fprintf(stdout, "fXij[%d][%d] = %f\n", x, y, fXij[x][y]); // fprintf(stdout, "fXij[%d][%d] = %f\n", x, i, fXij[x][i]); // fprintf(stdout, "fXij[%d][%d] = %f\n", i, y, fXij[i][y]); // fprintf(stdout, "Ri= (%f/(%f*%f))*(%f*%f)/(%f*%f)=%f\n", // fXij[x][y], fXij[x][i], fXij[i][y], // Gamma(numBlocks+alpha-2), Gamma(tamX+beta-numBlocks+1), // Gamma(numBlocks+alpha-1), Gamma(tamX+beta-numBlocks), Ri); tamX, beta, numBlocks, fXij[x][i], // generate Uki u = UNI; if ( Ri >= (1-u)/u ) { vecU[k][i] = 1; } else { vecU[k][i] = 0; } } // fprintf(stdout, "vecU[%d]:\n", k); // for (i=1; i<=tamU; i++) { // fprintf(stdout, "%d ", vecU[k][i]); // } // fprintf(stdout, "\n"); } return 0; } int ChangePoints::ComputeNuBloc(void) { fprintf(stdout, "ChangePoints::ComputeNuBloc\n"); int k,i; numBlocks = new int[numAmost+1]; for (k=1; k<=numAmost; k++) { numBlocks[k] = 1; for (i=1; i<=tamU; i++) { if (vecU[k][i] == 0) { numBlocks[k]++; } } } return 0; } int ChangePoints::PrintNumBloc() { fprintf(stdout, "ChangePoints::PrintNumBloc\n"); for (int k=1; k<=numAmost; k++) { fprintf(fileBurnIn,"%d\n", numBlocks[k]); } return 0; } int ChangePoints::ComputePostRelev(void) { fprintf(stdout, "ChangePoints::ComputePostRelev\n"); int i, j, inicBloc, finalBloc; relevPost = new int*[tamX]; // creat matrix for (i=0; imax) { max = partic[j]; maxJ = j; } } // imprima particoes mais provaveis (ignorando as de ocorrencia) if ( partic[maxJ] > 0 ) { for (j=1; j<=tamU; j++) { fprintf(filePartic, "%d ", vecU[maxJ][j]); } fprintf(filePartic, "\t %f\t %d\n", float(partic[maxJ])/numAmostU, partic[maxJ] ); partic[maxJ] = -1; } } return 0; }; int ChangePoints::ComputePostPb(void) { fprintf(stdout, "ChangePoints::ComputePostPb\n"); int i, j; blocks = new int[numAmost+1]; for (i=1; i<=numAmost; i++) { blocks[i] = 1; } for (i=burnIn+1; i<=numAmost; i+=lag) { if ( blocks[i] != -1 ) { for (j=i+lag; j<=numAmost; j+=lag) { // comparar i-esima amostra com j-esima amostra if ( numBlocks[i]==numBlocks[j] ) { blocks[i]++; blocks[j] = -1; } } } } // for (i=burnIn+1; i<=numAmost; i+=lag) { // fprintf(arqNumBlo, "%d\n", blocks[i]); // } return 0; }; int ChangePoints::PrintPostPb(void) { fprintf(stdout, "ChangePoints::PrintPostPb\n"); int i, j, minJ, min; fprintf(fileNumBlo, "#blocks\t #occur\t \tprob\n" ); for (i=burnIn+1; i<=numAmost; i+=lag) { // find minimum min = tamX+1; for (j=burnIn+1; j<=numAmost; j+=lag) { if ( (numBlocks[j]