Doxygen Source Code Documentation
RegAna.c File Reference
#include "matrix.c"Go to the source code of this file.
Defines | |
| #define | MTEST(ptr) |
Functions | |
| void | RA_error (char *message) |
| int | calc_matrices (matrix xdata, int p, int *plist, matrix *x, matrix *xtxinv, matrix *xtxinvxt) |
| int | calc_glt_matrix (matrix xtxinv, matrix c, matrix *a, matrix *cxtxinvct) |
| float | calc_sse (matrix x, vector b, vector y) |
| float | calc_resids (matrix x, vector b, vector y, vector *e) |
| float | calc_sse_fit (matrix x, vector b, vector y, float *fitts, float *errts) |
| float | calc_sspe (vector y, int *levels, int *counts, int c) |
| float | calc_flof (int n, int p, int c, float sse, float sspe) |
| void | calc_coef (matrix xtxinvxt, vector y, vector *coef) |
| void | calc_rcoef (matrix a, vector coef, vector *rcoef) |
| void | calc_lcoef (matrix c, vector coef, vector *lcoef) |
| void | calc_tcoef (int n, int p, float sse, matrix xtxinv, vector coef, vector *scoef, vector *tcoef) |
| float | calc_freg (int n, int p, int q, float ssef, float sser) |
| float | calc_rsqr (float ssef, float sser) |
Variables | |
| int | use_psinv = 1 |
Define Documentation
|
|
Value: if((ptr)==NULL) \ ( RA_error ("Cannot allocate memory") ) |
Function Documentation
|
||||||||||||||||
|
Definition at line 420 of file RegAna.c. References vector_multiply(). Referenced by init_delay(), init_regression_analysis(), and regression_analysis().
00421 : (1/(X'X))X' */ 00422 vector y, /* vector of measured data */ 00423 vector * coef /* vector of regression parameters */ 00424 ) 00425 00426 { 00427 00428 /*----- calculate regression coefficients -----*/ 00429 vector_multiply (xtxinvxt, y, coef); 00430 00431 } |
|
||||||||||||||||||||||||
|
Definition at line 376 of file RegAna.c. Referenced by regression_analysis().
00384 {
00385 const float EPSILON = 1.0e-5; /* protection against divide by zero */
00386 float mspe; /* mean square error due to pure error */
00387 float sslf; /* error sum of squares due to lack of fit */
00388 float mslf; /* mean square error due to lack of fit */
00389 float flof; /* F-statistic for lack of fit */
00390
00391
00392 /*----- calculate mean sum of squares due to pure error -----*/
00393 mspe = sspe / (n - c);
00394
00395
00396 /*----- calculate mean sum of squares due to lack of fit -----*/
00397 sslf = sse - sspe;
00398 mslf = sslf / (c - p);
00399
00400
00401 /*----- calculate F-statistic for lack of fit -----*/
00402 if (mspe < EPSILON)
00403 flof = 0.0;
00404 else
00405 flof = mslf / mspe;
00406
00407
00408 /*----- return F-statistic for lack of fit -----*/
00409 return (flof);
00410
00411 }
|
|
||||||||||||||||||||||||
|
Definition at line 545 of file RegAna.c.
00553 {
00554 const float MAXF = 1000.0; /* maximum value for F-statistic */
00555 const float EPSILON = 1.0e-5; /* protection against divide by zero */
00556 float msef; /* mean square error for the full model */
00557 float msreg; /* mean square due to the regression */
00558 float freg; /* F-statistic for the full regression model */
00559
00560
00561 /*----- Order of reduced model = order of full model ??? -----*/
00562 if (p <= q) return (0.0);
00563
00564
00565 /*----- Calculate numerator and denominator of F-statistic -----*/
00566 msreg = (sser - ssef) / (p - q); if (msreg < 0.0) msreg = 0.0;
00567 msef = ssef / (n - p); if (msef < 0.0) msef = 0.0;
00568
00569 if (msreg > MAXF*msef) freg = MAXF;
00570 else
00571 if (msef < EPSILON)
00572 freg = 0.0;
00573 else
00574 freg = msreg / msef;
00575
00576
00577 /*----- Limit range of values for F-statistic -----*/
00578 if (freg < 0.0) freg = 0.0;
00579 else if (freg > MAXF) freg = MAXF;
00580
00581
00582 /*----- Return F-statistic for significance of the regression -----*/
00583 return (freg);
00584
00585 }
|
|
||||||||||||||||||||
|
Definition at line 119 of file RegAna.c. References a, c, ENTRY, matrix_destroy(), matrix_identity(), matrix_initialize(), matrix_inverse_dsc(), matrix_multiply(), matrix_subtract(), matrix_transpose(), RA_error, and RETURN. Referenced by init_glt_analysis().
00120 : 1/(X'X) */ 00121 matrix c, /* matrix representing GLT linear constraints */ 00122 matrix * a, /* constant matrix for use later */ 00123 matrix * cxtxinvct /* matrix: C(1/(X'X))C' for GLT */ 00124 ) 00125 00126 { 00127 matrix ct, xtxinvct, t1, t2; /* temporary matrix calculation results */ 00128 int ok; /* flag for successful matrix inversion */ 00129 00130 00131 ENTRY("calc_glt_matrix") ; 00132 00133 /*----- initialize matrices -----*/ 00134 matrix_initialize (&ct); 00135 matrix_initialize (&xtxinvct); 00136 matrix_initialize (&t1); 00137 matrix_initialize (&t2); 00138 00139 00140 /*----- calculate the constant matrix which will be needed later -----*/ 00141 matrix_transpose (c, &ct); /* [c]' */ 00142 matrix_multiply (xtxinv, ct, &xtxinvct); /* inv{[x]'[x]} [c]' */ 00143 matrix_multiply (c, xtxinvct, cxtxinvct); /* [c] inv{[x]'[x]} [c]' */ 00144 ok = matrix_inverse_dsc (*cxtxinvct, &t2); /* inv{ [c] inv{[x]'[x]} [c]' } */ 00145 if (ok) 00146 { 00147 matrix_multiply (xtxinvct, t2, &t1); 00148 matrix_multiply (t1, c, &t2); 00149 matrix_identity (xtxinv.rows, &t1); 00150 matrix_subtract (t1, t2, a); 00151 } 00152 else 00153 RA_error ("Improper C matrix ( cannot invert C(1/(X'X))C' ) "); 00154 00155 00156 /*----- dispose of matrices -----*/ 00157 matrix_destroy (&ct); 00158 matrix_destroy (&xtxinvct); 00159 matrix_destroy (&t1); 00160 matrix_destroy (&t2); 00161 00162 RETURN (ok); 00163 } |
|
||||||||||||||||
|
Definition at line 460 of file RegAna.c. References c, and vector_multiply(). Referenced by glt_analysis().
00466 {
00467
00468 /*----- calculate linear combinations -----*/
00469 vector_multiply (c, coef, lcoef);
00470
00471 }
|
|
||||||||||||||||||||||||||||
|
Definition at line 73 of file RegAna.c. References ENTRY, matrix_destroy(), matrix_extract(), matrix_initialize(), matrix_inverse_dsc(), matrix_multiply(), matrix_psinv(), matrix_transpose(), p, RA_error, RETURN, and use_psinv. Referenced by init_delay(), and init_regression_analysis().
00078 : 1/(X'X) */ 00079 matrix * xtxinvxt /* matrix: (1/(X'X))X' */ 00080 ) 00081 00082 { 00083 matrix xt, xtx; /* temporary matrix calculation results */ 00084 int ok; /* flag for successful matrix inversion */ 00085 00086 ENTRY("calc_matrices") ; 00087 00088 /*----- extract the independent variable matrix X -----*/ 00089 matrix_extract (xdata, p, plist, x); 00090 00091 00092 /*----- calculate various matrices which will be needed later -----*/ 00093 if( p <= 1 || !use_psinv ){ 00094 matrix_initialize (&xt); 00095 matrix_initialize (&xtx); 00096 matrix_transpose (*x, &xt); 00097 matrix_multiply (xt, *x, &xtx); 00098 ok = matrix_inverse_dsc (xtx, xtxinv); 00099 if (ok) 00100 matrix_multiply (*xtxinv, xt, xtxinvxt); 00101 else 00102 RA_error ("Improper X matrix (cannot invert X'X) "); 00103 matrix_destroy (&xtx); 00104 matrix_destroy (&xt); 00105 } else { 00106 matrix_psinv (*x, xtxinv , xtxinvxt ); ok = 1 ; /* 19 Jul 2004 */ 00107 } 00108 00109 RETURN (ok); 00110 } |
|
||||||||||||||||
|
Definition at line 440 of file RegAna.c. References a, and vector_multiply(). Referenced by glt_analysis().
00446 {
00447
00448 /*----- calculate reduced model regression coefficients -----*/
00449 vector_multiply (a, coef, rcoef);
00450
00451 }
|
|
||||||||||||||||||||
|
Definition at line 222 of file RegAna.c. References vector_destroy(), vector_dot(), vector_initialize(), vector_multiply(), vector_multiply_subtract(), and vector_subtract(). Referenced by init_delay(), init_regression_analysis(), and regression_analysis().
00229 {
00230 #if 0
00231 vector yhat; /* product Xb */
00232 #endif
00233 float sse; /* error sum of squares */
00234
00235
00236 /*----- initialize vectors -----*/
00237 #if 0
00238 vector_initialize (&yhat);
00239 #endif
00240
00241
00242 /*----- calculate the error sum of squares -----*/
00243 #if 0
00244 vector_multiply (x, b, &yhat);
00245 vector_subtract (y, yhat, e);
00246 sse = vector_dot (*e, *e);
00247 #else
00248 sse = vector_multiply_subtract( x , b , y , e ) ;
00249 #endif
00250
00251
00252 /*----- dispose of vectors -----*/
00253 #if 0
00254 vector_destroy (&yhat);
00255 #endif
00256
00257
00258 /*----- return SSE -----*/
00259 return (sse);
00260
00261 }
|
|
||||||||||||
|
Definition at line 594 of file RegAna.c.
00599 {
00600 const float EPSILON = 1.0e-5; /* protection against divide by zero */
00601 float rsqr; /* coeff. of multiple determination R^2 */
00602
00603
00604 /*----- coefficient of multiple determination R^2 -----*/
00605 if (sser < EPSILON)
00606 rsqr = 0.0;
00607 else
00608 rsqr = (sser - ssef) / sser;
00609
00610
00611 /*----- Limit range of values for R^2 -----*/
00612 if (rsqr < 0.0) rsqr = 0.0;
00613 else if (rsqr > 1.0) rsqr = 1.0;
00614
00615
00616 /*----- Return coefficient of multiple determination R^2 -----*/
00617 return (rsqr);
00618 }
|
|
||||||||||||||||
|
Definition at line 172 of file RegAna.c. References vector_destroy(), vector_dot(), vector_initialize(), vector_multiply(), vector_multiply_subtract(), and vector_subtract().
00178 {
00179 #if 0
00180 vector yhat; /* product Xb */
00181 #endif
00182 vector e; /* vector of residuals */
00183 float sse; /* error sum of squares */
00184
00185
00186 /*----- initialize vectors -----*/
00187 #if 0
00188 vector_initialize (&yhat);
00189 #endif
00190 vector_initialize (&e);
00191
00192
00193 /*----- calculate the error sum of squares -----*/
00194 #if 0
00195 vector_multiply (x, b, &yhat);
00196 vector_subtract (y, yhat, &e);
00197 sse = vector_dot (e, e);
00198 #else
00199 sse = vector_multiply_subtract( x , b , y , &e ) ;
00200 #endif
00201
00202
00203 /*----- dispose of vectors -----*/
00204 vector_destroy (&e);
00205 #if 0
00206 vector_destroy (&yhat);
00207 #endif
00208
00209
00210 /*----- return SSE -----*/
00211 return (sse);
00212
00213 }
|
|
||||||||||||||||||||||||
|
Definition at line 271 of file RegAna.c. References vector::elts, vector_destroy(), vector_dotself(), vector_initialize(), vector_multiply(), and vector_subtract(). Referenced by regression_analysis().
00279 {
00280 vector yhat; /* product Xb */
00281 vector e; /* vector of residuals */
00282 float sse; /* error sum of squares */
00283 int it; /* time point index */
00284
00285
00286 /*----- initialize vectors -----*/
00287 vector_initialize (&yhat);
00288 vector_initialize (&e);
00289
00290
00291 /*----- calculate the error sum of squares -----*/
00292 vector_multiply (x, b, &yhat);
00293 vector_subtract (y, yhat, &e);
00294 sse = vector_dotself( e );
00295
00296 /*----- save the fitted time series and residual errors -----*/
00297 for (it = 0; it < x.rows; it++)
00298 {
00299 fitts[it] = yhat.elts[it];
00300 errts[it] = e.elts[it];
00301 }
00302
00303
00304 /*----- dispose of vectors -----*/
00305 vector_destroy (&e);
00306 vector_destroy (&yhat);
00307
00308
00309 /*----- return SSE -----*/
00310 return (sse);
00311
00312 }
|
|
||||||||||||||||||||
|
Definition at line 321 of file RegAna.c. References c, free, i, malloc, and MTEST. Referenced by regression_analysis().
00328 {
00329 register int i, j; /* indices */
00330 register float * sum = NULL; /* sum of observations at each level */
00331 register float diff; /* difference between observation and average */
00332 register float sspe; /* pure error sum of squares */
00333
00334
00335 /*----- initialize sum -----*/
00336 sum = (float *) malloc (sizeof(float) * c);
00337 MTEST (sum);
00338
00339 for (j = 0; j < c; j++)
00340 sum[j] = 0.0;
00341
00342
00343 /*----- accumulate sum for each level -----*/
00344 for (i = 0; i < y.dim; i++)
00345 {
00346 j = levels[i];
00347 sum[j] += y.elts[i];
00348 }
00349
00350
00351 /*----- calculate SSPE -----*/
00352 sspe = 0.0;
00353 for (i = 0; i < y.dim; i++)
00354 {
00355 j = levels[i];
00356 diff = y.elts[i] - (sum[j]/counts[j]);
00357 sspe += diff * diff;
00358 }
00359
00360
00361 free (sum); sum = NULL;
00362
00363
00364 /*----- return SSPE -----*/
00365 return (sspe);
00366
00367 }
|
|
||||||||||||||||||||||||||||||||
|
Definition at line 481 of file RegAna.c. References i, p, var, and vector_create(). Referenced by glt_analysis(), and regression_analysis().
00485 : 1/(Xf'Xf) */ 00486 vector coef, /* vector of regression parameters */ 00487 vector * scoef, /* std. devs. for regression parameters */ 00488 vector * tcoef /* t-statistics for regression parameters */ 00489 ) 00490 00491 { 00492 const float MAXT = 1000.0; /* maximum value for t-statistic */ 00493 const float EPSILON = 1.0e-5; /* protection against divide by zero */ 00494 int df; /* error degrees of freedom */ 00495 float mse; /* mean square error */ 00496 register int i; /* parameter index */ 00497 float stddev; /* standard deviation for parameter estimate */ 00498 float tstat; /* t-statistic for parameter estimate */ 00499 float num; /* numerator of t-statistic */ 00500 float var; /* variance for parameter estimate */ 00501 00502 00503 /*----- Create vectors -----*/ 00504 vector_create (p, scoef); 00505 vector_create (p, tcoef); 00506 00507 00508 /*----- Calculate mean square error -----*/ 00509 df = n - p; 00510 mse = sse / df; 00511 00512 00513 for (i = 0; i < xtxinv.rows; i++) 00514 { 00515 /*----- Calculate standard deviation for regression parameters -----*/ 00516 var = mse * xtxinv.elts[i][i]; 00517 if (var <= 0.0) stddev = 0.0; 00518 else stddev = sqrt (var); 00519 scoef->elts[i] = stddev; 00520 00521 00522 /*----- Calculate t-statistic for regression parameters -----*/ 00523 num = coef.elts[i]; 00524 if (num > MAXT*stddev) tstat = MAXT; 00525 else if (num < -MAXT*stddev) tstat = -MAXT; 00526 else if (stddev < EPSILON) tstat = 0.0; 00527 else tstat = num / stddev; 00528 00529 00530 /*----- Limit range of values for t-statistic -----*/ 00531 if (tstat < -MAXT) tstat = -MAXT; 00532 if (tstat > MAXT) tstat = MAXT; 00533 00534 tcoef->elts[i] = tstat; 00535 } 00536 } |
|
|
Definition at line 182 of file 3dRegAna.c. References PROGRAM_NAME.
00183 {
00184 fprintf (stderr, "%s Error: %s \n", PROGRAM_NAME, message);
00185 exit(1);
00186 }
|
Variable Documentation
|
|
Definition at line 47 of file RegAna.c. Referenced by calc_matrices(). |