Metropoli BBS
VIEWER: regress.c MODE: TEXT (ASCII)
/*Copyright (C) 1992, 1995 by Thomas Glen Smith.  All Rights Reserved.*/
/* regress APL2 V1.0.0 *************************************************
* Called from matinv and mdivide when the right argument is non-square.*
* Simple linear regression will be performed with the left argument    *
* containing values for the dependent variable y, and the right        *
* argument containing values for the independent variable x.  Each     *
* column of the right argument contains the value of x to some         *
* exponent, e.g. the first column may contain x to the 0th power,      *
* the second column x to the 1st power, etc.  The result will be a     *
* vector of coefficients providing the best fit in the least squares   *
* sense.  Given -                                                      *
* X = matrix pointed to by rite.                                       *
* Y = matrix pointed to by left. if left is NIL, use identity matrix.  *
* BETA = desired result.                                               *
* In matrix notation, beta is produced as follows:                     *
*   XPX = X'*X cross products matrix.                                  *
*   XPXI = INV(XPX) inverse cross products matrix.                     *
*   XPY = X'*Y sum(of sy) and sum(of xy).                              *
*   BETA = XPXI * XPY.                                                 *
***********************************************************************/
#define INCLUDES APLCB+APLMEM
#include "includes.h"
double *regress(left,rite,lrows,lcols,rrows,rcols)
Aplcb left,rite;
int lrows,lcols,rrows,rcols;
{
	Getcb; Regrest;
	extern int aplerr;
	Aplcb xpx,xpy;
	double *beta;

	beta = malloc(rcols*lcols*sizeof(double));
	if (aplerr) return(NULL); /* out of memory */
	xpx = getcb(NULL,rcols*rcols,APLNUMB+APLTEMP,2,NULL);
	*(xpx->apldim) = rcols;
	*(xpx->apldim+1) = rcols;
	xpy = getcb(NULL,rcols*lcols,APLNUMB+APLTEMP,2,NULL);
	*(xpy->apldim) = rcols;
	*(xpy->apldim+1) = lcols;
	return(regrest(left,rite,lrows,lcols,rrows,rcols,beta,xpx,xpy));
}
[ RETURN TO DIRECTORY ]