John Pliam >
Statistics-LSNoHistory >
Statistics::LSNoHistory

Module Version: 0.01
Statistics::LSNoHistory - Least-Squares linear regression package without data history

# construct from points $reg = Statistics::LSNoHistory->new(points => [ 1.0 => 1.0, 2.1 => 1.9, 2.8 => 3.2, 4.0 => 4.1, 5.2 => 4.9 ]); # other equivalent constructions $reg = Statistics::LSNoHistory->new( xvalues => [1.0, 2.1, 2.8, 4.0, 5.2], yvalues => [1.0, 1.9, 3.2, 4.1, 4.9] ); # or $reg = Statistics::LSNoHistory->new; $reg->append_arrays( [1.0, 2.1, 2.8, 4.0, 5.2], [1.0, 1.9, 3.2, 4.1, 4.9] ); # or $reg = Statistics::LSNoHistory->new; $reg->append_points( 1.0 => 1.0, 2.1 => 1.9, 2.8 => 3.2, 4.0 => 4.1, 5.2 => 4.9 ); # You may also construct from the preliminary statistics of a # previous regression: $reg = Statistics::LSNoHistory->new( num => 5, sumx => 15.1, sumy => 15.1, sumxx => 56.29, sumyy => 55.67, sumxy => 55.83, minx => 1.0, maxx => 5.2, miny => 1.0, maxy => 4.9 ); # thus a branch may be instantiated as follows $branch = Statistics::LSNoHistory->new(%{$reg->dump_stats}); $reg->append_point(6.1, 5.9); $branch->append_point(5.8, 6.0); # calculate regression values, print some printf("Slope: %.2f\n", $reg->slope); printf("Intercept %.2f\n", $reg->intercept); printf("Correlation Coefficient: %.2f\n", $reg->pearson_r); ...

This package provides standard least squares linear regression functionality without the need for storing the complete data history. Like any other, it finds best m,k (in least squares sense) so that y = m*x + k fits data points (x_1,y_1),...,(x_n,y_n).

In many applications involving linear regression, it is desirable to compute a regression based on the intermediate statistics of a previous regression along with any *new* data points. Thus there is no need to store a complete data history, but rather only a minimal set of intermediate statistics, the number of which, thanks to Gauss, is 6.

The user interface provides a way to instantiate a regression object with either raw data or previous intermediate statistics.

The constructor (or class method *new*) takes several possible arguments. The initialization scenario depends on the kinds of arguments passed and falls into one of the following categories:

*default:*new() by itself is equivalent to initializing with no data. All internal statistics are set to zero.*data points array:*new(*points*=> [x_1 => y_1, x_2 => y_2,..., x_n => y_n]) processes the n specified data points. Note that points expects an array reference even though we've written it in "hash notation" for clarity.*data value arrays:*new(*xvalues*=> [x_1, x_2,..., x_n],*yvalues*=> [y_1, y_2,..., y_n]) is equivalent to the above.*previous state:*new(*state arguments*) requires*all*of the following intermediate statistics:

*

append_point(x,y) process an additional data point.*

append_points(x_1 => y_1,..., x_n => y_n) process additional data points, which is equivalent to calling append_point() n times.*

append_arrays([x_1, x_2,..., x_n], [y_1, y_2,..., y_n]) process additional data points given a pair x and y data array references. Also equivalent to calling append_point() n times.*

average_xreturns the mean of the x values.*

average_yreturns the mean of the y values.*

variance_xreturns the (n-1)-style variance of the x values.*

variance_yreturns the (n-1)-style variance of the y values.*

slopereturns the slope m so that y = m*x + k is a least squares fit. Note that this is the least (y-y_avg)**2, and thus the standard slope.*

interceptreturns the intercept k so that y = m*x + k is a least squares fit. Note again that this is the least (y-y_avg)**2, and thus the standard intercept.*

predict(x) predicts a y value, given an x value. Computes m*x + k, where m, k are the standard regression slope and intercept (->slope and ->intercept, respectively) for the most recent data.*

slope_yreturns the slope m' so that y = m'*x + k' is a least squares fit. Note that this is the least (x-x_avg)**2, and thusnotthe standard slope.*

intercept_yreturns the intercept k' so that y = m'*x + k' is a least squares fit. Note that this is the least (x-x_avg)**2, and thusnotthe standard intercept.*

predict_x(y) predicts an x value given a y value. Computes m'*y + k', where m', k' are the regression (y-reletive) slope and intercept (->slope_y and ->intercept_y, respectively) for the most recent data.*

pearson_rreturns Pearson's r correlation coefficient.*

chi_squaredreturns the chi squared statistic.*

minimum_xreturns the minimum x value*

maximum_xreturns the maximum x value*

minimum_yreturns the minimum y value*

maximum_yreturns the maximum y value*

dump_statsreturns a hash reference of the form{ num => <val>, sumx => <val>, sumy => <val>, sumxx => <val>, sumyy => <val>, sumxy => <val>, minx => <val>, maxx => <val>, miny => <val>, maxy => <val> }in other words, containing all the stats required by the final constructor above. This effectively dumps the regression history.

This technique is more susceptible to roundoff errors than others which store the data. Extra care must be taken to scale the data before processing.

John Pliam <pliam@cpan.org>

CPAN modules: Statistics::OLS, Statistics::Descriptive, Statistics::GaussHelmert, Statistics::Regression.

Any book on statistics, any handbook of mathematics, any comprehensive book on numerical algorithms.

Press et al, Numerical Recipes in L [L in {C,Fortran, ...}], Nth edition [N > 0], Cambridge Univ Press.

See distribution file `COPYING`

for complete information.

syntax highlighting: