commons-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Greg Sterijevski <gsterijev...@gmail.com>
Subject Re: [math] Pivoting in QR decomposition
Date Fri, 22 Jul 2011 18:40:57 GMT
Sorry,

public ConstrainedOLSMultipleRegression extends OLSMultipleRegression{}

should read:

public ConstrainedOLSMultipleRegression extends OLSMultipleRegression{
            @Override
    public void newSampleData(double[] data, double[][] coeff, double[] rhs,
int nob, int nvars) {
       adjustData( data,  coeff, rhs);
       super.newSampleData(data, nobs, nvars);
        qr = new QRDecompositionImpl(X);
    }

>
> }

The data would be transformed on the way in, and everything else would
remain the same...



On Fri, Jul 22, 2011 at 1:37 PM, Greg Sterijevski <gsterijevski@gmail.com>wrote:

> On the need for pivoting:
>
> Here is my first approach for changing OLSMultipleRegression to do
> constrained estimation:
>
>     public double[] calculateBeta(double[][] coeff, double[] rhs) {
>         if (rhs.length != coeff.length) {
>             throw new IllegalArgumentException("");
>         }
>         for (double[] rest : coeff) {
>             if (rest.length != this.X.getColumnDimension()) {
>                 throw new IllegalArgumentException("");
>             }
>         }
>         RealMatrix Coeff = new Array2DRowRealMatrix(coeff, false);
>         RealVector rhsVec = new ArrayRealVector(rhs);
>         QRDecomposition coeffQRd = new
> QRDecompositionImpl(Coeff.transpose());
>         RealMatrix Qcoeff = coeffQRd.getQ();
>         RealMatrix R = X.multiply(Qcoeff);
>
>         final int nvars = X.getColumnDimension();
>         final int nobs = X.getRowDimension();
>         final int ncons = coeff.length;
>
>         RealMatrix R2 = R.getSubMatrix(
>                 0, nobs - 1, ncons, nvars - 1);
>
>         RealMatrix R1 = R.getSubMatrix(
>                 0, nobs - 1, 0, ncons - 1);
>
>         RealVector gamma = rhsVec.copy();
>
>         RealMatrix coeffR = coeffQRd.getR().getSubMatrix(
>                 0, ncons - 1, 0, ncons - 1);
>
>         MatrixUtils.solveLowerTriangularSystem(coeffR.transpose(), gamma);
>
>         RealVector gammPrime = Y.subtract(R1.operate(gamma));
>
>         QRDecomposition qr2 = new QRDecompositionImpl(R2);
>
>         RealVector constrainedSolution =
> (qr2.getSolver().solve(gammPrime));
>
>         RealVector stackedVector =
>                 new ArrayRealVector(
>                 gamma.toArray(),
>                 constrainedSolution.toArray());
>
>         stackedVector = Qcoeff.operate(stackedVector);
>
>         return stackedVector.toArray();
>     }
>
> This approach is based on Dongarra et al:
>
> LAPACK Working Note
> Generalized QR Factorization and its Applications
> Work in Progress
> E. Anderson, Z. Bai and J. Dongarra
> December 9, 1991
> August 9, 1994
>
> There is nothing terrible about this approach, the coding is not finished
> and tidy, but its a work in progress.
>
> I am also aware of second approach. I do not have a cite for it, I think I
> may have derived it myself, but it would not surprise me if it is in some
> textbook somewhere... That second approach takes the QR decomposition of the
> coefficient matrix and calculates adjustment matrices for the design matrix
> and dependent vector. The problem is that I need to reorganize the design
> matrix by the pivots of the QR decomposition. Once I have the adjustment
> matrices, everything should proceed as in the case of an unconstrained
> estimation. I like the idea that if we transform the data, everything works
> the same way.
>
> Since then the ConstrainedOLSMultipleRegression class looks like:
> public ConstrainedOLSMultipleRegression extends OLSMultipleRegression{
>
> }
>
>
> As for the fact that the QRDecompositionImpl reflects its interface. We
> should probably add the functions:
>  public int[] getPivots();
>  public boolean isPivotting();
>
> to the interface. As Christopher pointed out, if the current decomposition
> is non pivoting, its pivot record is the canonical one, {0,1,2,...,n-1}.
>
> -Greg
>
>
>
>
>

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message