protected void computeStatsFillModel( PCAModel pca, DataInfo dinfo, SingularValueDecomposition svd, Gram gram, long nobs) { // Save adapted frame info for scoring later pca._output._normSub = dinfo._normSub == null ? new double[dinfo._nums] : dinfo._normSub; if (dinfo._normMul == null) { pca._output._normMul = new double[dinfo._nums]; Arrays.fill(pca._output._normMul, 1.0); } else pca._output._normMul = dinfo._normMul; pca._output._permutation = dinfo._permutation; pca._output._nnums = dinfo._nums; pca._output._ncats = dinfo._cats; pca._output._catOffsets = dinfo._catOffsets; double dfcorr = nobs / (nobs - 1.0); double[] sval = svd.getSingularValues(); pca._output._std_deviation = new double[_parms._k]; // Only want first k standard deviations for (int i = 0; i < _parms._k; i++) { sval[i] = dfcorr * sval[ i]; // Degrees of freedom = n-1, where n = nobs = # row observations processed pca._output._std_deviation[i] = Math.sqrt(sval[i]); } double[][] eigvec = svd.getV().getArray(); pca._output._eigenvectors_raw = new double[eigvec.length][_parms._k]; // Only want first k eigenvectors for (int i = 0; i < eigvec.length; i++) System.arraycopy(eigvec[i], 0, pca._output._eigenvectors_raw[i], 0, _parms._k); pca._output._total_variance = dfcorr * gram.diagSum(); // Since gram = X'X/n, but variance requires n-1 in denominator buildTables(pca, dinfo.coefNames()); }