Example #1
0
  /**
   * Calculates the sample likelihood and BIC score for i given its parents in a simple SEM model.
   */
  private double localSemScore(int i, int[] parents) {
    try {
      ICovarianceMatrix cov = getCovMatrix();
      double varianceY = cov.getValue(i, i);
      double residualVariance = varianceY;
      int n = sampleSize();
      int p = parents.length;
      int k = (p * (p + 1)) / 2 + p;
      //            int k = (p + 1) * (p + 1);
      //            int k = p + 1;
      TetradMatrix covxx = cov.getSelection(parents, parents);
      TetradMatrix covxxInv = covxx.inverse();
      TetradVector covxy = cov.getSelection(parents, new int[] {i}).getColumn(0);
      TetradVector b = covxxInv.times(covxy);
      residualVariance -= covxy.dotProduct(b);

      if (residualVariance <= 0 && verbose) {
        out.println(
            "Nonpositive residual varianceY: resVar / varianceY = "
                + (residualVariance / varianceY));
        return Double.NaN;
      }

      double c = getPenaltyDiscount();

      //            return -n * log(residualVariance) - 2 * k; //AIC
      return -n * Math.log(residualVariance) - c * k * Math.log(n);
      //            return -n * log(residualVariance) - c * k * (log(n) - log(2 * PI));
    } catch (Exception e) {
      e.printStackTrace();
      throw new RuntimeException(e);
      //            throwMinimalLinearDependentSet(parents, cov);
    }
  }
Example #2
0
  // Prints a smallest subset of parents that causes a singular matrix exception.
  private void printMinimalLinearlyDependentSet(int[] parents, ICovarianceMatrix cov) {
    List<Node> _parents = new ArrayList<>();
    for (int p : parents) _parents.add(variables.get(p));

    DepthChoiceGenerator gen = new DepthChoiceGenerator(_parents.size(), _parents.size());
    int[] choice;

    while ((choice = gen.next()) != null) {
      int[] sel = new int[choice.length];
      List<Node> _sel = new ArrayList<>();
      for (int m = 0; m < choice.length; m++) {
        sel[m] = parents[m];
        _sel.add(variables.get(sel[m]));
      }

      TetradMatrix m = cov.getSelection(sel, sel);

      try {
        m.inverse();
      } catch (Exception e2) {
        out.println("### Linear dependence among variables: " + _sel);
      }
    }
  }
Example #3
0
 private TetradVector getSelection2(ICovarianceMatrix cov, int[] rows, int k) {
   return cov.getSelection(rows, new int[] {k}).getColumn(0);
 }
Example #4
0
 private TetradMatrix getSelection1(ICovarianceMatrix cov, int[] rows) {
   return cov.getSelection(rows, rows);
 }