/** * 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); } }
// 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); } } }
private TetradVector getSelection2(ICovarianceMatrix cov, int[] rows, int k) { return cov.getSelection(rows, new int[] {k}).getColumn(0); }
private TetradMatrix getSelection1(ICovarianceMatrix cov, int[] rows) { return cov.getSelection(rows, rows); }