/********************************************************************************************/ /** **/ /** VERA.c - Optimize least squares fit to paramaters of an error model **/ /** distribution from two-channel expression data **/ /** **/ /** Error model **/ /** X = mu_x epsilon_x + delta_x **/ /** Y = mu_y epsilon_y + delta_y **/ /** Bivariate normal distribution parameters **/ /** beta[1] = sigma_epsilon_x **/ /** beta[2] = sigma_epsilon_y **/ /** beta[3] = rho_epsilon (correlation) **/ /** beta[4] = sigma_delta_x **/ /** beta[5] = sigma_delta_y **/ /** beta[6] = rho_delta (correlatio n) **/ /** **/ /** Reference: **/ /** T. E. Ideker, V. Thorsson, A. F. Siegel, and L. E. Hood **/ /** Testing for Differentially-expressed Genes by **/ /** Maximum Likelihood Analysis of Microarray Data **/ /** Journal of Computational Biology, 2001, Vol. 7, No. 6, pp.805-817 **/ /** Implementation: Vesteinn Thorsson thorsson@systemsbiology.org **/ /** Version: March, 2002 **/ /********************************************************************************************/ #include #include #include #include #include #include "util.h" #include "arraystats.h" #include "objective.h" #include "conjugate_gradient.h" #include "io.h" #define NRANSI #define FTOL_HIGH 1.e-6 /* high fractional functional tolerance change for frprmn */ #define FTOL_LOW 1.e-10 /* low fractional functional tolerance change for frprmn */ #define LINMIN_TOL_HIGH 1.e-6 /* high tolerance for line minimization */ #define LINMIN_TOL_LOW 1.e-10 /* low tolerance for line minimization */ #define MAX_MASTER 250 /* maximum number of master loop iterations */ #define MIN_MASTER 5 /* minimum number of master loop iterations */ #define MAX_QUICK 10 /* number of high tolerance subloop iterations */ double EPS_BETA=0.0005; /* stop criterion: abs(beta_increment) < EPS_BETA */ main ( int argc, char *argv[] ){ int i, j, k, l, iter, internal_index; double fret; double *p, *del, *p_old, abs_dev, Z_old, Z_diff; char *in_data, *in_model, *out_model; FILE *fp_in_data, *fp_in_model, *fp_out_model, *fp_evolution; char evolution_file_name[100] ; double *mu_vec, *grad_mu; double mu_x, mu_y; double FTOL; /* output version number and compilation parameters */ printf("VERA version: %s\n", __DATE__); #ifdef USERHOD printf("rho_delta may be non-zero, "); #else printf("rho_delta forced to zero, "); #endif #ifdef MUNONNEG printf("non-negative mus only.\n "); #else printf("mus may be negative.\n "); #endif /* initialize command line variables */ verbose = FALSE; disp_iter = FALSE; start_mod = FALSE; evolution = FALSE; stop_crit = FALSE; in_data = NULL; in_model = NULL; out_model = NULL; start_time(); /* start timer */ /* parse command line */ for (i=1; i (sigma,rho)) */ if ( p[1] < 0 ){ p[1] = -p[1]; p[3] = -p[3]; } if ( p[2] < 0 ){ p[2] = -p[2]; p[3] = -p[3]; } if ( p[4] < 0 ){ p[4] = -p[4]; #ifdef USERHOD p[6] = -p[6]; #endif } if ( p[5] < 0 ){ p[5] = -p[5]; #ifdef USERHOD p[6] = -p[6]; #endif } /* summarize result of beta optimization */ if ( disp_iter == TRUE ){ printf( " Beta after master loop iteration %d : ",k); for (j=1 ;j<=NDIM ; j++) printf(" %6.4f ", p[j]); } if ( evolution == TRUE ){ /* print results of master loop iteration in parameter evolution file */ fprintf ( fp_evolution, "%4d ", k+1); for ( j=1 ; j<= NDIM; j++ ){ fprintf ( fp_evolution," %9.4f ", p[j]); fflush( fp_evolution ); } } /* exit master loop if maximum absolute increment is below threshold */ abs_dev = 0.; for ( j=1 ; j<=NDIM ; j++ ){ if ( fabs(p[j]-p_old[j]) > abs_dev ) abs_dev = fabs(p[j]-p_old[j]); } Z_diff = fabs(Z(p)-Z_old); if ( Z_diff > abs_dev ) abs_dev = Z_diff ; if ( abs_dev < EPS_BETA && k > MIN_MASTER ) break; } /* close master loop */ /* shift intensities by mus for this evaluation below */ for( i=0 ; i