projects
/
pspp-builds.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
oops
[pspp-builds.git]
/
src
/
math
/
linreg
/
linreg.c
diff --git
a/src/math/linreg/linreg.c
b/src/math/linreg/linreg.c
index 6dfeb9db557f235711ad1839084ac9eb54d69103..659d6ca48306440a22e5e99e8a355241ab1fd319 100644
(file)
--- a/
src/math/linreg/linreg.c
+++ b/
src/math/linreg/linreg.c
@@
-1,5
+1,5
@@
/* PSPP - a program for statistical analysis.
/* PSPP - a program for statistical analysis.
- Copyright (C) 2005 Free Software Foundation, Inc.
Written by Jason H. Stover.
+ Copyright (C) 2005 Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@
-94,9
+94,9
@@
int
pspp_linreg_get_vars (const void *c_, const struct variable **v)
{
const pspp_linreg_cache *c = c_;
pspp_linreg_get_vars (const void *c_, const struct variable **v)
{
const pspp_linreg_cache *c = c_;
- struct pspp_coeff *coef = NULL;
const struct variable *tmp;
int i;
const struct variable *tmp;
int i;
+ int j;
int result = 0;
/*
int result = 0;
/*
@@
-107,15
+107,9
@@
pspp_linreg_get_vars (const void *c_, const struct variable **v)
{
v[i] = NULL;
}
{
v[i] = NULL;
}
- /*
- Start at c->coeff[1] to avoid the intercept.
- */
- v[result] = pspp_coeff_get_var (c->coeff[1], 0);
- result = (v[result] == NULL) ? 0 : 1;
-
- for (coef = c->coeff[2]; coef < c->coeff[c->n_coeffs]; coef++)
+ for (j = 0; j < c->n_coeffs; j++)
{
{
- tmp = pspp_coeff_get_var (c
oef
, 0);
+ tmp = pspp_coeff_get_var (c
->coeff[j]
, 0);
assert (tmp != NULL);
/* Repeated variables are likely to bunch together, at the end
of the array. */
assert (tmp != NULL);
/* Repeated variables are likely to bunch together, at the end
of the array. */
@@
-189,6
+183,7
@@
pspp_linreg_cache_free (void *m)
{
pspp_coeff_free (c->coeff[i]);
}
{
pspp_coeff_free (c->coeff[i]);
}
+ free (c->coeff);
free (c);
}
return true;
free (c);
}
return true;
@@
-204,7
+199,7
@@
pspp_linreg (const gsl_vector * Y, const gsl_matrix * X,
const pspp_linreg_opts * opts, pspp_linreg_cache * cache)
{
int rc;
const pspp_linreg_opts * opts, pspp_linreg_cache * cache)
{
int rc;
- gsl_matrix *design;
+ gsl_matrix *design
= NULL
;
gsl_matrix_view xtx;
gsl_matrix_view xm;
gsl_matrix_view xmxtx;
gsl_matrix_view xtx;
gsl_matrix_view xm;
gsl_matrix_view xmxtx;
@@
-245,9
+240,9
@@
pspp_linreg (const gsl_vector * Y, const gsl_matrix * X,
cache->dft = cache->n_obs - 1;
cache->dfm = cache->n_indeps;
cache->dfe = cache->dft - cache->dfm;
cache->dft = cache->n_obs - 1;
cache->dfm = cache->n_indeps;
cache->dfe = cache->dft - cache->dfm;
- cache->n_coeffs = X->size2
+ 1; /* Adjust this later to allow for
- regression through the origin.
- */
+ cache->n_coeffs = X->size2
;
+ cache->intercept = 0.0;
+
if (cache->method == PSPP_LINREG_SWEEP)
{
gsl_matrix *sw;
if (cache->method == PSPP_LINREG_SWEEP)
{
gsl_matrix *sw;
@@
-321,7
+316,7
@@
pspp_linreg (const gsl_vector * Y, const gsl_matrix * X,
for (i = 0; i < cache->n_indeps; i++)
{
tmp = gsl_matrix_get (sw, i, cache->n_indeps);
for (i = 0; i < cache->n_indeps; i++)
{
tmp = gsl_matrix_get (sw, i, cache->n_indeps);
- cache->coeff[i
+ 1
]->estimate = tmp;
+ cache->coeff[i]->estimate = tmp;
m -= tmp * gsl_vector_get (cache->indep_means, i);
}
/*
m -= tmp * gsl_vector_get (cache->indep_means, i);
}
/*
@@
-357,7
+352,7
@@
pspp_linreg (const gsl_vector * Y, const gsl_matrix * X,
}
gsl_matrix_set (cache->cov, 0, 0, tmp);
}
gsl_matrix_set (cache->cov, 0, 0, tmp);
- cache->
coeff[0]->estimate
= m;
+ cache->
intercept
= m;
}
else
{
}
else
{
@@
-404,8
+399,9
@@
pspp_linreg (const gsl_vector * Y, const gsl_matrix * X,
cache->cov, &(cache->sse), wk);
for (i = 0; i < cache->n_coeffs; i++)
{
cache->cov, &(cache->sse), wk);
for (i = 0; i < cache->n_coeffs; i++)
{
- cache->coeff[i]->estimate = gsl_vector_get (param_estimates, i);
+ cache->coeff[i]->estimate = gsl_vector_get (param_estimates, i
+ 1
);
}
}
+ cache->intercept = gsl_vector_get (param_estimates, 0);
if (rc == GSL_SUCCESS)
{
gsl_multifit_linear_free (wk);
if (rc == GSL_SUCCESS)
{
gsl_multifit_linear_free (wk);