* @param vector_Y vektor with class values
* @return vector with coefficients
*/
private double [] pace(double[][] matrix_X, double [] vector_Y) {
PaceMatrix X = new PaceMatrix( matrix_X );
PaceMatrix Y = new PaceMatrix( vector_Y, vector_Y.length );
IntVector pvt = IntVector.seq(0, X.getColumnDimension()-1);
int n = X.getRowDimension();
int kr = X.getColumnDimension();
X.lsqrSelection( Y, pvt, 1 );
X.positiveDiagonal( Y, pvt );
PaceMatrix sol = (PaceMatrix) Y.clone();
X.rsolve( sol, pvt, pvt.size() );
DoubleVector r = Y.getColumn( pvt.size(), n-1, 0);
double sde = Math.sqrt(r.sum2() / r.size());
DoubleVector aHat = Y.getColumn( 0, pvt.size()-1, 0).times( 1./sde );
DoubleVector aTilde = null;
switch( paceEstimator) {
case ebEstimator:
case nestedEstimator:
case subsetEstimator:
NormalMixture d = new NormalMixture();
d.fit( aHat, MixtureDistribution.NNMMethod );
if( paceEstimator == ebEstimator )
aTilde = d.empiricalBayesEstimate( aHat );
else if( paceEstimator == ebEstimator )
aTilde = d.subsetEstimate( aHat );
else aTilde = d.nestedEstimate( aHat );
break;
case pace2Estimator:
case pace4Estimator:
case pace6Estimator:
DoubleVector AHat = aHat.square();
ChisqMixture dc = new ChisqMixture();
dc.fit( AHat, MixtureDistribution.NNMMethod );
DoubleVector ATilde;
if( paceEstimator == pace6Estimator )
ATilde = dc.pace6( AHat );
else if( paceEstimator == pace2Estimator )
ATilde = dc.pace2( AHat );
else ATilde = dc.pace4( AHat );
aTilde = ATilde.sqrt().times( aHat.sign() );
break;
case olsEstimator:
aTilde = aHat.copy();
break;
case aicEstimator:
case bicEstimator:
case ricEstimator:
case olscEstimator:
if(paceEstimator == aicEstimator) olscThreshold = 2;
else if(paceEstimator == bicEstimator) olscThreshold = Math.log( n );
else if(paceEstimator == ricEstimator) olscThreshold = 2*Math.log( kr );
aTilde = aHat.copy();
for( int i = 0; i < aTilde.size(); i++ )
if( Math.abs(aTilde.get(i)) < Math.sqrt(olscThreshold) )
aTilde.set(i, 0);
}
PaceMatrix YTilde = new PaceMatrix((new PaceMatrix(aTilde)).times( sde ));
X.rsolve( YTilde, pvt, pvt.size() );
DoubleVector betaTilde = YTilde.getColumn(0).unpivoting( pvt, kr );
return betaTilde.getArrayCopy();
}