void SBVAR::OLSReducedFormEstimate(TDenseMatrix &B, TDenseMatrix &Sigma) { // Y = Data() // X = PredeterminedData() TDenseMatrix U, V; TDenseVector d; // X = U*D*V' SVD(U,d,V,PredeterminedData(),1); // Compute the generalize inverse of D. d.UniqueMemory(); for (int i=d.dim-1; i > 0; i--) d.vector[i]=(d.vector[i] > d.vector[0]*MACHINE_EPSILON) ? 1.0/d.vector[i] : 0.0; d.vector[0]=(d.vector[0] > 0.0) ? 1.0/d.vector[0] : 0.0; // B = inv(X'*X)*X'*Y = V*D^(-2)*V'*V*D*U'*Y' = V*D^(-1)*U'*Y. TDenseMatrix Z=Transpose(U)*Data(); B=Transpose(V*(DiagonalMatrix(d)*Z)); // Sigma = (Y'*Y - Y'*X*inv(X'*X)*X'*Y)/NumberObservatons() // = (Y'*Y - Y'*U*U*Y)/NumberObservations() Sigma=(1.0/(double)NumberObservations())*(YY - Transpose(Z)*Z); }
DiagonalMatrix operator-(const DiagonalMatrix &d) { return DiagonalMatrix(-1 * d.diag()); }
DiagonalMatrix DM::inner() const { return DiagonalMatrix(diagonal_elements_ * diagonal_elements_); }