/** @return a string representation of the coefficients and variances of the model. */ public String toString() { StringBuilder buf = new StringBuilder(); NumberFormat nf = NumberFormatUtil.getInstance().getNumberFormat(); buf.append("\nStandardized SEM:"); buf.append("\n\nEdge coefficients (parameters):\n"); for (Edge edge : edgeParameters.keySet()) { if (!Edges.isDirectedEdge(edge)) { continue; } buf.append("\n" + edge + " " + nf.format(edgeParameters.get(edge))); } buf.append("\n\nError covariances (parameters):\n"); for (Edge edge : edgeParameters.keySet()) { if (!Edges.isBidirectedEdge(edge)) { continue; } buf.append("\n" + edge + " " + nf.format(edgeParameters.get(edge))); } buf.append("\n\nError variances (calculated):\n"); for (Node error : getErrorNodes()) { double variance = getErrorVariance(error); buf.append("\n" + error + " " + (Double.isNaN(variance) ? "Undefined" : nf.format(variance))); } buf.append("\n"); return buf.toString(); }
private String reportIfContinuous(Graph dag, DataSet dataSet) { SemPm semPm = new SemPm(dag); SemEstimator estimator = new SemEstimator(dataSet, semPm); estimator.estimate(); SemIm semIm = estimator.getEstimatedSem(); NumberFormat nf = NumberFormat.getInstance(); nf.setMaximumFractionDigits(4); StringBuilder buf = new StringBuilder(); buf.append("\nDegrees of Freedom = ") .append(semPm.getDof()) .append("Chi-Square = ") .append(nf.format(semIm.getChiSquare())) .append("\nP Value = ") .append(nf.format(semIm.getPValue())) .append("\nBIC Score = ") .append(nf.format(semIm.getBicScore())); buf.append( "\n\nThe above chi square test assumes that the maximum " + "likelihood function over the measured variables has been " + "maximized. Under that assumption, the null hypothesis for " + "the test is that the population covariance matrix over all " + "of the measured variables is equal to the estimated covariance " + "matrix over all of the measured variables written as a function " + "of the free model parameters--that is, the unfixed parameters " + "for each directed edge (the linear coefficient for that edge), " + "each exogenous variable (the variance for the error term for " + "that variable), and each bidirected edge (the covariance for " + "the exogenous variables it connects). The model is explained " + "in Bollen, Structural Equations with Latent Variable, 110. "); return buf.toString(); }
public String toString() { StringBuilder buf = new StringBuilder(); buf.append("\n\nRange for " + edge); buf.append("\nCurrent value = " + coef); buf.append("\nLow end of range = " + low); buf.append("\nHigh end of range = " + high); return buf.toString(); }
/** * @return a relatively brief String representation of this SEM PM--the equations and * distributions of the model. Initial value distributions for freeParameters are not printed. */ public String toString() { StringBuilder buf = new StringBuilder(); buf.append("\nEquations:\n"); for (Node node : variableNodes) { buf.append("\n").append(node).append(" = ").append(nodeExpressionStrings.get(node)); } buf.append("\n\nErrors:\n"); for (Node node : errorNodes) { buf.append("\n").append(node).append(" ~ ").append(nodeExpressionStrings.get(node)); } buf.append("\n\nParameters:\n"); for (String param : getParameters()) { buf.append("\n").append(param).append(" ~ ").append(getParameterExpressionString(param)); } return buf.toString(); }
private String reportIfDiscrete(Graph dag, DataSet dataSet) { List vars = dataSet.getVariables(); Map<String, DiscreteVariable> nodesToVars = new HashMap<String, DiscreteVariable>(); for (int i = 0; i < dataSet.getNumColumns(); i++) { DiscreteVariable var = (DiscreteVariable) vars.get(i); String name = var.getName(); Node node = new GraphNode(name); nodesToVars.put(node.getName(), var); } BayesPm bayesPm = new BayesPm(new Dag(dag)); List<Node> nodes = bayesPm.getDag().getNodes(); for (Node node : nodes) { Node var = nodesToVars.get(node.getName()); if (var instanceof DiscreteVariable) { DiscreteVariable var2 = nodesToVars.get(node.getName()); int numCategories = var2.getNumCategories(); List<String> categories = new ArrayList<String>(); for (int j = 0; j < numCategories; j++) { categories.add(var2.getCategory(j)); } bayesPm.setCategories(node, categories); } } BayesProperties properties = new BayesProperties(dataSet, dag); properties.setGraph(dag); NumberFormat nf = NumberFormat.getInstance(); nf.setMaximumFractionDigits(4); StringBuilder buf = new StringBuilder(); buf.append("\nP-value = ").append(properties.getLikelihoodRatioP()); buf.append("\nDf = ").append(properties.getPValueDf()); buf.append("\nChi square = ").append(nf.format(properties.getPValueChisq())); buf.append("\nBIC score = ").append(nf.format(properties.getBic())); buf.append("\n\nH0: Completely disconnected graph."); return buf.toString(); }
private void saveKnowledge(Writer out) throws IOException { StringBuilder buf = new StringBuilder(); buf.append("/knowledge"); buf.append("\naddtemporal\n"); for (int i = 0; i < tierSpecs.size(); i++) { String forbiddenWithin = isTierForbiddenWithin(i) ? "*" : ""; buf.append("\n").append(i).append(forbiddenWithin).append(" "); List<String> tier = getTier(i); for (Object aTier : tier) { String name = (String) aTier; buf.append(name).append(" "); } } buf.append("\n"); buf.append("\nforbiddirect\n\n"); Set<OrderedPair<Set<MyNode>>> copy = new HashSet<>(forbiddenRulesSpecs); copy.removeAll(forbiddenTierRules()); for (OrderedPair<Set<MyNode>> o : copy) { Set<MyNode> first = o.getFirst(); Set<MyNode> second = o.getSecond(); for (MyNode s : first) { buf.append(s).append(" "); } buf.append("==> "); for (MyNode s : second) { buf.append(s).append(" "); } buf.append("\n"); } buf.append("requiredirect\n\n"); for (OrderedPair<Set<MyNode>> o : requiredRulesSpecs) { Set<MyNode> first = o.getFirst(); Set<MyNode> second = o.getSecond(); for (MyNode s : first) { buf.append(s).append(" "); } buf.append("==> "); for (MyNode s : second) { buf.append(s).append(" "); } buf.append("\n"); } out.write(buf.toString()); out.flush(); }
private void resolveOneEdgeMax(Graph graph, Node x, Node y, boolean strong, Graph oldGraph) { if (RandomUtil.getInstance().nextDouble() > 0.5) { Node temp = x; x = y; y = temp; } TetradLogger.getInstance().log("info", "\nEDGE " + x + " --- " + y); SortedMap<Double, String> scoreReports = new TreeMap<Double, String>(); List<Node> neighborsx = graph.getAdjacentNodes(x); neighborsx.remove(y); double max = Double.NEGATIVE_INFINITY; boolean left = false; boolean right = false; DepthChoiceGenerator genx = new DepthChoiceGenerator(neighborsx.size(), neighborsx.size()); int[] choicex; while ((choicex = genx.next()) != null) { List<Node> condxMinus = GraphUtils.asList(choicex, neighborsx); List<Node> condxPlus = new ArrayList<Node>(condxMinus); condxPlus.add(y); double xPlus = score(x, condxPlus); double xMinus = score(x, condxMinus); List<Node> neighborsy = graph.getAdjacentNodes(y); neighborsy.remove(x); DepthChoiceGenerator geny = new DepthChoiceGenerator(neighborsy.size(), neighborsy.size()); int[] choicey; while ((choicey = geny.next()) != null) { List<Node> condyMinus = GraphUtils.asList(choicey, neighborsy); // List<Node> parentsY = oldGraph.getParents(y); // parentsY.remove(x); // if (!condyMinus.containsAll(parentsY)) { // continue; // } List<Node> condyPlus = new ArrayList<Node>(condyMinus); condyPlus.add(x); double yPlus = score(y, condyPlus); double yMinus = score(y, condyMinus); // Checking them all at once is expensive but avoids lexical ordering problems in the // algorithm. if (normal(y, condyPlus) || normal(x, condxMinus) || normal(x, condxPlus) || normal(y, condyMinus)) { continue; } double delta = 0.0; if (strong) { if (yPlus <= xPlus + delta && xMinus <= yMinus + delta) { double score = combinedScore(xPlus, yMinus); if (yPlus <= yMinus + delta && xMinus <= xPlus + delta) { StringBuilder builder = new StringBuilder(); builder.append("\nStrong " + y + "->" + x + " " + score); builder.append("\n Parents(" + x + ") = " + condxMinus); builder.append("\n Parents(" + y + ") = " + condyMinus); scoreReports.put(-score, builder.toString()); if (score > max) { max = score; left = true; right = false; } } else { StringBuilder builder = new StringBuilder(); builder.append("\nNo directed edge " + x + "--" + y + " " + score); builder.append("\n Parents(" + x + ") = " + condxMinus); builder.append("\n Parents(" + y + ") = " + condyMinus); scoreReports.put(-score, builder.toString()); } } else if (xPlus <= yPlus + delta && yMinus <= xMinus + delta) { double score = combinedScore(yPlus, xMinus); if (yMinus <= yPlus + delta && xPlus <= xMinus + delta) { StringBuilder builder = new StringBuilder(); builder.append("\nStrong " + x + "->" + y + " " + score); builder.append("\n Parents(" + x + ") = " + condxMinus); builder.append("\n Parents(" + y + ") = " + condyMinus); scoreReports.put(-score, builder.toString()); if (score > max) { max = score; left = false; right = true; } } else { StringBuilder builder = new StringBuilder(); builder.append("\nNo directed edge " + x + "--" + y + " " + score); builder.append("\n Parents(" + x + ") = " + condxMinus); builder.append("\n Parents(" + y + ") = " + condyMinus); scoreReports.put(-score, builder.toString()); } } else if (yPlus <= xPlus + delta && yMinus <= xMinus + delta) { double score = combinedScore(yPlus, xMinus); StringBuilder builder = new StringBuilder(); builder.append("\nNo directed edge " + x + "--" + y + " " + score); builder.append("\n Parents(" + x + ") = " + condxMinus); builder.append("\n Parents(" + y + ") = " + condyMinus); scoreReports.put(-score, builder.toString()); } else if (xPlus <= yPlus + delta && xMinus <= yMinus + delta) { double score = combinedScore(yPlus, xMinus); StringBuilder builder = new StringBuilder(); builder.append("\nNo directed edge " + x + "--" + y + " " + score); builder.append("\n Parents(" + x + ") = " + condxMinus); builder.append("\n Parents(" + y + ") = " + condyMinus); scoreReports.put(-score, builder.toString()); } } else { if (yPlus <= xPlus + delta && xMinus <= yMinus + delta) { double score = combinedScore(xPlus, yMinus); StringBuilder builder = new StringBuilder(); builder.append("\nWeak " + y + "->" + x + " " + score); builder.append("\n Parents(" + x + ") = " + condxMinus); builder.append("\n Parents(" + y + ") = " + condyMinus); scoreReports.put(-score, builder.toString()); if (score > max) { max = score; left = true; right = false; } } else if (xPlus <= yPlus + delta && yMinus <= xMinus + delta) { double score = combinedScore(yPlus, xMinus); StringBuilder builder = new StringBuilder(); builder.append("\nWeak " + x + "->" + y + " " + score); builder.append("\n Parents(" + x + ") = " + condxMinus); builder.append("\n Parents(" + y + ") = " + condyMinus); scoreReports.put(-score, builder.toString()); if (score > max) { max = score; left = false; right = true; } } else if (yPlus <= xPlus + delta && yMinus <= xMinus + delta) { double score = combinedScore(yPlus, xMinus); StringBuilder builder = new StringBuilder(); builder.append("\nNo directed edge " + x + "--" + y + " " + score); builder.append("\n Parents(" + x + ") = " + condxMinus); builder.append("\n Parents(" + y + ") = " + condyMinus); scoreReports.put(-score, builder.toString()); } else if (xPlus <= yPlus + delta && xMinus <= yMinus + delta) { double score = combinedScore(yPlus, xMinus); StringBuilder builder = new StringBuilder(); builder.append("\nNo directed edge " + x + "--" + y + " " + score); builder.append("\n Parents(" + x + ") = " + condxMinus); builder.append("\n Parents(" + y + ") = " + condyMinus); scoreReports.put(-score, builder.toString()); } } } } for (double score : scoreReports.keySet()) { TetradLogger.getInstance().log("info", scoreReports.get(score)); } graph.removeEdges(x, y); if (left) { graph.addDirectedEdge(y, x); } if (right) { graph.addDirectedEdge(x, y); } if (!graph.isAdjacentTo(x, y)) { graph.addUndirectedEdge(x, y); } }
public GeneralizedSemPm(SemPm semPm) { this(semPm.getGraph()); // Write down equations. try { List<Node> variableNodes = getVariableNodes(); for (int i = 0; i < variableNodes.size(); i++) { Node node = variableNodes.get(i); List<Node> parents = getVariableParents(node); StringBuilder buf = new StringBuilder(); for (int j = 0; j < parents.size(); j++) { if (!(variableNodes.contains(parents.get(j)))) { continue; } Node parent = parents.get(j); Parameter _parameter = semPm.getParameter(parent, node); String parameter = _parameter.getName(); Set<Node> nodes = new HashSet<>(); nodes.add(node); referencedParameters.put(parameter, nodes); buf.append(parameter); buf.append("*"); buf.append(parents.get(j).getName()); setParameterExpression(parameter, "Split(-1.5, -.5, .5, 1.5)"); setStartsWithParametersTemplate(parameter.substring(0, 1), "Split(-1.5, -.5, .5, 1.5)"); setStartsWithParametersEstimationInitializaationTemplate( parameter.substring(0, 1), "Split(-1.5, -.5, .5, 1.5)"); if (j < parents.size() - 1) { buf.append(" + "); } } if (buf.toString().trim().length() != 0) { buf.append(" + "); } buf.append(errorNodes.get(i)); setNodeExpression(node, buf.toString()); } for (Node node : variableNodes) { Parameter _parameter = semPm.getParameter(node, node); String parameter = _parameter.getName(); String distributionFormula = "N(0," + parameter + ")"; setNodeExpression(getErrorNode(node), distributionFormula); setParameterExpression(parameter, "U(0, 1)"); setStartsWithParametersTemplate(parameter.substring(0, 1), "U(0, 1)"); setStartsWithParametersEstimationInitializaationTemplate( parameter.substring(0, 1), "U(0, 1)"); } variableNames = new ArrayList<>(); for (Node _node : variableNodes) variableNames.add(_node.getName()); for (Node _node : errorNodes) variableNames.add(_node.getName()); } catch (ParseException e) { throw new IllegalStateException("Parse error in constructing initial model.", e); } }