Parameter Calculation Classes

The parameter calculation method used for models is determined by classes that derive from the abstract base class RWRegressionCalc. The parameter calculation method used by a particular regression object may be specified by providing an instance of a class derived from RWRegressionCalc to the regression object at construction time, or through the regression class member function setCalcMethod(). If you do not specify a calculation method at construction time, a default method is provided.

Encapsulating parameter calculations in a class yields two benefits:

Calculation methods can be changed at runtime. For example, if you choose a calculation method that is fast but fails on a particular set of data, you can switch to a slower, more robust method.

You can use your own calculation method by deriving a class from RWRegressionCalc and providing the calculation method.

Here is an example of how to switch calculation methods at runtime:

 

RWMathVec<double> observations;

RWGenMat<double> predictorMatrix;

.

.

.

// Construct a linear regression object using the default

// calculation method class RWLeastSqQRCalc. This

// method is fast, but will fail if the regression matrix does

// not have full rank.

 

RWLinearRegression lr( predictorMatrix, observations);

if ( lr.fail() )

{

// Try the more robust, but slower QR with pivoting method:

lr.setCalcMethod(RWLeastSqQRPvtCalc());

if ( lr.fail() )

{

// Matrix must have a column of 0s or something.

// Deal with the error.

cerr << “Parameter calculation failed for input data.” << endl;

}

else

{

cout << “Parameters calculated using the QR with pivoting

method: “ << lr.parameters() << endl;

}

}

else

{

cout << “Parameters calculated using the QR method: “ << lr.parameters() << endl;

}

.

.

.

All parameter calculation classes have a member function, called name(), which returns a string identifying the calculation method. In the convention used by the Business Analysis Module, name() returns the class static variable methodName. For example, if you want to know whether a particular logistic regression object uses the Levenberg-Marquardt calculation method, you would proceed as follows:

 

.

.

.

RWMathVec<double> observations;

RWGenMat<double> predictorMatrix;

.

.

.

RWLogisticRegression lr(predictorMatrix, observations);

.

.

.

// Check which calculation method is being used by the regression.

if ( lr.calcMethod().name() == RWLogisticLevenbergMarquardt::methodName )

{

cout << “using Levenberg-Marquardt calculation method” << endl;

}

else

{

cout << “using something else” << endl;

}

.

.

.

In this section: