// // Purpose: // This library implements a procedure // to obtain product estimates to a regression // // Authors: // Frederico R. B. Cruz // Rosangela H. Loschi // Departamento de Estatistica // Universidade Federal de Minas Gerais // E-mail: {fcruz,loschi}@est.ufmg.br // // Version: // 1.00 // // Date: // Jan/2003 // #ifndef CHREG_H #define CHREG_H // // inclusion of standard libraries // #include #include #include // #ifndef PI #define PI 3.14159265358979323846 #endif // // random number generators // #include "randx.c" // // seeds for the random number generators // unsigned long runifSeed1=362436069, runifSeed2=521288629; int rnormSeed=13579; int rbetaSeed=35791; // // gamma function // #include "gamma.cpp" #define float double // prior parameters of alpha #define aPrior(i,j) (0.0) #define tau02 (1.0) // prior parameters of psi #define zPrior(i,j) (0.0) #define gamma02 (1.0) // prior parameters of sigma^2 #define nPrior(i,j) (1.00) #define dPrior(i,j) (4.00) float NormEuclid(float *vec1, float *vec2, int size) { static int i; static float norm; norm=0.0; for (i=1;i<=size;i++) { norm+=pow((vec1[i]-vec2[i]),2); // fprintf(stdout,"NormEuclid: norm=%f\n",norm); } return sqrt(norm); } // class definition class ChangeReg { FILE *fileDataX; FILE *fileDataY; FILE *fileBurnIn; FILE *fileAlpPsiSig; FILE *fileNumBlo; FILE *filePartic; // maximum number of partition to be printed int numPartic; // time series and their sizes float *X; int tamX; float *Y; int tamY; // probability p float pProb; // posterior parameters of alpha float **aPost, **dPost, **vPostAlp, **nPostAlp; // posterior parameters of psi float **zPost, **vPostPsi, **nPostPsi; // posterior parameters of sigma^2 float **nPostSig; // predictive distribution float **fYijXij, **vPostY, **nPostY; // 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] float **relevPost; // posterior estimates of alpha, psi, and sigma^2 float *alpPost, *psiPost, *sigma2Post; // private methods int ComputeParamPost(void); int ComputeCohesPost(void); int ComputeVecU(void); int ComputeNuBloc(void); int PrintNumBloc(void); int ComputeRelevPost(void); int ComputeAlpPsiSigPost(void); int PrintAlpPsiSigPost(void); int ComputeRhoPost(void); int PrintRhoPost(void); int ComputePbPost(void); int PrintPbPost(void); public: ChangeReg(void); // default constructor ~ChangeReg(void); // destructor int ReadInputScript(char *scriptFileName); int LoGibbs(void); int PrintResults(); }; // class implementation ChangeReg::ChangeReg(void) { fprintf(stdout, "Object ChangeReg created()\n"); numPartic = 10; } ChangeReg::~ChangeReg(void) { fprintf(stdout, "Object ChangeReg destroyed()\n"); } int ChangeReg::ReadInputScript(char *scriptFileName) { fprintf(stdout,"ChangeReg::ReadInputScript(char)\n"); const int LLENGTH = 256; char Line[LLENGTH]; int i; FILE *scriptFile; char fileName[LLENGTH]; float dummy; // open script file fprintf(stdout, "Script file name\n\t%s\n", scriptFileName); scriptFile = fopen(scriptFileName, "r"); // read script fgets(Line, LLENGTH, scriptFile); fgets(Line, LLENGTH, scriptFile); fscanf(scriptFile, "%d\n", &numAmost); fprintf(stdout, "numAmost\n\t%d\n", numAmost); fgets(Line, LLENGTH, scriptFile); fscanf(scriptFile, "%d\n", &burnIn); fprintf(stdout, "burnIn\n\t%d\n", burnIn); fgets(Line, LLENGTH, scriptFile); fscanf(scriptFile, "%d\n", &lag); fprintf(stdout, "Lag\n\t%d\n", lag); fgets(Line, LLENGTH, scriptFile); fscanf(scriptFile, "%lf\n", &pProb); fprintf(stdout, "probability p\n\t%f\n", pProb); fgets(Line, LLENGTH, scriptFile); fgets(Line, LLENGTH, scriptFile); fgets(Line, LLENGTH, scriptFile); i = 0; while ((fileName[i]=Line[i]) != '\n' ) i++; fileName[i] = '\0'; fprintf(stdout, "File name for data X\n\t%s\n",fileName); fileDataX = fopen(fileName, "r"); fgets(Line, LLENGTH, scriptFile); i = 0; while ((fileName[i]=Line[i]) != '\n' ) i++; fileName[i] = '\0'; fprintf(stdout, "File name for data Y\n\t%s\n",fileName); fileDataY = fopen(fileName, "r"); // fgets(Line, LLENGTH, scriptFile); fgets(Line, LLENGTH, scriptFile); i = 0; while ((fileName[i]=Line[i]) != '\n' ) i++; fileName[i] = '\0'; fprintf(stdout, "File name for number of blocks\n\t%s\n",fileName); fileBurnIn = fopen(fileName, "w"); // fgets(Line, LLENGTH, scriptFile); fgets(Line, LLENGTH, scriptFile); i = 0; while ((fileName[i]=Line[i]) != '\n' ) i++; fileName[i] = '\0'; fprintf(stdout, "File name for posterior estimates\n\t%s\n",fileName); fileAlpPsiSig = fopen(fileName, "w"); // fgets(Line, LLENGTH, scriptFile); fgets(Line, LLENGTH, scriptFile); i = 0; while ((fileName[i]=Line[i]) != '\n' ) i++; fileName[i] = '\0'; fprintf(stdout, "File name for posterior distribution of number of blocks\n\t%s\n",fileName); fileNumBlo = fopen(fileName, "w"); // fgets(Line, LLENGTH, scriptFile); fgets(Line, LLENGTH, scriptFile); i = 0; while ((fileName[i]=Line[i]) != '\n' ) i++; fileName[i] = '\0'; fprintf(stdout, "File name for the most probable partitions\n\t%s\n",fileName); filePartic = fopen(fileName, "w"); fclose(scriptFile); // count time series X size tamX = 0; while (fscanf(fileDataX,"%lf\n", &dummy) == 1) { tamX++; // fprintf(stdout, "dummy = %lf\t tamX = %d\n", dummy, tamX); } // read time series rewind(fileDataX); fprintf(stdout, "Time series X size\n\t%d\n", tamX); X = new float[tamX+1]; tamU = tamX-1; for (i=1; i <= tamX; i++) { fscanf(fileDataX, "%lf\n", &X[i]); // fprintf(stdout, "X%d = %lf\n", i, X[i]); } // count time series Y size tamY = 0; while (fscanf(fileDataY,"%lf\n", &dummy) == 1) { tamY++; // fprintf(stdout, "dummy = %lf\t tamY = %d\n", dummy, tamY); } // read time series rewind(fileDataY); fprintf(stdout, "Time series Y size\n\t%d\n", tamY); Y = new float[tamY+1]; tamU = tamY-1; for (i=1; i <= tamY; i++) { fscanf(fileDataY, "%lf\n", &Y[i]); // fprintf(stdout, "Y%d = %lf\n", i, Y[i]); } return 0; } int ChangeReg::ComputeParamPost(void) { fprintf(stdout,"ChangeReg::ComputeParamPost()\n"); int i, j, k; float sumX, sumY, sumXY, sumXX, sumYY, W; aPost = new float*[tamX]; dPost = new float*[tamX]; vPostAlp = new float*[tamX]; nPostAlp = new float*[tamX]; zPost = new float*[tamX]; vPostPsi = new float*[tamX]; nPostPsi = new float*[tamX]; nPostSig = new float*[tamX]; fYijXij = new float*[tamX]; vPostY = new float*[tamX]; nPostY = new float*[tamX]; for (i=0; ii; l--) { if ( vecU[k-1][l] == 0 ) y = l; } // compute Ri Ri = log(cPost[x][y]) - log(cPost[x][i]) - log(cPost[i][y]); Ri = exp(Ri); // generate Uki // u = UNI; u = rUnif2(&runifSeed1,&runifSeed2); 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 ChangeReg::ComputeNuBloc(void) { fprintf(stdout, "ChangeReg::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 ChangeReg::PrintNumBloc() { fprintf(stdout, "ChangeReg::PrintNumBloc()\n"); for (int k=1; k<=numAmost; k++) { fprintf(fileBurnIn,"%d\n", numBlocks[k]); } return 0; } int ChangeReg::ComputeRelevPost(void) { fprintf(stdout, "ChangeReg::ComputeRelevPost()\n"); int i, j, inicBloc, finalBloc; relevPost = new float*[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 ChangeReg::ComputePbPost(void) { fprintf(stdout, "ChangeReg::ComputePbPost()\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 ChangeReg::PrintPbPost(void) { fprintf(stdout, "ChangeReg::PrintPbPost()\n"); int i, j, minJ, min; fprintf(fileNumBlo, "#blocks\t #occur\t prob\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]