Blame multifit/test_longley.c

Packit 67cb25
size_t longley_n = 16;
Packit 67cb25
size_t longley_p = 7;
Packit 67cb25
Packit 67cb25
double longley_x [] = {
Packit 67cb25
  1,  83.0,   234289,   2356,     1590,    107608,  1947,
Packit 67cb25
  1,  88.5,   259426,   2325,     1456,    108632,  1948,
Packit 67cb25
  1,  88.2,   258054,   3682,     1616,    109773,  1949,
Packit 67cb25
  1,  89.5,   284599,   3351,     1650,    110929,  1950,
Packit 67cb25
  1,  96.2,   328975,   2099,     3099,    112075,  1951,
Packit 67cb25
  1,  98.1,   346999,   1932,     3594,    113270,  1952,
Packit 67cb25
  1,  99.0,   365385,   1870,     3547,    115094,  1953,
Packit 67cb25
  1, 100.0,   363112,   3578,     3350,    116219,  1954,
Packit 67cb25
  1, 101.2,   397469,   2904,     3048,    117388,  1955,
Packit 67cb25
  1, 104.6,   419180,   2822,     2857,    118734,  1956,
Packit 67cb25
  1, 108.4,   442769,   2936,     2798,    120445,  1957,
Packit 67cb25
  1, 110.8,   444546,   4681,     2637,    121950,  1958,
Packit 67cb25
  1, 112.6,   482704,   3813,     2552,    123366,  1959,
Packit 67cb25
  1, 114.2,   502601,   3931,     2514,    125368,  1960,
Packit 67cb25
  1, 115.7,   518173,   4806,     2572,    127852,  1961,
Packit 67cb25
  1, 116.9,   554894,   4007,     2827,    130081,  1962 } ;
Packit 67cb25
Packit 67cb25
double longley_y[] = {60323, 61122, 60171, 61187, 63221, 63639, 64989, 63761,
Packit 67cb25
                       66019, 67857, 68169, 66513, 68655, 69564, 69331, 70551};
Packit 67cb25
Packit 67cb25
static int
Packit 67cb25
test_longley_results(const char *str,
Packit 67cb25
                     const gsl_vector *c, const gsl_vector *expected_c,
Packit 67cb25
                     const gsl_vector *cov_diag, const gsl_vector *expected_sd,
Packit 67cb25
                     const double chisq, const double chisq_res,
Packit 67cb25
                     const double expected_chisq)
Packit 67cb25
{
Packit 67cb25
  size_t i;
Packit 67cb25
Packit 67cb25
  /* test coefficient vector */
Packit 67cb25
  for (i = 0; i < longley_p; ++i)
Packit 67cb25
    {
Packit 67cb25
      gsl_test_rel (gsl_vector_get(c,i),
Packit 67cb25
                    gsl_vector_get(expected_c, i),
Packit 67cb25
                    1.0e-10,
Packit 67cb25
                    "%s c[%zu]", str, i) ;
Packit 67cb25
Packit 67cb25
      if (cov_diag && expected_sd)
Packit 67cb25
        {
Packit 67cb25
          gsl_test_rel (sqrt(gsl_vector_get(cov_diag, i)),
Packit 67cb25
                        gsl_vector_get(expected_sd, i),
Packit 67cb25
                        1e-10,
Packit 67cb25
                        "%s cov[%zu,%zu]", str, i, i);
Packit 67cb25
        }
Packit 67cb25
    }
Packit 67cb25
Packit 67cb25
  gsl_test_rel (chisq, expected_chisq, 1.0e-10, "%s chisq", str);
Packit 67cb25
  gsl_test_rel (chisq_res, expected_chisq, 1.0e-10, "%s chisq residuals", str);
Packit 67cb25
Packit 67cb25
  return GSL_SUCCESS;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
void 
Packit 67cb25
test_longley ()
Packit 67cb25
{     
Packit 67cb25
  gsl_multifit_linear_workspace * work = 
Packit 67cb25
    gsl_multifit_linear_alloc (longley_n, longley_p);
Packit 67cb25
Packit 67cb25
  gsl_multifit_robust_workspace * work_rob =
Packit 67cb25
    gsl_multifit_robust_alloc (gsl_multifit_robust_ols, longley_n, longley_p);
Packit 67cb25
Packit 67cb25
  gsl_matrix_view X = gsl_matrix_view_array (longley_x, longley_n, longley_p);
Packit 67cb25
  gsl_vector_view y = gsl_vector_view_array (longley_y, longley_n);
Packit 67cb25
  gsl_vector * c = gsl_vector_alloc (longley_p);
Packit 67cb25
  gsl_vector * r = gsl_vector_alloc (longley_n);
Packit 67cb25
  gsl_matrix * cov = gsl_matrix_alloc (longley_p, longley_p);
Packit 67cb25
Packit 67cb25
  double chisq, chisq_res;
Packit 67cb25
Packit 67cb25
  double expected_c[7] = {  -3482258.63459582,
Packit 67cb25
                            15.0618722713733,
Packit 67cb25
                            -0.358191792925910E-01,
Packit 67cb25
                            -2.02022980381683,
Packit 67cb25
                            -1.03322686717359,
Packit 67cb25
                            -0.511041056535807E-01,
Packit 67cb25
                            1829.15146461355 };
Packit 67cb25
Packit 67cb25
  double expected_sd[7]  = {  890420.383607373,      
Packit 67cb25
                              84.9149257747669,      
Packit 67cb25
                              0.334910077722432E-01, 
Packit 67cb25
                              0.488399681651699,     
Packit 67cb25
                              0.214274163161675,     
Packit 67cb25
                              0.226073200069370,     
Packit 67cb25
                              455.478499142212 } ;  
Packit 67cb25
Packit 67cb25
  double expected_chisq = 836424.055505915;
Packit 67cb25
Packit 67cb25
  gsl_vector_view diag = gsl_matrix_diagonal (cov);
Packit 67cb25
  gsl_vector_view exp_c = gsl_vector_view_array(expected_c, longley_p);
Packit 67cb25
  gsl_vector_view exp_sd = gsl_vector_view_array(expected_sd, longley_p);
Packit 67cb25
Packit 67cb25
  /* test unweighted least squares */
Packit 67cb25
  gsl_multifit_linear (&X.matrix, &y.vector, c, cov, &chisq, work);
Packit 67cb25
  gsl_multifit_linear_residuals(&X.matrix, &y.vector, c, r);
Packit 67cb25
  gsl_blas_ddot(r, r, &chisq_res);
Packit 67cb25
Packit 67cb25
  test_longley_results("longley gsl_multifit_linear",
Packit 67cb25
                       c, &exp_c.vector,
Packit 67cb25
                       &diag.vector, &exp_sd.vector,
Packit 67cb25
                       chisq, chisq_res, expected_chisq);
Packit 67cb25
Packit 67cb25
  /* test robust least squares */
Packit 67cb25
  gsl_multifit_robust (&X.matrix, &y.vector, c, cov, work_rob);
Packit 67cb25
Packit 67cb25
  test_longley_results("longley gsl_multifit_robust",
Packit 67cb25
                       c, &exp_c.vector,
Packit 67cb25
                       &diag.vector, &exp_sd.vector,
Packit 67cb25
                       1.0, 1.0, 1.0);
Packit 67cb25
Packit 67cb25
  /* test weighted least squares */
Packit 67cb25
  {
Packit 67cb25
    size_t i, j;
Packit 67cb25
Packit 67cb25
    gsl_vector * w = gsl_vector_alloc (longley_n);
Packit 67cb25
Packit 67cb25
    double expected_cov[7][7] = { { 8531122.56783558,
Packit 67cb25
-166.727799925578, 0.261873708176346, 3.91188317230983,
Packit 67cb25
1.1285582054705, -0.889550869422687, -4362.58709870581},
Packit 67cb25
Packit 67cb25
{-166.727799925578, 0.0775861253030891, -1.98725210399982e-05,
Packit 67cb25
-0.000247667096727256, -6.82911920718824e-05, 0.000136160797527761,
Packit 67cb25
0.0775255245956248},
Packit 67cb25
Packit 67cb25
{0.261873708176346, -1.98725210399982e-05, 1.20690316701888e-08,
Packit 67cb25
1.66429546772984e-07, 3.61843600487847e-08, -6.78805814483582e-08,
Packit 67cb25
-0.00013158719037715},
Packit 67cb25
Packit 67cb25
{3.91188317230983, -0.000247667096727256, 1.66429546772984e-07,
Packit 67cb25
2.56665052544717e-06, 6.96541409215597e-07, -9.00858307771567e-07,
Packit 67cb25
-0.00197260370663974},
Packit 67cb25
Packit 67cb25
{1.1285582054705, -6.82911920718824e-05, 3.61843600487847e-08,
Packit 67cb25
6.96541409215597e-07, 4.94032602583969e-07, -9.8469143760973e-08,
Packit 67cb25
-0.000576921112208274},
Packit 67cb25
Packit 67cb25
{-0.889550869422687, 0.000136160797527761, -6.78805814483582e-08,
Packit 67cb25
-9.00858307771567e-07, -9.8469143760973e-08, 5.49938542664952e-07,
Packit 67cb25
0.000430074434198215},
Packit 67cb25
Packit 67cb25
{-4362.58709870581, 0.0775255245956248, -0.00013158719037715,
Packit 67cb25
-0.00197260370663974, -0.000576921112208274, 0.000430074434198215,
Packit 67cb25
2.23229587481535 }} ;
Packit 67cb25
Packit 67cb25
    gsl_vector_set_all (w, 1.0);
Packit 67cb25
Packit 67cb25
    gsl_multifit_wlinear (&X.matrix, w, &y.vector, c, cov, &chisq, work);
Packit 67cb25
    gsl_multifit_linear_residuals(&X.matrix, &y.vector, c, r);
Packit 67cb25
    gsl_blas_ddot(r, r, &chisq_res);
Packit 67cb25
Packit 67cb25
    test_longley_results("longley gsl_multifit_wlinear",
Packit 67cb25
                         c, &exp_c.vector,
Packit 67cb25
                         NULL, NULL,
Packit 67cb25
                         chisq, chisq_res, expected_chisq);
Packit 67cb25
Packit 67cb25
    for (i = 0; i < longley_p; i++) 
Packit 67cb25
      {
Packit 67cb25
        for (j = 0; j < longley_p; j++)
Packit 67cb25
          {
Packit 67cb25
            gsl_test_rel (gsl_matrix_get(cov,i,j), expected_cov[i][j], 1e-7, 
Packit 67cb25
                          "longley gsl_multifit_wlinear cov(%d,%d)", i, j) ;
Packit 67cb25
          }
Packit 67cb25
      }
Packit 67cb25
Packit 67cb25
    gsl_vector_free(w);
Packit 67cb25
  }
Packit 67cb25
Packit 67cb25
  gsl_vector_free(c);
Packit 67cb25
  gsl_vector_free(r);
Packit 67cb25
  gsl_matrix_free(cov);
Packit 67cb25
  gsl_multifit_linear_free (work);
Packit 67cb25
  gsl_multifit_robust_free (work_rob);
Packit 67cb25
} /* test_longley() */