public double[] marginalEffectSSdf(int index) {
    int error = sweep.A.rows() - 1;
    double errorss = sweep.A.getQuick(error, error);

    int first = 0;
    for (int i = 0; i < index; i++) {
      first += xtxmatrices[i][i].rows();
    }
    int last = first + xtxmatrices[index][index].rows();
    int df = 0;
    for (int i = first; i < last; i++) {
      if (sweep.revg2sweep(i)) {
        df++;
      }
    }

    int nonsingular = sweep.sweepSingularColumns();
    df -= nonsingular;

    double reducedError = sweep.A.getQuick(error, error);
    double[] result = new double[] {(reducedError - errorss), df};
    for (int i = first; i < last; i++) {
      sweep.revg2sweep(i);
    }

    return result;
  }
  private void initialSweep() {
    sweep.XTX = DoubleFactory2D.dense.compose(xtxmatrices);
    sweep.XTy = DoubleFactory2D.dense.compose(xtymatrices);

    totalSS = 0;
    for (int i = 0; i < data.length; i++) {
      totalSS += data[i] * data[i];
    }
    sweep.yTy = DoubleFactory2D.dense.make(1, 1, totalSS);
    sweep.makeA();
    int lastrow = sweep.A.rows() - 1;
    int col = 0;
    double prevSS = totalSS;

    for (int i = 0; i < xtxmatrices.length; i++) {
      double df = 0;
      for (int j = 0; j < xtxmatrices[i][i].rows(); j++) {
        if (sweep.revg2sweep(col++)) {
          df++;
        }
      }
      effectdf.add(new Double(df));
      double newSS = sweep.A.getQuick(lastrow, lastrow);
      double difSS = prevSS - newSS;
      effectSS.add(new Double(difSS));
      prevSS = newSS;
    }
  }
 public double getErrorSS() {
   int last = sweep.A.rows() - 1;
   return sweep.A.getQuick(last, last);
 }