<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: reads the macro but doesn't give the output in ODS and Base Reporting</title>
    <link>https://communities.sas.com/t5/ODS-and-Base-Reporting/reads-the-macro-but-doesn-t-give-the-output/m-p/40952#M5597</link>
    <description>Hi:&lt;BR /&gt;
  Possibly reading the documentation, written by Dr. Hipp, the author, and published at these UNC sites might help:&lt;BR /&gt;
&lt;BR /&gt;
&lt;A href="http://www.unc.edu/~johnhipp/CTANEST1_documentation.doc" target="_blank"&gt;http://www.unc.edu/~johnhipp/CTANEST1_documentation.doc&lt;/A&gt;&lt;BR /&gt;
&lt;A href="http://www.unc.edu/~dbauer/manuscripts/hipp-bauer-bollen-SEM-2005.pdf" target="_blank"&gt;http://www.unc.edu/~dbauer/manuscripts/hipp-bauer-bollen-SEM-2005.pdf&lt;/A&gt;&lt;BR /&gt;
 &lt;BR /&gt;
cynthia</description>
    <pubDate>Sat, 06 Jun 2009 21:13:39 GMT</pubDate>
    <dc:creator>Cynthia_sas</dc:creator>
    <dc:date>2009-06-06T21:13:39Z</dc:date>
    <item>
      <title>reads the macro but doesn't give the output</title>
      <link>https://communities.sas.com/t5/ODS-and-Base-Reporting/reads-the-macro-but-doesn-t-give-the-output/m-p/40950#M5595</link>
      <description>My problem is that I don't get output while working with macro an also there are not errors in the program. below is the program:&lt;BR /&gt;
&lt;BR /&gt;
%macro ctanest1(N=134, vars=5, nesttest=0, pchor=0, lisrel=0, mplus=0, SAMPMAT1=&lt;BR /&gt;
0.993	0.564	0.568	0.415	0.456&lt;BR /&gt;
0.564	0.993	0.491	0.442	0.434&lt;BR /&gt;
0.568	0.491	0.993	0.449	0.649&lt;BR /&gt;
0.415	0.442	0.449	0.993	0.601&lt;BR /&gt;
0.456	0.434	0.649	0.601	0.993, &lt;BR /&gt;
IMPMAT1B=&lt;BR /&gt;
0.993	0.564	0.531	0.466	0.46&lt;BR /&gt;
0.564	0.993	0.496	0.436	0.429&lt;BR /&gt;
0.531	0.496	0.993	0.449	0.662&lt;BR /&gt;
0.466	0.436	0.449	0.993	0.582&lt;BR /&gt;
0.46	0.429	0.662	0.582	0.993, &lt;BR /&gt;
IMPMAT2B=, lowdiag=0, reps=1);&lt;BR /&gt;
&lt;BR /&gt;
%if &amp;amp;lowdiag = 1 %then %do;&lt;BR /&gt;
	%let fullmat = %eval((&amp;amp;vars + 1)*(&amp;amp;vars)/2);&lt;BR /&gt;
%end;&lt;BR /&gt;
%else %if &amp;amp;lowdiag = 0 %then %do;&lt;BR /&gt;
	%let fullmat = %eval(&amp;amp;vars*&amp;amp;vars);&lt;BR /&gt;
%end;&lt;BR /&gt;
&lt;BR /&gt;
%if &amp;amp;pchor = 0 %then %do;&lt;BR /&gt;
data t;&lt;BR /&gt;
	array t(&amp;amp;fullmat) (&amp;amp;SAMPMAT1);&lt;BR /&gt;
run;&lt;BR /&gt;
%end;&lt;BR /&gt;
&lt;BR /&gt;
data imp1;&lt;BR /&gt;
	array imp1(&amp;amp;fullmat) (&amp;amp;IMPMAT1b);&lt;BR /&gt;
run;&lt;BR /&gt;
&lt;BR /&gt;
/* If performing nested tests, read in the second model imp cov, otherwise just use the same one */&lt;BR /&gt;
%if &amp;amp;nesttest = 1 %then %do;&lt;BR /&gt;
	data imp2;&lt;BR /&gt;
		array imp2(&amp;amp;fullmat) (&amp;amp;IMPMAT2b);&lt;BR /&gt;
	run;&lt;BR /&gt;
%end;&lt;BR /&gt;
%else %do;&lt;BR /&gt;
	data imp2;&lt;BR /&gt;
		array imp2(&amp;amp;fullmat) (&amp;amp;IMPMAT1b);&lt;BR /&gt;
	run;&lt;BR /&gt;
%end;&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
proc iml;&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
START TETRAD;&lt;BR /&gt;
&lt;BR /&gt;
	IF &amp;amp;nesttest = 0 THEN DO;&lt;BR /&gt;
		tetlabel = initlabel_nonnest;&lt;BR /&gt;
		tetres = initres_nonnest;&lt;BR /&gt;
	END;&lt;BR /&gt;
	ELSE DO;&lt;BR /&gt;
		tetlabel = initlabel;&lt;BR /&gt;
		tetres = initres;&lt;BR /&gt;
	END;&lt;BR /&gt;
&lt;BR /&gt;
	/* indexing tetrads; */&lt;BR /&gt;
	id = 1;&lt;BR /&gt;
	DO i = 2 to NROW(tetres);&lt;BR /&gt;
		id = id//i;&lt;BR /&gt;
	END;&lt;BR /&gt;
&lt;BR /&gt;
	**Column 9 is id;&lt;BR /&gt;
	tetlabel = tetlabel||id;&lt;BR /&gt;
&lt;BR /&gt;
	IF &amp;amp;reps &amp;gt; 1 THEN DO;&lt;BR /&gt;
		*RANDOMIZE the tetrads;&lt;BR /&gt;
		ran = J(NROW(tetlabel),1,0);&lt;BR /&gt;
		DO i = 1 to NROW(tetlabel);&lt;BR /&gt;
			ran[i,1]=uniform(0);&lt;BR /&gt;
		END;&lt;BR /&gt;
		tetlabel = tetlabel||ran;&lt;BR /&gt;
		tetlabel2 = tetlabel;&lt;BR /&gt;
		tetlabel[rank(tetlabel[,10]),]=tetlabel2;&lt;BR /&gt;
		tetres = tetres||ran;&lt;BR /&gt;
		tetres2 = tetres;&lt;BR /&gt;
		tetres[rank(tetres[,2]),]=tetres2;&lt;BR /&gt;
		/* Now drop the random column from tetlabel */&lt;BR /&gt;
		tetlabel = tetlabel[,1:9];&lt;BR /&gt;
	END;&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
/*&lt;BR /&gt;
***********************************************************************;&lt;BR /&gt;
*Now loop through and find the vanishing tetrads for the model with fewer implied;&lt;BR /&gt;
***********************************************************************;&lt;BR /&gt;
*Loop here only if there are tetrads; */&lt;BR /&gt;
IF &amp;amp;nesttest = 1 &amp;amp; zerotet = 0 THEN DO;&lt;BR /&gt;
&lt;BR /&gt;
	/* The tenth column contains the residuals */&lt;BR /&gt;
	tetlabel = tetlabel||tetres[,1];&lt;BR /&gt;
&lt;BR /&gt;
	/* find unique covariances among implied tetrads */&lt;BR /&gt;
	/* Note that the order of the tetrads gets flipped here to match with the order that &lt;BR /&gt;
	LISREL and M-Plus give in their ACM's &lt;BR /&gt;
	(do this by placing the j+1 element in front of the j element); */&lt;BR /&gt;
	tetlabel2 = J(NROW(tetlabel),4,'aaaa');&lt;BR /&gt;
	DO i = 1 to NROW(tetlabel);&lt;BR /&gt;
		k = 0;&lt;BR /&gt;
		DO j = 1 to 7 BY 2;&lt;BR /&gt;
			k = k+1;&lt;BR /&gt;
			IF tetlabel[i,j] &amp;lt; 10 &amp;amp; tetlabel[i,j+1] &amp;lt; 10 THEN &lt;BR /&gt;
				tetlabel2[i,k] = ROWCATC('0'||CHAR(tetlabel[i,j+1])||'0'||CHAR(tetlabel[i,j]));&lt;BR /&gt;
			ELSE DO;&lt;BR /&gt;
				IF tetlabel[i,j] &amp;gt;= 10 &amp;amp; tetlabel[i,j+1]&amp;gt;=10 THEN &lt;BR /&gt;
					tetlabel2[i,k] = ROWCATC(CHAR(tetlabel[i,j+1])||CHAR(tetlabel[i,j]));&lt;BR /&gt;
				ELSE IF tetlabel[i,j] &amp;gt;= 10 THEN&lt;BR /&gt;
						tetlabel2[i,k] = ROWCATC('0'||CHAR(tetlabel[i,j+1])||CHAR(tetlabel[i,j]));&lt;BR /&gt;
					ELSE tetlabel2[i,k] = ROWCATC(CHAR(tetlabel[i,j+1])||'0'||CHAR(tetlabel[i,j]));&lt;BR /&gt;
			END;&lt;BR /&gt;
		END;&lt;BR /&gt;
	END;&lt;BR /&gt;
	tetcov = UNIQUE(SHAPE(tetlabel2,1)); /* row vector of unique covariances; */&lt;BR /&gt;
&lt;BR /&gt;
	/*&lt;BR /&gt;
	**************************************************************************;&lt;BR /&gt;
    	  construct derivative matrix: d &lt;BR /&gt;
	**************************************************************************;&lt;BR /&gt;
	*/&lt;BR /&gt;
	D = J(NCOL(tetcov),NROW(tetlabel2),0);&lt;BR /&gt;
	DO i = 1 to NCOL(tetcov);&lt;BR /&gt;
		DO j = 1 to NROW(tetlabel2);&lt;BR /&gt;
			IF tetcov[,i] = tetlabel2[j,1]&lt;BR /&gt;
				THEN D[i,j] = IMPMAT2[tetlabel[j,3],tetlabel[j,4]];&lt;BR /&gt;
			IF tetcov[,i] = tetlabel2[j,2]&lt;BR /&gt;
				THEN D[i,j] = IMPMAT2[tetlabel[j,1],tetlabel[j,2]];&lt;BR /&gt;
			IF tetcov[,i] = tetlabel2[j,3]&lt;BR /&gt;
				THEN D[i,j] = -1*IMPMAT2[tetlabel[j,7],tetlabel[j,8]];&lt;BR /&gt;
			IF tetcov[,i] = tetlabel2[j,4]&lt;BR /&gt;
				THEN D[i,j] = -1*IMPMAT2[tetlabel[j,5],tetlabel[j,6]];&lt;BR /&gt;
		END;&lt;BR /&gt;
	END;&lt;BR /&gt;
&lt;BR /&gt;
	/* compute asymptotic covariance matrix of the IMPLIED covariances */&lt;BR /&gt;
	SigmaS = J(NCOL(tetcov),NCOL(tetcov),0);&lt;BR /&gt;
	DO i = 1 to NCOL(tetcov);&lt;BR /&gt;
		DO j = 1 to NCOL(tetcov);&lt;BR /&gt;
			e = NUM(SUBSTR(tetcov[,i],1,2));&lt;BR /&gt;
			f = NUM(SUBSTR(tetcov[,i],3,2));&lt;BR /&gt;
			g = NUM(SUBSTR(tetcov[,j],1,2));&lt;BR /&gt;
			h = NUM(SUBSTR(tetcov[,j],3,2));&lt;BR /&gt;
			/* This calculates it for a correlation matrix; */&lt;BR /&gt;
			IF corr = 1 THEN DO;&lt;BR /&gt;
				SigmaS[i,j] = (1/2)&lt;BR /&gt;
                	   	* (IMPMAT2[e,f]*IMPMAT2[g,h])&lt;BR /&gt;
                   		* (IMPMAT2[e,g]**2 + IMPMAT2[e,h]**2 + IMPMAT2[f,g]**2 + IMPMAT2[f,h]**2)&lt;BR /&gt;
                   		+ IMPMAT2[e,g]*IMPMAT2[f,h] + IMPMAT2[e,h]*IMPMAT2[f,g]&lt;BR /&gt;
                   		- IMPMAT2[e,f]*(IMPMAT2[f,g]*IMPMAT2[f,h]+IMPMAT2[e,g]*IMPMAT2[e,h])&lt;BR /&gt;
                   		- IMPMAT2[g,h]*(IMPMAT2[f,g]*IMPMAT2[e,g]+IMPMAT2[f,h]*IMPMAT2[e,h]);&lt;BR /&gt;
			END;&lt;BR /&gt;
			/* This calculates it for a covariance matrix; */&lt;BR /&gt;
			ELSE DO;&lt;BR /&gt;
				SigmaS[i,j] = IMPMAT2[e,g]*IMPMAT2[f,h] + IMPMAT2[e,h]*IMPMAT2[f,g];&lt;BR /&gt;
			END;&lt;BR /&gt;
		END;&lt;BR /&gt;
	END;&lt;BR /&gt;
&lt;BR /&gt;
	SigmaTemp = D`*SigmaS*D; &lt;BR /&gt;
&lt;BR /&gt;
	/* Add an 11th column for marking tetrads to be dropped; */&lt;BR /&gt;
	tetlabel = tetlabel||J(NROW(tetlabel),1,0);&lt;BR /&gt;
&lt;BR /&gt;
	/*&lt;BR /&gt;
	*********************************************************************;&lt;BR /&gt;
	*Using the SWEEP operator;&lt;BR /&gt;
	*********************************************************************;&lt;BR /&gt;
	*/&lt;BR /&gt;
	/* ***Don't go into this loop if only one vanishing tetrad; */&lt;BR /&gt;
	IF nrow(tetlabel) &amp;gt; 1 THEN DO;&lt;BR /&gt;
&lt;BR /&gt;
		temp33 = sweep(SigmaTemp);&lt;BR /&gt;
		temp33 = temp33||J(NROW(temp33),1,0);&lt;BR /&gt;
 &lt;BR /&gt;
		DO i = 1 to NROW(temp33);&lt;BR /&gt;
			IF sum(abs(temp33[i,])) &amp;lt;&amp;gt; 0 THEN tetlabel[i,11]=1;&lt;BR /&gt;
		END;&lt;BR /&gt;
&lt;BR /&gt;
		/* Now drop the zero rows and columns (singular); */&lt;BR /&gt;
		temp5 = J(1,NCOL(temp33),0);&lt;BR /&gt;
&lt;BR /&gt;
		DO i = 1 to NROW(temp33);&lt;BR /&gt;
			IF sum(abs(temp33[i,])) &amp;lt;&amp;gt; 0 THEN DO;&lt;BR /&gt;
				temp5 = temp5 // temp33[i,1:NCOL(temp33)];&lt;BR /&gt;
			END;&lt;BR /&gt;
		END;&lt;BR /&gt;
		temp2 = J(NROW(temp5),1,0);&lt;BR /&gt;
		DO i = 1 to NCOL(temp5);&lt;BR /&gt;
			IF sum(abs(temp5[,i])) &amp;lt;&amp;gt; 0 THEN DO;&lt;BR /&gt;
				temp2 = temp2 || temp5[1:NROW(temp5),i];&lt;BR /&gt;
			END;&lt;BR /&gt;
		END;&lt;BR /&gt;
&lt;BR /&gt;
		SigmaTemp2 = temp2[2:NROW(temp2),2:NCOL(temp2)];&lt;BR /&gt;
&lt;BR /&gt;
		temp7 = J(1,11,0);&lt;BR /&gt;
		temp8 = J(1,11,0);&lt;BR /&gt;
&lt;BR /&gt;
		/* Now find the redundant tetrads; */&lt;BR /&gt;
		DO i = 1 to NROW(tetlabel);&lt;BR /&gt;
			IF tetlabel[i,11]=1 then DO;&lt;BR /&gt;
				temptet= tetlabel[i,];&lt;BR /&gt;
				temp7 = temp7//temptet;&lt;BR /&gt;
			END;&lt;BR /&gt;
			IF tetlabel[i,11]=0 then DO;&lt;BR /&gt;
				temptet2= tetlabel[i,];&lt;BR /&gt;
				temp8 = temp8//temptet2;&lt;BR /&gt;
			END;&lt;BR /&gt;
		END;&lt;BR /&gt;
		IF NROW(temp7) &amp;gt; 1 THEN DO;&lt;BR /&gt;
			temp7a = temp7[2:NROW(temp7),1:8];&lt;BR /&gt;
			temp7b = temp7[2:NROW(temp7),10];&lt;BR /&gt;
		END;&lt;BR /&gt;
		IF NROW(temp8) &amp;gt; 1 THEN DO;&lt;BR /&gt;
			temp8a = temp8[2:NROW(temp8),1:8];&lt;BR /&gt;
			temp8b = temp8[2:NROW(temp8),10];&lt;BR /&gt;
		END;&lt;BR /&gt;
&lt;BR /&gt;
		/* These are the tetrads in the smaller model, and their residuals; */&lt;BR /&gt;
		tetlabel_small = temp7a;&lt;BR /&gt;
		tetres_small = temp7b;&lt;BR /&gt;
&lt;BR /&gt;
		/*&lt;BR /&gt;
		*******************************************************************************;&lt;BR /&gt;
		*END of loop--now reorder the tetrads so that we're pulling the same ones in the larger model;&lt;BR /&gt;
		*******************************************************************************;&lt;BR /&gt;
		*/&lt;BR /&gt;
		tetlabel = J(NROW(tetlabel),8,0);&lt;BR /&gt;
&lt;BR /&gt;
		/* Order is nonredundant---not in model---redundant; */&lt;BR /&gt;
		tetlabel = temp7a//temp3//temp8a;&lt;BR /&gt;
		tetres = temp7b//temp4//temp8b;&lt;BR /&gt;
	END;&lt;BR /&gt;
	ELSE DO;&lt;BR /&gt;
		tetlabel_small = tetlabel[1,1:8];&lt;BR /&gt;
		tetres_small = tetlabel[1,10];&lt;BR /&gt;
		tetlabel = tetlabel_small;&lt;BR /&gt;
		tetres = tetres_small;&lt;BR /&gt;
	END;&lt;BR /&gt;
END;&lt;BR /&gt;
FREE Temp33 Temp5 Temp2 Temp7 Temp8 Sigmatemp2 Temptet Temptet2 Temp7a Temp7b Temp8a Temp8b;&lt;BR /&gt;
/*&lt;BR /&gt;
***********************************************************************;&lt;BR /&gt;
*Now loop through a SECOND time and find the vanishing tetrads for the model with more implied;&lt;BR /&gt;
***********************************************************************;&lt;BR /&gt;
*/&lt;BR /&gt;
/* This used to select on some instances---doesn't appear necessary anymore; */&lt;BR /&gt;
&lt;BR /&gt;
	IF &amp;amp;nesttest = 1 THEN DO;&lt;BR /&gt;
		/* indexing tetrads; */&lt;BR /&gt;
		id = 1;&lt;BR /&gt;
		DO i = 2 to NROW(tetres);&lt;BR /&gt;
			id = id//i;&lt;BR /&gt;
		END;&lt;BR /&gt;
		/* Column 9 is id; */&lt;BR /&gt;
		tetlabel = tetlabel||id;&lt;BR /&gt;
	END;&lt;BR /&gt;
 &lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
	/* find unique covariances among implied tetrads */&lt;BR /&gt;
	tetlabel2 = J(NROW(tetlabel),4,'aaaa');&lt;BR /&gt;
	DO i = 1 to NROW(tetlabel);&lt;BR /&gt;
		k = 0;&lt;BR /&gt;
		DO j = 1 to 7 BY 2;&lt;BR /&gt;
			k = k+1;&lt;BR /&gt;
			IF tetlabel[i,j] &amp;lt; 10 &amp;amp; tetlabel[i,j+1] &amp;lt; 10 THEN &lt;BR /&gt;
				tetlabel2[i,k] = ROWCATC('0'||CHAR(tetlabel[i,j+1])||'0'||CHAR(tetlabel[i,j]));&lt;BR /&gt;
			ELSE DO;&lt;BR /&gt;
				IF tetlabel[i,j] &amp;gt;= 10 &amp;amp; tetlabel[i,j+1]&amp;gt;=10 THEN &lt;BR /&gt;
					tetlabel2[i,k] = ROWCATC(CHAR(tetlabel[i,j+1])||CHAR(tetlabel[i,j]));&lt;BR /&gt;
				ELSE IF tetlabel[i,j] &amp;gt;= 10 THEN&lt;BR /&gt;
						tetlabel2[i,k] = ROWCATC('0'||CHAR(tetlabel[i,j+1])||CHAR(tetlabel[i,j]));&lt;BR /&gt;
					ELSE tetlabel2[i,k] = ROWCATC(CHAR(tetlabel[i,j+1])||'0'||CHAR(tetlabel[i,j]));&lt;BR /&gt;
			END;&lt;BR /&gt;
		END;&lt;BR /&gt;
	END;&lt;BR /&gt;
&lt;BR /&gt;
	tetcov = UNIQUE(SHAPE(tetlabel2,1)); /* row vector of unique covariances; */&lt;BR /&gt;
&lt;BR /&gt;
	/*&lt;BR /&gt;
	**************************************************************************;&lt;BR /&gt;
    	  construct derivative matrix: d &lt;BR /&gt;
	**************************************************************************;&lt;BR /&gt;
	*/&lt;BR /&gt;
	D = J(NCOL(tetcov),NROW(tetlabel2),0);&lt;BR /&gt;
&lt;BR /&gt;
	DO i = 1 to NCOL(tetcov);&lt;BR /&gt;
		DO j = 1 to NROW(tetlabel2);&lt;BR /&gt;
			IF tetcov[,i] = tetlabel2[j,1]&lt;BR /&gt;
				THEN D[i,j] = IMPMAT[tetlabel[j,3],tetlabel[j,4]];&lt;BR /&gt;
			IF tetcov[,i] = tetlabel2[j,2]&lt;BR /&gt;
				THEN D[i,j] = IMPMAT[tetlabel[j,1],tetlabel[j,2]];&lt;BR /&gt;
			IF tetcov[,i] = tetlabel2[j,3]&lt;BR /&gt;
				THEN D[i,j] = -1*IMPMAT[tetlabel[j,7],tetlabel[j,8]];&lt;BR /&gt;
			IF tetcov[,i] = tetlabel2[j,4]&lt;BR /&gt;
				THEN D[i,j] = -1*IMPMAT[tetlabel[j,5],tetlabel[j,6]];&lt;BR /&gt;
		END;&lt;BR /&gt;
	END;&lt;BR /&gt;
&lt;BR /&gt;
	/* compute asymptotic covariance matrix of the IMPLIED covariances */&lt;BR /&gt;
	SigmaS = J(NCOL(tetcov),NCOL(tetcov),0);&lt;BR /&gt;
	DO i = 1 to NCOL(tetcov);&lt;BR /&gt;
		DO j = 1 to NCOL(tetcov);&lt;BR /&gt;
			e = NUM(SUBSTR(tetcov[,i],1,2));&lt;BR /&gt;
			f = NUM(SUBSTR(tetcov[,i],3,2));&lt;BR /&gt;
			g = NUM(SUBSTR(tetcov[,j],1,2));&lt;BR /&gt;
			h = NUM(SUBSTR(tetcov[,j],3,2));&lt;BR /&gt;
			/* This calculates it for a correlation matrix; */&lt;BR /&gt;
			IF corr = 1 THEN DO;&lt;BR /&gt;
			SigmaS[i,j] = (1/2)&lt;BR /&gt;
            	    * (IMPMAT[e,f]*IMPMAT[g,h])&lt;BR /&gt;
                   	* (IMPMAT[e,g]**2 + IMPMAT[e,h]**2 + IMPMAT[f,g]**2 + IMPMAT[f,h]**2)&lt;BR /&gt;
                   	+ IMPMAT[e,g]*IMPMAT[f,h] + IMPMAT[e,h]*IMPMAT[f,g]&lt;BR /&gt;
                   	- IMPMAT[e,f]*(IMPMAT[f,g]*IMPMAT[f,h]+IMPMAT[e,g]*IMPMAT[e,h])&lt;BR /&gt;
                   	- IMPMAT[g,h]*(IMPMAT[f,g]*IMPMAT[e,g]+IMPMAT[f,h]*IMPMAT[e,h]);&lt;BR /&gt;
			END;&lt;BR /&gt;
			/* This calculates it for a covariance matrix; */&lt;BR /&gt;
			ELSE DO;&lt;BR /&gt;
				SigmaS[i,j] = IMPMAT[e,g]*IMPMAT[f,h] + IMPMAT[e,h]*IMPMAT[f,g];&lt;BR /&gt;
			END;&lt;BR /&gt;
		END;&lt;BR /&gt;
	END;&lt;BR /&gt;
&lt;BR /&gt;
	tetlabel = tetlabel||J(NROW(tetlabel),1,0);&lt;BR /&gt;
	SigmaTemp = D`*SigmaS*D; &lt;BR /&gt;
	FREE SigmaS D;&lt;BR /&gt;
	/*&lt;BR /&gt;
	*********************************************************************;&lt;BR /&gt;
	*Using the SWEEP operator;&lt;BR /&gt;
	*********************************************************************;&lt;BR /&gt;
	*/&lt;BR /&gt;
	/* ***Don't go into this loop if only one vanishing tetrad; */&lt;BR /&gt;
	IF nrow(tetlabel) &amp;gt; 1 THEN DO;&lt;BR /&gt;
&lt;BR /&gt;
		temp33 = sweep(SigmaTemp);&lt;BR /&gt;
		temp33 = temp33||J(NROW(temp33),1,0);&lt;BR /&gt;
&lt;BR /&gt;
		DO i = 1 to NROW(temp33);&lt;BR /&gt;
			IF sum(abs(temp33[i,])) &amp;lt;&amp;gt; 0 THEN tetlabel[i,10]=1;&lt;BR /&gt;
		END;&lt;BR /&gt;
&lt;BR /&gt;
		/* Now drop the zero rows and columns (singular); */&lt;BR /&gt;
		temp5 = J(1,NCOL(temp33),0);&lt;BR /&gt;
&lt;BR /&gt;
		DO i = 1 to NROW(temp33);&lt;BR /&gt;
			IF sum(abs(temp33[i,])) &amp;lt;&amp;gt; 0 THEN DO;&lt;BR /&gt;
				temp5 = temp5 // temp33[i,1:NCOL(temp33)];&lt;BR /&gt;
			END;&lt;BR /&gt;
		END;&lt;BR /&gt;
		temp2 = J(NROW(temp5),1,0);&lt;BR /&gt;
		DO i = 1 to NCOL(temp5);&lt;BR /&gt;
			IF sum(abs(temp5[,i])) &amp;lt;&amp;gt; 0 THEN DO;&lt;BR /&gt;
				temp2 = temp2 || temp5[1:NROW(temp5),i];&lt;BR /&gt;
			END;&lt;BR /&gt;
		END;&lt;BR /&gt;
&lt;BR /&gt;
		SigmaTemp2 = temp2[2:NROW(temp2),2:NCOL(temp2)];&lt;BR /&gt;
&lt;BR /&gt;
		/* Keep the nonredundant tetrads; */&lt;BR /&gt;
		DO i = 1 to NROW(tetlabel);&lt;BR /&gt;
			IF tetlabel[i,10]=1 then DO;&lt;BR /&gt;
				temptet= tetlabel[i,];&lt;BR /&gt;
				tetlab4 = tetlab4//temptet;&lt;BR /&gt;
				tetlab5 = tetlab5//tetres[i,1];&lt;BR /&gt;
			END;&lt;BR /&gt;
		END;&lt;BR /&gt;
		tetlabel = tetlab4[,1:9];&lt;BR /&gt;
		tetres = tetlab5;&lt;BR /&gt;
	END;&lt;BR /&gt;
	ELSE DO;&lt;BR /&gt;
		tetlabel = tetlabel[,1:9];&lt;BR /&gt;
	END;&lt;BR /&gt;
	FREE Sigmatemp Temp33 Temp5 Temp2 SigmaTemp2 Temptet Tetlab4 Tetlab5;&lt;BR /&gt;
&lt;BR /&gt;
	/*&lt;BR /&gt;
	*********************************************************************;&lt;BR /&gt;
	*Now use the SWEEP results on the original covariance matrix of tetrads&lt;BR /&gt;
	*to get the model fit for the larger model;&lt;BR /&gt;
	*********************************************************************;&lt;BR /&gt;
	*/&lt;BR /&gt;
	/* find unique covariances among non-redundant tetrads */&lt;BR /&gt;
	tetlabel2 = J(NROW(tetlabel),.5*(NCOL(tetlabel)-1),'aaaa');&lt;BR /&gt;
	DO i = 1 to NROW(tetlabel);&lt;BR /&gt;
		k = 0;&lt;BR /&gt;
		DO j = 1 to 7 BY 2;&lt;BR /&gt;
			k = k+1;&lt;BR /&gt;
			IF tetlabel[i,j] &amp;lt; 10 &amp;amp; tetlabel[i,j+1] &amp;lt; 10 THEN &lt;BR /&gt;
				tetlabel2[i,k] = ROWCATC('0'||CHAR(tetlabel[i,j+1])||'0'||CHAR(tetlabel[i,j]));&lt;BR /&gt;
			ELSE DO;&lt;BR /&gt;
				IF tetlabel[i,j] &amp;gt;= 10 &amp;amp; tetlabel[i,j+1]&amp;gt;=10 THEN &lt;BR /&gt;
					tetlabel2[i,k] = ROWCATC(CHAR(tetlabel[i,j+1])||CHAR(tetlabel[i,j]));&lt;BR /&gt;
				ELSE IF tetlabel[i,j] &amp;gt;= 10 THEN&lt;BR /&gt;
						tetlabel2[i,k] = ROWCATC('0'||CHAR(tetlabel[i,j+1])||CHAR(tetlabel[i,j]));&lt;BR /&gt;
					ELSE tetlabel2[i,k] = ROWCATC(CHAR(tetlabel[i,j+1])||'0'||CHAR(tetlabel[i,j]));&lt;BR /&gt;
			END;&lt;BR /&gt;
		END;&lt;BR /&gt;
	END;&lt;BR /&gt;
&lt;BR /&gt;
	tetcov = UNIQUE(SHAPE(tetlabel2,1)); /* row vector of unique covariances; */&lt;BR /&gt;
&lt;BR /&gt;
	/*&lt;BR /&gt;
	**************************************************************************;&lt;BR /&gt;
     	 construct derivative matrix: d &lt;BR /&gt;
	**************************************************************************;&lt;BR /&gt;
	*/&lt;BR /&gt;
	D = J(NCOL(tetcov),NROW(tetlabel2),0);&lt;BR /&gt;
	DO i = 1 to NCOL(tetcov);&lt;BR /&gt;
		DO j = 1 to NROW(tetlabel2);&lt;BR /&gt;
			IF tetcov[,i] = tetlabel2[j,1]&lt;BR /&gt;
				THEN D[i,j] = SAMPMAT[tetlabel[j,3],tetlabel[j,4]];&lt;BR /&gt;
			IF tetcov[,i] = tetlabel2[j,2]&lt;BR /&gt;
				THEN D[i,j] = SAMPMAT[tetlabel[j,1],tetlabel[j,2]];&lt;BR /&gt;
			IF tetcov[,i] = tetlabel2[j,3]&lt;BR /&gt;
				THEN D[i,j] = -1*SAMPMAT[tetlabel[j,7],tetlabel[j,8]];&lt;BR /&gt;
			IF tetcov[,i] = tetlabel2[j,4]&lt;BR /&gt;
				THEN D[i,j] = -1*SAMPMAT[tetlabel[j,5],tetlabel[j,6]];&lt;BR /&gt;
		END;&lt;BR /&gt;
	END;&lt;BR /&gt;
&lt;BR /&gt;
	/* compute asymptotic covariance matrix of the covariances -- normal theory estimator;&lt;BR /&gt;
	Skip this if bringing in an outside polychoric matrix; */&lt;BR /&gt;
&lt;BR /&gt;
	IF &amp;amp;lisrel = 0 &amp;amp; &amp;amp;mplus = 0 THEN DO;&lt;BR /&gt;
		SigmaS = J(NCOL(tetcov),NCOL(tetcov),0);&lt;BR /&gt;
		DO i = 1 to NCOL(tetcov);&lt;BR /&gt;
			DO j = 1 to NCOL(tetcov);&lt;BR /&gt;
				e = NUM(SUBSTR(tetcov[,i],1,2));&lt;BR /&gt;
				f = NUM(SUBSTR(tetcov[,i],3,2));&lt;BR /&gt;
				g = NUM(SUBSTR(tetcov[,j],1,2));&lt;BR /&gt;
				h = NUM(SUBSTR(tetcov[,j],3,2));&lt;BR /&gt;
				/* This calculates it for a correlation matrix; */&lt;BR /&gt;
				IF corr = 1 THEN DO;&lt;BR /&gt;
				SigmaS[i,j] = (1/2)&lt;BR /&gt;
                    	* (SAMPMAT[e,f]*SAMPMAT[g,h])&lt;BR /&gt;
                    	* (SAMPMAT[e,g]**2 + SAMPMAT[e,h]**2 + SAMPMAT[f,g]**2 + SAMPMAT[f,h]**2)&lt;BR /&gt;
                    	+ SAMPMAT[e,g]*SAMPMAT[f,h] + SAMPMAT[e,h]*SAMPMAT[f,g]&lt;BR /&gt;
                    	- SAMPMAT[e,f]*(SAMPMAT[f,g]*SAMPMAT[f,h]+SAMPMAT[e,g]*SAMPMAT[e,h])&lt;BR /&gt;
                    	- SAMPMAT[g,h]*(SAMPMAT[f,g]*SAMPMAT[e,g]+SAMPMAT[f,h]*SAMPMAT[e,h]);&lt;BR /&gt;
				END;&lt;BR /&gt;
				/* This calculates it for a covariance matrix; */&lt;BR /&gt;
				ELSE DO;&lt;BR /&gt;
				SigmaS[i,j] = SAMPMAT[e,g]*SAMPMAT[f,h] + SAMPMAT[e,h]*SAMPMAT[f,g];&lt;BR /&gt;
				END;&lt;BR /&gt;
			END;&lt;BR /&gt;
		END;&lt;BR /&gt;
	END;&lt;BR /&gt;
	ELSE DO;&lt;BR /&gt;
		/* Read in the ACM from LISREL or M-Plus; */&lt;BR /&gt;
		temp1 = J(1,NCOL(acmcov),0);&lt;BR /&gt;
		DO i = 1 TO NCOL(acmcov);&lt;BR /&gt;
			DO j = 1 TO NCOL(tetcov);&lt;BR /&gt;
				IF acmcov[1,i] = tetcov[1,j] THEN temp1[1,i]=i;&lt;BR /&gt;
			END;&lt;BR /&gt;
		END;&lt;BR /&gt;
		acmdrop = J(1,1,0);&lt;BR /&gt;
		DO i = 1 TO NCOL(acmcov);&lt;BR /&gt;
			IF temp1[1,i] &amp;gt; 0 THEN acmdrop = acmdrop||temp1[1,i];&lt;BR /&gt;
		END;&lt;BR /&gt;
		acmdrop2 = acmdrop[,2:NCOL(acmdrop)];&lt;BR /&gt;
&lt;BR /&gt;
		/* Use the ACM brought in at the top; */&lt;BR /&gt;
		SigmaS = symmat[acmdrop2,acmdrop2];&lt;BR /&gt;
		FREE temp1 acmdrop acmdrop2;&lt;BR /&gt;
	END;&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
	/* Perform Test */&lt;BR /&gt;
	SigmaT = D`*SigmaS*D; &lt;BR /&gt;
	df = NROW(SigmaT);&lt;BR /&gt;
	Chi = &amp;amp;N*(tetres`*INV(SigmaT)*tetres);&lt;BR /&gt;
	p = 1-PROBCHI(Chi,df);&lt;BR /&gt;
		IF &amp;amp;nesttest = 1 THEN PRINT "Tetrad Test for Model with more vanishing tetrads";&lt;BR /&gt;
		ELSE PRINT "Tetrad Test for the Model";&lt;BR /&gt;
	PRINT Chi[label='Chi-Square'] df[label='df'] p[label='p-value']; &lt;BR /&gt;
&lt;BR /&gt;
	Chibig = chi;&lt;BR /&gt;
	dfbig = df;&lt;BR /&gt;
	pbig = p;&lt;BR /&gt;
&lt;BR /&gt;
	/* This collects the randomization results by replication if testing just one model */&lt;BR /&gt;
	IF &amp;amp;reps &amp;gt; 1 &amp;amp; &amp;amp;nesttest = 0 THEN DO;&lt;BR /&gt;
		IF r = 1 THEN DO;&lt;BR /&gt;
			results = r||chibig||dfbig||pbig; &lt;BR /&gt;
			clabel = {'replication' '      chi' '  df' '  p'};&lt;BR /&gt;
		END;&lt;BR /&gt;
		ELSE DO;&lt;BR /&gt;
			represult = r||chibig||dfbig||pbig;&lt;BR /&gt;
			results = results//represult;&lt;BR /&gt;
		END;&lt;BR /&gt;
	END;&lt;BR /&gt;
&lt;BR /&gt;
	FREE SigmaT SigmaS D;&lt;BR /&gt;
&lt;BR /&gt;
/*&lt;BR /&gt;
*****************************************************************;&lt;BR /&gt;
*Now run the smaller model;&lt;BR /&gt;
*****************************************************************;&lt;BR /&gt;
*/&lt;BR /&gt;
IF &amp;amp;nesttest = 1 &amp;amp; zerotet = 0 THEN DO;&lt;BR /&gt;
&lt;BR /&gt;
	tetlabel = tetlabel_small;&lt;BR /&gt;
	tetres = tetres_small;&lt;BR /&gt;
&lt;BR /&gt;
	/* find unique covariances among non-redundant tetrads */&lt;BR /&gt;
	tetlabel2 = J(NROW(tetlabel),.5*(NCOL(tetlabel)),'aaaa');&lt;BR /&gt;
	DO i = 1 to NROW(tetlabel);&lt;BR /&gt;
		k = 0;&lt;BR /&gt;
		DO j = 1 to 7 BY 2;&lt;BR /&gt;
			k = k+1;&lt;BR /&gt;
			IF tetlabel[i,j] &amp;lt; 10 &amp;amp; tetlabel[i,j+1] &amp;lt; 10 THEN &lt;BR /&gt;
				tetlabel2[i,k] = ROWCATC('0'||CHAR(tetlabel[i,j+1])||'0'||CHAR(tetlabel[i,j]));&lt;BR /&gt;
			ELSE DO;&lt;BR /&gt;
				IF tetlabel[i,j] &amp;gt;= 10 &amp;amp; tetlabel[i,j+1]&amp;gt;=10 THEN &lt;BR /&gt;
					tetlabel2[i,k] = ROWCATC(CHAR(tetlabel[i,j+1])||CHAR(tetlabel[i,j]));&lt;BR /&gt;
				ELSE IF tetlabel[i,j] &amp;gt;= 10 THEN&lt;BR /&gt;
						tetlabel2[i,k] = ROWCATC('0'||CHAR(tetlabel[i,j+1])||CHAR(tetlabel[i,j]));&lt;BR /&gt;
					ELSE tetlabel2[i,k] = ROWCATC(CHAR(tetlabel[i,j+1])||'0'||CHAR(tetlabel[i,j]));&lt;BR /&gt;
			END;&lt;BR /&gt;
		END;&lt;BR /&gt;
	END;&lt;BR /&gt;
	tetcov = UNIQUE(SHAPE(tetlabel2,1)); /* row vector of unique covariances; */&lt;BR /&gt;
&lt;BR /&gt;
	/*&lt;BR /&gt;
	**************************************************************************;&lt;BR /&gt;
    	  construct derivative matrix: d &lt;BR /&gt;
	**************************************************************************;&lt;BR /&gt;
	*/&lt;BR /&gt;
	D = J(NCOL(tetcov),NROW(tetlabel2),0);&lt;BR /&gt;
	DO i = 1 to NCOL(tetcov);&lt;BR /&gt;
		DO j = 1 to NROW(tetlabel2);&lt;BR /&gt;
			IF tetcov[,i] = tetlabel2[j,1]&lt;BR /&gt;
				THEN D[i,j] = SAMPMAT[tetlabel[j,3],tetlabel[j,4]];&lt;BR /&gt;
			IF tetcov[,i] = tetlabel2[j,2]&lt;BR /&gt;
				THEN D[i,j] = SAMPMAT[tetlabel[j,1],tetlabel[j,2]];&lt;BR /&gt;
			IF tetcov[,i] = tetlabel2[j,3]&lt;BR /&gt;
				THEN D[i,j] = -1*SAMPMAT[tetlabel[j,7],tetlabel[j,8]];&lt;BR /&gt;
			IF tetcov[,i] = tetlabel2[j,4]&lt;BR /&gt;
				THEN D[i,j] = -1*SAMPMAT[tetlabel[j,5],tetlabel[j,6]];&lt;BR /&gt;
		END;&lt;BR /&gt;
	END;&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
	/* compute asymptotic covariance matrix of the covariances -- normal theory estimator;&lt;BR /&gt;
	Skip this if bringing in an outside polychoric matrix; */&lt;BR /&gt;
&lt;BR /&gt;
	IF &amp;amp;lisrel = 0 &amp;amp; &amp;amp;mplus = 0 THEN DO;&lt;BR /&gt;
		SigmaS = J(NCOL(tetcov),NCOL(tetcov),0);&lt;BR /&gt;
		DO i = 1 to NCOL(tetcov);&lt;BR /&gt;
			DO j = 1 to NCOL(tetcov);&lt;BR /&gt;
				e = NUM(SUBSTR(tetcov[,i],1,2));&lt;BR /&gt;
				f = NUM(SUBSTR(tetcov[,i],3,2));&lt;BR /&gt;
				g = NUM(SUBSTR(tetcov[,j],1,2));&lt;BR /&gt;
				h = NUM(SUBSTR(tetcov[,j],3,2));&lt;BR /&gt;
				/* This calculates it for a correlation matrix; */&lt;BR /&gt;
				IF corr = 1 THEN DO;&lt;BR /&gt;
				SigmaS[i,j] = (1/2)&lt;BR /&gt;
                    	* (SAMPMAT[e,f]*SAMPMAT[g,h])&lt;BR /&gt;
                    	* (SAMPMAT[e,g]**2 + SAMPMAT[e,h]**2 + SAMPMAT[f,g]**2 + SAMPMAT[f,h]**2)&lt;BR /&gt;
                    	+ SAMPMAT[e,g]*SAMPMAT[f,h] + SAMPMAT[e,h]*SAMPMAT[f,g]&lt;BR /&gt;
                    	- SAMPMAT[e,f]*(SAMPMAT[f,g]*SAMPMAT[f,h]+SAMPMAT[e,g]*SAMPMAT[e,h])&lt;BR /&gt;
                    	- SAMPMAT[g,h]*(SAMPMAT[f,g]*SAMPMAT[e,g]+SAMPMAT[f,h]*SAMPMAT[e,h]);&lt;BR /&gt;
				END;&lt;BR /&gt;
				/* This calculates it for a covariance matrix; */&lt;BR /&gt;
				ELSE DO;&lt;BR /&gt;
				SigmaS[i,j] = SAMPMAT[e,g]*SAMPMAT[f,h] + SAMPMAT[e,h]*SAMPMAT[f,g];&lt;BR /&gt;
				END;&lt;BR /&gt;
			END;&lt;BR /&gt;
		END;&lt;BR /&gt;
	END;&lt;BR /&gt;
	ELSE DO;&lt;BR /&gt;
		/* Read in the ACM from LISREL or M-Plus; */&lt;BR /&gt;
		temp1 = J(1,NCOL(acmcov),0);&lt;BR /&gt;
		DO i = 1 TO NCOL(acmcov);&lt;BR /&gt;
			DO j = 1 TO NCOL(tetcov);&lt;BR /&gt;
				IF acmcov[1,i] = tetcov[1,j] THEN temp1[1,i]=i;&lt;BR /&gt;
			END;&lt;BR /&gt;
		END;&lt;BR /&gt;
		acmdrop = J(1,1,0);&lt;BR /&gt;
		DO i = 1 TO NCOL(acmcov);&lt;BR /&gt;
			IF temp1[1,i] &amp;gt; 0 THEN acmdrop = acmdrop||temp1[1,i];&lt;BR /&gt;
		END;&lt;BR /&gt;
		acmdrop2 = acmdrop[,2:NCOL(acmdrop)];&lt;BR /&gt;
&lt;BR /&gt;
		/* Use the ACM brought in at the top; */&lt;BR /&gt;
		SigmaS = symmat[acmdrop2,acmdrop2];&lt;BR /&gt;
	END;&lt;BR /&gt;
&lt;BR /&gt;
	/* Perform Test */&lt;BR /&gt;
	SigmaT = D`*SigmaS*D; &lt;BR /&gt;
	df = NROW(SigmaT);&lt;BR /&gt;
	Chi = &amp;amp;N*(tetres`*INV(SigmaT)*tetres);&lt;BR /&gt;
	p = 1-PROBCHI(Chi,df);&lt;BR /&gt;
	PRINT "Tetrad Test for Model with fewer Vanishing tetrads";&lt;BR /&gt;
	PRINT Chi[label='Chi-Square'] df[label='df'] p[label='p-value']; &lt;BR /&gt;
	Chitest = Chibig - Chi;&lt;BR /&gt;
	dftest = dfbig - df;&lt;BR /&gt;
	ptest = 1-PROBCHI(Chitest,dftest);&lt;BR /&gt;
	PRINT "Nested Tetrad Test for two models";&lt;BR /&gt;
	PRINT Chitest[label='Chi-Square'] dftest[label='df'] ptest[label='p-value']; &lt;BR /&gt;
&lt;BR /&gt;
	/* This collects the randomization results by replication */&lt;BR /&gt;
	IF &amp;amp;reps &amp;gt; 1 THEN DO;&lt;BR /&gt;
		IF r = 1 THEN DO;&lt;BR /&gt;
			results = r||chibig||dfbig||pbig||chi||df||p||chitest||dftest||ptest; &lt;BR /&gt;
			clabel = {'  reps' ' big-chi' 'big-df' '  big-p' 'small-chi' 'small-df' ' small-p' 'test-chi' 'test-df' ' test-p'};&lt;BR /&gt;
		END;&lt;BR /&gt;
		ELSE DO;&lt;BR /&gt;
			represult = r||chibig||dfbig||pbig||chi||df||p||chitest||dftest||ptest;&lt;BR /&gt;
			results = results//represult;&lt;BR /&gt;
		END;&lt;BR /&gt;
	END;&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
END;&lt;BR /&gt;
&lt;BR /&gt;
FINISH;&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
/********************************************************************************/&lt;BR /&gt;
/*  MODULE:  MAIN    									                        */&lt;BR /&gt;
/*  LAST MODIFIED:  6/5/2003                                                   */&lt;BR /&gt;
/*  																		  	*/&lt;BR /&gt;
/*  Gives requisite matrices, sample size, loops through Tetrad module			*/&lt;BR /&gt;
/********************************************************************************/&lt;BR /&gt;
&lt;BR /&gt;
START;&lt;BR /&gt;
&lt;BR /&gt;
/* Setting a dummy to check for models implying NO vanishing tetrads; */&lt;BR /&gt;
zerotet = 0;&lt;BR /&gt;
N = &amp;amp;N;&lt;BR /&gt;
notnest = 99;&lt;BR /&gt;
matswitch = 99;&lt;BR /&gt;
&lt;BR /&gt;
IF &amp;amp;lisrel = 1 | &amp;amp;mplus = 1 THEN DO;&lt;BR /&gt;
	use acm1;&lt;BR /&gt;
	read all into c1;&lt;BR /&gt;
	&lt;BR /&gt;
	s=J(1,1,0);                              /*Set up dummy row for concatenation */&lt;BR /&gt;
	DO i=1 to ncol(c1);&lt;BR /&gt;
		IF c1&lt;I&gt; =0 then&lt;BR /&gt;
    	DO;&lt;BR /&gt;
		&lt;BR /&gt;
		END;                        /*Do nothing on these zero-ones, but don't advance counter */&lt;BR /&gt;
		ELSE IF c1&lt;I&gt; =1 then&lt;BR /&gt;
    	DO;&lt;BR /&gt;
&lt;BR /&gt;
		END;&lt;BR /&gt;
    	ELSE DO;&lt;BR /&gt;
		s = s//c1&lt;I&gt;;&lt;BR /&gt;
		END;&lt;BR /&gt;
	END;&lt;BR /&gt;
	FREE c1;&lt;BR /&gt;
	s = s[2:NROW(s),];				/*Removing dummy row; */&lt;BR /&gt;
&lt;BR /&gt;
	/* Multiply this by N for the M-Plus ACM; */&lt;BR /&gt;
	IF &amp;amp;mplus = 1 THEN DO;&lt;BR /&gt;
		s2 = s*&amp;amp;N;&lt;BR /&gt;
		s = s2;&lt;BR /&gt;
	END;&lt;BR /&gt;
		&lt;BR /&gt;
	/*Now convert this vector into a square ACM matrix to use in CTA; */&lt;BR /&gt;
	ssize = (&amp;amp;vars*(&amp;amp;vars-1)/2);&lt;BR /&gt;
	acm=J(ssize,ssize,0);&lt;BR /&gt;
	ct = 1;&lt;BR /&gt;
	DO i=1 to nrow(acm);&lt;BR /&gt;
    	DO j=1 to nrow(acm);&lt;BR /&gt;
        	IF i &amp;lt; j then DO;&lt;BR /&gt;
        		acm[i,j] = 0;&lt;BR /&gt;
        	END;&lt;BR /&gt;
    		ELSE DO;&lt;BR /&gt;
        		acm[i,j] = s[ct];&lt;BR /&gt;
        		ct = ct + 1;&lt;BR /&gt;
        	END;&lt;BR /&gt;
    	END;&lt;BR /&gt;
	END;&lt;BR /&gt;
	/*Symmetrize this matrix; */&lt;BR /&gt;
 	symmat=acm+acm`;&lt;BR /&gt;
	DO i=1 to nrow(symmat);&lt;BR /&gt;
    	DO j=1 to nrow(symmat);&lt;BR /&gt;
			IF i=j then symmat[i,j]= symmat[i,j]/ 2;&lt;BR /&gt;
		END;&lt;BR /&gt;
	END;&lt;BR /&gt;
END;&lt;BR /&gt;
FREE ssize acm;&lt;BR /&gt;
&lt;BR /&gt;
IF &amp;amp;pchor = 1 THEN DO;&lt;BR /&gt;
	/*Bringing in the file of the Polychoric Matrix; */&lt;BR /&gt;
	use pchor1;&lt;BR /&gt;
	read all into d1a;&lt;BR /&gt;
&lt;BR /&gt;
	/*Now convert this vector into a square matrix to use in CTA; */&lt;BR /&gt;
	pcm=J(&amp;amp;vars,&amp;amp;vars,0);&lt;BR /&gt;
	ct = 1;&lt;BR /&gt;
	DO i=1 to nrow(pcm);&lt;BR /&gt;
    	DO j=1 to nrow(pcm);&lt;BR /&gt;
        	IF i &amp;lt; j then DO;&lt;BR /&gt;
        		/*Do nothing, since already a 0 value; */&lt;BR /&gt;
        	END;&lt;BR /&gt;
    		ELSE DO;&lt;BR /&gt;
        		pcm[i,j] = d1a[ct];&lt;BR /&gt;
        		ct = ct + 1;&lt;BR /&gt;
        	END;&lt;BR /&gt;
    	END;&lt;BR /&gt;
	END;&lt;BR /&gt;
&lt;BR /&gt;
	/*Symmetrize this matrix; */&lt;BR /&gt;
 	SAMPMAT=pcm+pcm`;&lt;BR /&gt;
	DO i=1 to nrow(SAMPMAT);&lt;BR /&gt;
    	DO j=1 to nrow(SAMPMAT);&lt;BR /&gt;
			IF i=j then SAMPMAT[i,j]= SAMPMAT[i,j]/ 2;&lt;BR /&gt;
		END;&lt;BR /&gt;
	END;&lt;BR /&gt;
FREE d1a pcm;&lt;BR /&gt;
END;&lt;BR /&gt;
ELSE DO;&lt;BR /&gt;
&lt;BR /&gt;
	/* Convert the SAMPMAT1 vector into a square matrix to use in CTA; */&lt;BR /&gt;
	/* Symmetrize this matrix, if not already symmetric; */&lt;BR /&gt;
&lt;BR /&gt;
	use t;&lt;BR /&gt;
	read all into SAMPMAT1;&lt;BR /&gt;
&lt;BR /&gt;
	IF NCOL(SAMPMAT1) = (&amp;amp;vars*(&amp;amp;vars+1)/2) THEN DO;&lt;BR /&gt;
	/* IF lowdiag = 1 THEN DO; */&lt;BR /&gt;
		SAMPMAT=J(&amp;amp;vars,&amp;amp;vars,0);&lt;BR /&gt;
		ct = 1;&lt;BR /&gt;
		DO i=1 to nrow(SAMPMAT);&lt;BR /&gt;
    		DO j=1 to nrow(SAMPMAT);&lt;BR /&gt;
        		IF i &amp;lt; j then DO;&lt;BR /&gt;
        			SAMPMAT[i,j] = 0;&lt;BR /&gt;
        		END;&lt;BR /&gt;
    			ELSE DO;&lt;BR /&gt;
        			SAMPMAT[i,j] = SAMPMAT1[ct];&lt;BR /&gt;
        			ct = ct + 1;&lt;BR /&gt;
        		END;&lt;BR /&gt;
    		END;&lt;BR /&gt;
		END;&lt;BR /&gt;
		tempmat=sampmat+sampmat`;&lt;BR /&gt;
		DO i=1 to nrow(tempmat);&lt;BR /&gt;
    		DO j=1 to nrow(tempmat);&lt;BR /&gt;
				IF i=j then tempmat[i,j]= tempmat[i,j]/ 2;&lt;BR /&gt;
			END;&lt;BR /&gt;
		END;&lt;BR /&gt;
		SAMPMAT = tempmat;&lt;BR /&gt;
		FREE tempmat;&lt;BR /&gt;
	END;&lt;BR /&gt;
	ELSE IF NCOL(SAMPMAT1) = &amp;amp;vars * &amp;amp;vars THEN DO;&lt;BR /&gt;
		/* Convert this vector into a square matrix to use in CTA; */&lt;BR /&gt;
		SAMPMAT=J(&amp;amp;vars,&amp;amp;vars,0);&lt;BR /&gt;
		ct = 1;&lt;BR /&gt;
		DO i=1 to nrow(SAMPMAT);&lt;BR /&gt;
    		DO j=1 to nrow(SAMPMAT);&lt;BR /&gt;
       			SAMPMAT[i,j] = SAMPMAT1[ct];&lt;BR /&gt;
       			ct = ct + 1;&lt;BR /&gt;
    		END;&lt;BR /&gt;
		END;&lt;BR /&gt;
	END;&lt;BR /&gt;
	ELSE DO;&lt;BR /&gt;
		PRINT "The sample matrix entered does not conform to the # of variables specified";&lt;BR /&gt;
	END;&lt;BR /&gt;
END;&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
/*Model implied cov matrix for the model with MORE vanishing tetrads;&lt;BR /&gt;
Convert the IMPMAT1B vector into a square matrix to use in CTA;&lt;BR /&gt;
Symmetrize this matrix, if not already symmetric; */&lt;BR /&gt;
&lt;BR /&gt;
use imp1;&lt;BR /&gt;
read all into IMPMAT1B; &lt;BR /&gt;
&lt;BR /&gt;
IF NCOL(IMPMAT1B) = (&amp;amp;vars*(&amp;amp;vars+1)/2) THEN DO;&lt;BR /&gt;
/*IF lowdiag = 1 THEN DO; */&lt;BR /&gt;
	IMPMAT1A=J(&amp;amp;vars,&amp;amp;vars,0);&lt;BR /&gt;
	ct = 1;&lt;BR /&gt;
	DO i=1 to nrow(IMPMAT1A);&lt;BR /&gt;
   		DO j=1 to nrow(IMPMAT1A);&lt;BR /&gt;
       		IF i &amp;lt; j then DO;&lt;BR /&gt;
       			IMPMAT1A[i,j] = 0;&lt;BR /&gt;
       		END;&lt;BR /&gt;
   			ELSE DO;&lt;BR /&gt;
       			IMPMAT1A[i,j] = IMPMAT1B[ct];&lt;BR /&gt;
       			ct = ct + 1;&lt;BR /&gt;
       		END;&lt;BR /&gt;
   		END;&lt;BR /&gt;
	END;&lt;BR /&gt;
	tempmat=IMPMAT1A+IMPMAT1A`;&lt;BR /&gt;
	DO i=1 to nrow(tempmat);&lt;BR /&gt;
   		DO j=1 to nrow(tempmat);&lt;BR /&gt;
			IF i=j then tempmat[i,j]= tempmat[i,j]/ 2;&lt;BR /&gt;
		END;&lt;BR /&gt;
	END;&lt;BR /&gt;
	IMPMAT1A = tempmat;&lt;BR /&gt;
END;&lt;BR /&gt;
ELSE IF NCOL(IMPMAT1B) = &amp;amp;vars * &amp;amp;vars THEN DO;&lt;BR /&gt;
	/*Convert this vector into a square matrix to use in CTA; */&lt;BR /&gt;
	IMPMAT1A=J(&amp;amp;vars,&amp;amp;vars,0);&lt;BR /&gt;
	ct = 1;&lt;BR /&gt;
	DO i=1 to nrow(IMPMAT1A);&lt;BR /&gt;
   		DO j=1 to nrow(IMPMAT1A);&lt;BR /&gt;
      			IMPMAT1A[i,j] = IMPMAT1B[ct];&lt;BR /&gt;
      			ct = ct + 1;&lt;BR /&gt;
   		END;&lt;BR /&gt;
	END;&lt;BR /&gt;
END;&lt;BR /&gt;
ELSE DO;&lt;BR /&gt;
	PRINT "The first model implied covariance matrix entered does not conform to the # of variables specified";&lt;BR /&gt;
END;&lt;BR /&gt;
&lt;BR /&gt;
/*Make the implied matrix a correlation matrix; */&lt;BR /&gt;
tempdiag = J(NROW(IMPMAT1A),NCOL(IMPMAT1A),0);&lt;BR /&gt;
DO i = 1 to NROW(IMPMAT1A);&lt;BR /&gt;
	DO j = 1 to NCOL(IMPMAT1A);&lt;BR /&gt;
		IF i = j THEN tempdiag[i,j]=1/sqrt(IMPMAT1A[i,j]);&lt;BR /&gt;
	END;&lt;BR /&gt;
END;&lt;BR /&gt;
IMPMAT = tempdiag*IMPMAT1A*tempdiag;&lt;BR /&gt;
&lt;BR /&gt;
/* Now adjust the magnitude of this matrix; */&lt;BR /&gt;
DO i = 1 to NROW(IMPMAT);&lt;BR /&gt;
	DO j = 1 to NCOL(IMPMAT);&lt;BR /&gt;
		IMPMAT[i,j]=IMPMAT[i,j]*.005;&lt;BR /&gt;
	END;&lt;BR /&gt;
END;&lt;BR /&gt;
FREE tempmat tempdiag IMPMAT1A IMPMAT1B;&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
/* Model implied cov matrix for the model with FEWER vanishing tetrads;&lt;BR /&gt;
Convert this vector into a square matrix to use in CTA;&lt;BR /&gt;
Symmetrize this matrix, if not already symmetric; */&lt;BR /&gt;
&lt;BR /&gt;
use imp2;&lt;BR /&gt;
read all into IMPMAT2B;&lt;BR /&gt;
&lt;BR /&gt;
IF NCOL(IMPMAT2B) = (&amp;amp;vars*(&amp;amp;vars+1)/2) THEN DO;&lt;BR /&gt;
/*IF lowdiag = 1 THEN DO; */&lt;BR /&gt;
	IMPMAT2A=J(&amp;amp;vars,&amp;amp;vars,0);&lt;BR /&gt;
	ct = 1;&lt;BR /&gt;
	DO i=1 to nrow(IMPMAT2A);&lt;BR /&gt;
   		DO j=1 to nrow(IMPMAT2A);&lt;BR /&gt;
       		IF i &amp;lt; j then DO;&lt;BR /&gt;
       			IMPMAT2A[i,j] = 0;&lt;BR /&gt;
       		END;&lt;BR /&gt;
   			ELSE DO;&lt;BR /&gt;
       			IMPMAT2A[i,j] = IMPMAT2B[ct];&lt;BR /&gt;
       			ct = ct + 1;&lt;BR /&gt;
       		END;&lt;BR /&gt;
   		END;&lt;BR /&gt;
	END;&lt;BR /&gt;
	tempmat=IMPMAT2A+IMPMAT2A`;&lt;BR /&gt;
	DO i=1 to nrow(tempmat);&lt;BR /&gt;
   		DO j=1 to nrow(tempmat);&lt;BR /&gt;
			IF i=j then tempmat[i,j]= tempmat[i,j]/ 2;&lt;BR /&gt;
		END;&lt;BR /&gt;
	END;&lt;BR /&gt;
	IMPMAT2A = tempmat;&lt;BR /&gt;
END;&lt;BR /&gt;
ELSE IF NCOL(IMPMAT2B) = &amp;amp;vars * &amp;amp;vars THEN DO;&lt;BR /&gt;
	/*Convert this vector into a square matrix to use in CTA; */&lt;BR /&gt;
	IMPMAT2A=J(&amp;amp;vars,&amp;amp;vars,0);&lt;BR /&gt;
	ct = 1;&lt;BR /&gt;
	DO i=1 to nrow(IMPMAT2A);&lt;BR /&gt;
   		DO j=1 to nrow(IMPMAT2A);&lt;BR /&gt;
      			IMPMAT2A[i,j] = IMPMAT2B[ct];&lt;BR /&gt;
      			ct = ct + 1;&lt;BR /&gt;
   		END;&lt;BR /&gt;
	END;&lt;BR /&gt;
END;&lt;BR /&gt;
ELSE DO;&lt;BR /&gt;
	PRINT "The second model implied covariance matrix entered does not conform to the # of variables specified";&lt;BR /&gt;
END;&lt;BR /&gt;
&lt;BR /&gt;
/*Make the implied matrix a correlation matrix; */&lt;BR /&gt;
tempdiag = J(NROW(IMPMAT2A),NCOL(IMPMAT2A),0);&lt;BR /&gt;
DO i = 1 to NROW(IMPMAT2A);&lt;BR /&gt;
	DO j = 1 to NCOL(IMPMAT2A);&lt;BR /&gt;
		IF i = j THEN tempdiag[i,j]=1/sqrt(IMPMAT2A[i,j]);&lt;BR /&gt;
	END;&lt;BR /&gt;
END;&lt;BR /&gt;
IMPMAT2 = tempdiag*IMPMAT2A*tempdiag;&lt;BR /&gt;
&lt;BR /&gt;
/* Now adjust the magnitude of this matrix; */&lt;BR /&gt;
DO i = 1 to NROW(IMPMAT2);&lt;BR /&gt;
	DO j = 1 to NCOL(IMPMAT2);&lt;BR /&gt;
		IMPMAT2[i,j]=IMPMAT2[i,j]*.005;&lt;BR /&gt;
	END;&lt;BR /&gt;
END;&lt;BR /&gt;
FREE IMPMAT2B IMPMAT2a tempmat tempdiag;&lt;BR /&gt;
&lt;BR /&gt;
CORR = 0;&lt;BR /&gt;
IF SUM(DIAG(SAMPMAT))=NCOL(SAMPMAT) THEN CORR = 1;&lt;BR /&gt;
&lt;BR /&gt;
k = NCOL(SAMPMAT);&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
/* computing sample tetrad residuals */&lt;BR /&gt;
tetres = {0}; tetlabel = {0 0 0 0 0 0 0 0};&lt;BR /&gt;
DO a = 1 to k;&lt;BR /&gt;
	DO b = a+1 to k;&lt;BR /&gt;
		DO c = b+1 to k;&lt;BR /&gt;
			DO d = c+1 to k;&lt;BR /&gt;
			/* NOTE: the 3rd and 4th elements of the 2nd and 3rd tetrads should be reversed to &lt;BR /&gt;
			allow calculating the SE's correctly down below--but then would need to sort&lt;BR /&gt;
			the elements within the tetrads at a later point; */&lt;BR /&gt;
			tetres = tetres//(SAMPMAT[a,b]*SAMPMAT[c,d] - SAMPMAT[a,c]*SAMPMAT[b,d]);&lt;BR /&gt;
			tetlabel = tetlabel//(a||b||c||d||a||c||b||d);&lt;BR /&gt;
			tetres = tetres//(SAMPMAT[a,c]*SAMPMAT[b,d] - SAMPMAT[a,d]*SAMPMAT[b,c]);&lt;BR /&gt;
			tetlabel = tetlabel//(a||c||b||d||a||d||b||c);&lt;BR /&gt;
			tetres = tetres//(SAMPMAT[a,b]*SAMPMAT[c,d] - SAMPMAT[a,d]*SAMPMAT[b,c]);&lt;BR /&gt;
			tetlabel = tetlabel//(a||b||c||d||a||d||b||c);&lt;BR /&gt;
			END;&lt;BR /&gt;
		END;&lt;BR /&gt;
	END;&lt;BR /&gt;
END;&lt;BR /&gt;
tetres = tetres[2:NROW(tetres),];&lt;BR /&gt;
tetlabel = tetlabel[2:NROW(tetlabel),];&lt;BR /&gt;
&lt;BR /&gt;
/* computing implied tetrad residuals */&lt;BR /&gt;
tetresI = {0};&lt;BR /&gt;
DO a = 1 to k;&lt;BR /&gt;
	DO b = a+1 to k;&lt;BR /&gt;
		DO c = b+1 to k;&lt;BR /&gt;
			DO d = c+1 to k;&lt;BR /&gt;
 			tetresI = tetresI//(IMPMAT[a,b]*IMPMAT[c,d] - IMPMAT[a,c]*IMPMAT[b,d]);&lt;BR /&gt;
			tetresI = tetresI//(IMPMAT[a,c]*IMPMAT[b,d] - IMPMAT[a,d]*IMPMAT[b,c]);&lt;BR /&gt;
			tetresI = tetresI//(IMPMAT[a,b]*IMPMAT[c,d] - IMPMAT[a,d]*IMPMAT[b,c]);&lt;BR /&gt;
			END;&lt;BR /&gt;
		END;&lt;BR /&gt;
	END;&lt;BR /&gt;
END;&lt;BR /&gt;
tetresI = tetresI[2:NROW(tetresI),];&lt;BR /&gt;
&lt;BR /&gt;
/* computing implied tetrad residuals for RESTRICTED model*/&lt;BR /&gt;
tetresI2 = {0};&lt;BR /&gt;
DO a = 1 to k;&lt;BR /&gt;
	DO b = a+1 to k;&lt;BR /&gt;
		DO c = b+1 to k;&lt;BR /&gt;
			DO d = c+1 to k;&lt;BR /&gt;
 			tetresI2 = tetresI2//(IMPMAT2[a,b]*IMPMAT2[c,d] - IMPMAT2[a,c]*IMPMAT2[b,d]);&lt;BR /&gt;
			tetresI2 = tetresI2//(IMPMAT2[a,c]*IMPMAT2[b,d] - IMPMAT2[a,d]*IMPMAT2[b,c]);&lt;BR /&gt;
			tetresI2 = tetresI2//(IMPMAT2[a,b]*IMPMAT2[c,d] - IMPMAT2[a,d]*IMPMAT2[b,c]);&lt;BR /&gt;
			END;&lt;BR /&gt;
		END;&lt;BR /&gt;
	END;&lt;BR /&gt;
END;&lt;BR /&gt;
tetresI2 = tetresI2[2:NROW(tetresI2),];&lt;BR /&gt;
&lt;BR /&gt;
/* This is used when bringing in an external asymptotic cov matrix; */&lt;BR /&gt;
acmlabel = J(NROW(tetlabel),.5*(NCOL(tetlabel)),'aaaa');&lt;BR /&gt;
i = 1;&lt;BR /&gt;
DO i = 1 to NROW(tetlabel);&lt;BR /&gt;
	k = 0;&lt;BR /&gt;
	DO j = 1 to 7 BY 2;&lt;BR /&gt;
		k = k+1;&lt;BR /&gt;
		IF tetlabel[i,j] &amp;lt; 10 &amp;amp; tetlabel[i,j+1] &amp;lt; 10 THEN DO;&lt;BR /&gt;
			acmlabel[i,k] = ROWCATC('0'||CHAR(tetlabel[i,j+1])||'0'||CHAR(tetlabel[i,j]));&lt;BR /&gt;
		END;&lt;BR /&gt;
		ELSE DO;&lt;BR /&gt;
			IF tetlabel[i,j] &amp;gt;= 10 &amp;amp; tetlabel[i,j+1]&amp;gt;=10 THEN&lt;BR /&gt;
				acmlabel[i,k] = ROWCATC(CHAR(tetlabel[i,j+1])||CHAR(tetlabel[i,j]));&lt;BR /&gt;
			ELSE DO;&lt;BR /&gt;
				IF tetlabel[i,j] &amp;gt;= 10 THEN&lt;BR /&gt;
					acmlabel[i,k] = ROWCATC('0'||CHAR(tetlabel[i,j+1])||CHAR(tetlabel[i,j]));&lt;BR /&gt;
				ELSE acmlabel[i,k] = ROWCATC(CHAR(tetlabel[i,j+1])||'0'||CHAR(tetlabel[i,j]));&lt;BR /&gt;
			END;&lt;BR /&gt;
		END;&lt;BR /&gt;
	END;&lt;BR /&gt;
END;&lt;BR /&gt;
acmcov = UNIQUE(SHAPE(acmlabel,1)); *row vector of unique covariances;&lt;BR /&gt;
FREE acmlabel;&lt;BR /&gt;
&lt;BR /&gt;
/* find model-implied vanishing tetrads &amp;amp; calculate t-values */&lt;BR /&gt;
i = 1;&lt;BR /&gt;
DO i = 1 to NROW(tetlabel);&lt;BR /&gt;
 a = tetlabel[i,1]; b = tetlabel[i,2]; c = tetlabel[i,3]; d = tetlabel[i,4];&lt;BR /&gt;
 IF MOD(i,3) = 2 THEN DO;&lt;BR /&gt;
 	temp = c; c = d; d = temp;&lt;BR /&gt;
 END;&lt;BR /&gt;
 IF MOD(i,3) = 0 THEN DO;&lt;BR /&gt;
 	temp = c; c = d; d = temp;&lt;BR /&gt;
 END;&lt;BR /&gt;
 AVari = 1/&amp;amp;N*(Impmat[b,d]**2 * Impmat[a,a] * Impmat[c,c] + &lt;BR /&gt;
              Impmat[a,c]**2 * Impmat[d,d] * Impmat[b,b] + &lt;BR /&gt;
			  Impmat[c,d]**2 * Impmat[a,a] * Impmat[b,b] +&lt;BR /&gt;
              Impmat[a,b]**2 * Impmat[d,d] * Impmat[c,c] +&lt;BR /&gt;
              2*(Impmat[b,d]*Impmat[a,c]*Impmat[a,d]*Impmat[b,c] -&lt;BR /&gt;
                 Impmat[b,d]*Impmat[c,d]*Impmat[a,a]*Impmat[b,c] -&lt;BR /&gt;
                 Impmat[b,d]*Impmat[a,b]*Impmat[a,d]*Impmat[c,c] -&lt;BR /&gt;
                 Impmat[a,c]*Impmat[c,d]*Impmat[a,d]*Impmat[b,b] -&lt;BR /&gt;
                 Impmat[a,c]*Impmat[a,b]*Impmat[d,d]*Impmat[b,c] +&lt;BR /&gt;
                 Impmat[c,d]*Impmat[a,b]*Impmat[a,d]*Impmat[b,c]) +&lt;BR /&gt;
              2*((Impmat[b,d]*Impmat[a,c]-Impmat[a,b]*Impmat[c,d])**2));&lt;BR /&gt;
 IF i = 1 THEN AVAR = Avari;&lt;BR /&gt;
 ELSE AVar = Avar//Avari;&lt;BR /&gt;
END;&lt;BR /&gt;
FREE Avari;&lt;BR /&gt;
&lt;BR /&gt;
/* find model-implied vanishing tetrads for model with FEWER vanishing tetrads &lt;BR /&gt;
		&amp;amp; calculate t-values */&lt;BR /&gt;
i = 1;&lt;BR /&gt;
DO i = 1 to NROW(tetlabel);&lt;BR /&gt;
 a = tetlabel[i,1]; b = tetlabel[i,2]; c = tetlabel[i,3]; d = tetlabel[i,4];&lt;BR /&gt;
 IF MOD(i,3) = 2 THEN DO;&lt;BR /&gt;
 	temp = c; c = d; d = temp;&lt;BR /&gt;
 END;&lt;BR /&gt;
 IF MOD(i,3) = 0 THEN DO;&lt;BR /&gt;
 	temp = c; c = d; d = temp;&lt;BR /&gt;
 END;&lt;BR /&gt;
 AVari2 = 1/&amp;amp;N*(Impmat2[b,d]**2 * Impmat2[a,a] * Impmat2[c,c] + &lt;BR /&gt;
              Impmat2[a,c]**2 * Impmat2[d,d] * Impmat2[b,b] + &lt;BR /&gt;
			  Impmat2[c,d]**2 * Impmat2[a,a] * Impmat2[b,b] +&lt;BR /&gt;
              Impmat2[a,b]**2 * Impmat2[d,d] * Impmat2[c,c] +&lt;BR /&gt;
              2*(Impmat2[b,d]*Impmat2[a,c]*Impmat2[a,d]*Impmat2[b,c] -&lt;BR /&gt;
                 Impmat2[b,d]*Impmat2[c,d]*Impmat2[a,a]*Impmat2[b,c] -&lt;BR /&gt;
                 Impmat2[b,d]*Impmat2[a,b]*Impmat2[a,d]*Impmat2[c,c] -&lt;BR /&gt;
                 Impmat2[a,c]*Impmat2[c,d]*Impmat2[a,d]*Impmat2[b,b] -&lt;BR /&gt;
                 Impmat2[a,c]*Impmat2[a,b]*Impmat2[d,d]*Impmat2[b,c] +&lt;BR /&gt;
                 Impmat2[c,d]*Impmat2[a,b]*Impmat2[a,d]*Impmat2[b,c]) +&lt;BR /&gt;
              2*((Impmat2[b,d]*Impmat2[a,c]-Impmat2[a,b]*Impmat2[c,d])**2));&lt;BR /&gt;
 IF i = 1 THEN AVAR2 = Avari2;&lt;BR /&gt;
 ELSE AVar2 = Avar2//Avari2;&lt;BR /&gt;
END;&lt;BR /&gt;
FREE AVari2;&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
/* This section is used for nested tetrad tests; */&lt;BR /&gt;
IF &amp;amp;nesttest = 1 THEN DO;&lt;BR /&gt;
	/* Check whether the models are tetrad nested, and which is bigger; */&lt;BR /&gt;
	temp1 = J(1,1,0);&lt;BR /&gt;
	temp2 = J(1,1,0);&lt;BR /&gt;
	temp3 = J(1,1,0);&lt;BR /&gt;
	difftet = J(1,NCOL(tetlabel)+2,0);&lt;BR /&gt;
	badtet = J(1,NCOL(tetlabel)+2,0);&lt;BR /&gt;
&lt;BR /&gt;
	tvalueI = J(NROW(tetresI),3,0);&lt;BR /&gt;
	DO i = 1 to NROW(tvalueI);&lt;BR /&gt;
		tvalueI[i,1]= tetresI[i,1];&lt;BR /&gt;
		tvalueI[i,2]= AVar[i,1];&lt;BR /&gt;
		tvalueI[i,3]=tvalueI[i,1]/sqrt(tvalueI[i,2]);&lt;BR /&gt;
	END;&lt;BR /&gt;
&lt;BR /&gt;
	tvalueI2 = J(NROW(tetresI2),3,0);&lt;BR /&gt;
	DO i = 1 to NROW(tvalueI2);&lt;BR /&gt;
		tvalueI2[i,1]= tetresI2[i,1];&lt;BR /&gt;
		tvalueI2[i,2]= AVar2[i,1];&lt;BR /&gt;
		tvalueI2[i,3]=tvalueI2[i,1]/sqrt(tvalueI2[i,2]);&lt;BR /&gt;
	END;&lt;BR /&gt;
	DO i = 1 to NROW(tetlabel);&lt;BR /&gt;
		/* This is the t-value criterion for defining as vanishing (keep non-vanishing);&lt;BR /&gt;
		This loop finds vanishing tetrads in the first model but not in the second one; */&lt;BR /&gt;
&lt;BR /&gt;
		IF ABS(tvalueI[i,3]) &amp;lt; 0.001 &amp;amp; ABS(tvalueI2[i,3]) &amp;gt;= 0.001 THEN DO;&lt;BR /&gt;
			temp1 = temp1 || i;&lt;BR /&gt;
			temptet = tetlabel[i,]||tvalueI[i,3]||tvalueI2[i,3];&lt;BR /&gt;
			difftet = difftet // temptet;&lt;BR /&gt;
		END;&lt;BR /&gt;
		/* This loop finds vanishing tetrads in the second model but not in the first one; */&lt;BR /&gt;
		IF ABS(tvalueI[i,3]) &amp;gt;= 0.001 &amp;amp; ABS(tvalueI2[i,3]) &amp;lt; 0.001 THEN DO;&lt;BR /&gt;
			temp2 = temp2 || i;&lt;BR /&gt;
			temptet2 = tetlabel[i,]||tvalueI[i,3]||tvalueI2[i,3];&lt;BR /&gt;
			badtet = badtet // temptet2;&lt;BR /&gt;
		END;&lt;BR /&gt;
		/* This loop finds vanishing tetrads implied by both models; */&lt;BR /&gt;
		IF ABS(tvalueI[i,3]) &amp;lt; 0.001 &amp;amp; ABS(tvalueI2[i,3]) &amp;lt; 0.001 THEN DO;&lt;BR /&gt;
			temp3 = temp3 || i;&lt;BR /&gt;
		END;&lt;BR /&gt;
	END;&lt;BR /&gt;
&lt;BR /&gt;
	/* **Find ERROR in specification (not nested); */&lt;BR /&gt;
	notnest = 0;&lt;BR /&gt;
	if NCOL(temp1) &amp;gt;= 2 &amp;amp; NCOL(temp2) &amp;gt;=2 then do;&lt;BR /&gt;
		notnest = 1;&lt;BR /&gt;
	END;&lt;BR /&gt;
&lt;BR /&gt;
	if NCOL(temp1) = 1 &amp;amp; NCOL(temp2) = 1 &amp;amp; NCOL(temp3) &amp;gt;=2 then do;&lt;BR /&gt;
		notnest = 2;&lt;BR /&gt;
	END;&lt;BR /&gt;
&lt;BR /&gt;
	if NCOL(temp1) = 1 &amp;amp; NCOL(temp3) = 1 then do;&lt;BR /&gt;
		notnest = 3;&lt;BR /&gt;
		zerotet = 1;&lt;BR /&gt;
	END;&lt;BR /&gt;
&lt;BR /&gt;
	if NCOL(temp2) = 1 &amp;amp; NCOL(temp3) = 1 then do;&lt;BR /&gt;
		notnest = 4;&lt;BR /&gt;
		zerotet = 1;&lt;BR /&gt;
	END;&lt;BR /&gt;
&lt;BR /&gt;
	/* These are models in which the order of the model implied cov's was reversed between smaller &lt;BR /&gt;
	and larger models, so need to flip them here to correct operator error; */&lt;BR /&gt;
&lt;BR /&gt;
	matswitch = 0;&lt;BR /&gt;
	if NCOL(temp1) = 1 &amp;amp; NCOL(temp2) &amp;gt;=2 then do;&lt;BR /&gt;
		matswitch = 1;&lt;BR /&gt;
		temp21 = AVar2;&lt;BR /&gt;
		temp22 = tetresI2;&lt;BR /&gt;
		temp23 = IMPMAT2;&lt;BR /&gt;
		AVar2 = AVar;&lt;BR /&gt;
		tetresI2 = tetresI;&lt;BR /&gt;
		IMPMAT2 = IMPMAT;&lt;BR /&gt;
		AVar = temp21;&lt;BR /&gt;
		tetresI = temp22;&lt;BR /&gt;
		IMPMAT = temp23;&lt;BR /&gt;
	END;&lt;BR /&gt;
END;&lt;BR /&gt;
FREE temp1 temp2 temp3 difftet badtet temp21 temp22 temp23;&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
/* Combining the residuals with the implied tetrads and computing t-values; */&lt;BR /&gt;
tvalueI = J(NROW(tetresI),6,0);&lt;BR /&gt;
DO i = 1 to NROW(tvalueI);&lt;BR /&gt;
	tvalueI[i,1]= tetresI[i,1];&lt;BR /&gt;
	tvalueI[i,2]= AVar[i,1];&lt;BR /&gt;
	tvalueI[i,3]=tvalueI[i,1]/sqrt(tvalueI[i,2]);&lt;BR /&gt;
	tvalueI[i,4]= tetresI2[i,1];&lt;BR /&gt;
	tvalueI[i,5]= AVar2[i,1];&lt;BR /&gt;
	tvalueI[i,6]=tvalueI[i,4]/sqrt(tvalueI[i,5]);&lt;BR /&gt;
END;&lt;BR /&gt;
&lt;BR /&gt;
/* Computing the variances for the sample tetrads; */&lt;BR /&gt;
DO i = 1 to NROW(tetlabel);&lt;BR /&gt;
 a = tetlabel[i,1]; b = tetlabel[i,2]; c = tetlabel[i,3]; d = tetlabel[i,4];&lt;BR /&gt;
 IF MOD(i,3) = 2 THEN DO;&lt;BR /&gt;
 	temp = c; c = d; d = temp;&lt;BR /&gt;
 END;&lt;BR /&gt;
 IF MOD(i,3) = 0 THEN DO;&lt;BR /&gt;
 	temp = c; c = d; d = temp;&lt;BR /&gt;
 END;&lt;BR /&gt;
&lt;BR /&gt;
         AVars = (1/N) *&lt;BR /&gt;
               (Sampmat[d,b]*Sampmat[d,b]*Sampmat[a,a]*Sampmat[c,c] +&lt;BR /&gt;
                Sampmat[a,c]*Sampmat[a,c]*Sampmat[d,d]*Sampmat[b,b] +&lt;BR /&gt;
                Sampmat[d,c]*Sampmat[d,c]*Sampmat[a,a]*Sampmat[b,b] +&lt;BR /&gt;
                Sampmat[a,b]*Sampmat[a,b]*Sampmat[d,d]*Sampmat[c,c] +&lt;BR /&gt;
            2 *(Sampmat[d,b]*Sampmat[a,c]*Sampmat[a,d]*Sampmat[b,c] -&lt;BR /&gt;
                Sampmat[d,b]*Sampmat[d,c]*Sampmat[a,a]*Sampmat[b,c] -&lt;BR /&gt;
                Sampmat[d,b]*Sampmat[a,b]*Sampmat[a,d]*Sampmat[c,c] -&lt;BR /&gt;
                Sampmat[a,c]*Sampmat[d,c]*Sampmat[d,a]*Sampmat[b,b] -&lt;BR /&gt;
                Sampmat[a,c]*Sampmat[a,b]*Sampmat[d,d]*Sampmat[b,c] +&lt;BR /&gt;
                Sampmat[d,c]*Sampmat[a,b]*Sampmat[a,d]*Sampmat[b,c])+&lt;BR /&gt;
           2 *((Sampmat[d,b]*Sampmat[a,c]-Sampmat[a,b]*Sampmat[d,c])**2));&lt;BR /&gt;
&lt;BR /&gt;
IF i = 1 THEN AVart = Avars;&lt;BR /&gt;
 ELSE AVart = Avart//Avars;&lt;BR /&gt;
END;&lt;BR /&gt;
FREE AVars;&lt;BR /&gt;
/* Combining the residuals with the tetrads and computing t-values; */&lt;BR /&gt;
tvalue = J(NROW(tetres),3,0);&lt;BR /&gt;
do i = 1 to NROW(tvalue);&lt;BR /&gt;
	tvalue[i,1]= tetres[i,1];&lt;BR /&gt;
	tvalue[i,2]= AVart[i,1];&lt;BR /&gt;
	tvalue[i,3]=tvalue[i,1]/sqrt(tvalue[i,2]);&lt;BR /&gt;
END;&lt;BR /&gt;
&lt;BR /&gt;
/* Now keep the tetrads that are implied vanishing by the model; */&lt;BR /&gt;
tetlabel = tetlabel||tvalueI;&lt;BR /&gt;
tetres = tetres||tvalueI;&lt;BR /&gt;
temp1 = J(1,8,0);&lt;BR /&gt;
temp2 = J(1,1,0);&lt;BR /&gt;
temp3 = J(1,8,0);&lt;BR /&gt;
temp4 = J(1,1,0);&lt;BR /&gt;
temp5 = J(1,8,0);&lt;BR /&gt;
temp6 = J(1,1,0);&lt;BR /&gt;
&lt;BR /&gt;
DO i = 1 to NROW(tetlabel);&lt;BR /&gt;
	/* This is the t-value criterion for defining as vanishing (keep non-vanishing);&lt;BR /&gt;
	This loop finds all vanishing tetrads; */&lt;BR /&gt;
	IF ABS(tetlabel[i,11]) &amp;lt; 0.001 THEN DO;&lt;BR /&gt;
		temp1 = temp1 // tetlabel[i,1:8];&lt;BR /&gt;
		temp2 = temp2 // tetres[i,1];&lt;BR /&gt;
	END;&lt;BR /&gt;
	/* This loop finds vanishing tetrads in the larger model but not in the smaller one; */&lt;BR /&gt;
	IF ABS(tetlabel[i,11]) &amp;lt; 0.001 &amp;amp; ABS(tetlabel[i,14]) &amp;gt;= 0.001 THEN DO;&lt;BR /&gt;
		temp3 = temp3 // tetlabel[i,1:8];&lt;BR /&gt;
		temp4 = temp4 // tetres[i,1];&lt;BR /&gt;
	END;&lt;BR /&gt;
	/* This loop finds vanishing tetrads implied by both models; */&lt;BR /&gt;
	IF ABS(tetlabel[i,11]) &amp;lt; 0.001 &amp;amp; ABS(tetlabel[i,14]) &amp;lt; 0.001 THEN DO;&lt;BR /&gt;
		temp5 = temp5 // tetlabel[i,1:8];&lt;BR /&gt;
		temp6 = temp6 // tetres[i,1];&lt;BR /&gt;
	END;&lt;BR /&gt;
END;&lt;BR /&gt;
&lt;BR /&gt;
/*Comparing nested models--- Check that they are nested; */&lt;BR /&gt;
notnest2 = 0;&lt;BR /&gt;
IF &amp;amp;nesttest = 1 &amp;amp; NROW(temp3) = 1 THEN DO;&lt;BR /&gt;
	notnest2 = 1;&lt;BR /&gt;
END;&lt;BR /&gt;
IF NROW(temp1) = 1 THEN DO;&lt;BR /&gt;
	print "There are no vanishing tetrads in either model";&lt;BR /&gt;
	/* FIX THIS */&lt;BR /&gt;
	/* NEED TO JUMP OUT OF THE PROGRAM AT THIS POINT */&lt;BR /&gt;
END;&lt;BR /&gt;
ELSE IF &amp;amp;nesttest = 1 THEN DO;&lt;BR /&gt;
	temp3 = temp3[2:NROW(temp3),];&lt;BR /&gt;
	temp4 = temp4[2:NROW(temp4),];&lt;BR /&gt;
END;&lt;BR /&gt;
ELSE DO;&lt;BR /&gt;
	/* This is the non-nested test: so keep all of its tetrads (temp1 and temp2); */&lt;BR /&gt;
	temp3 = temp1[2:NROW(temp1),];&lt;BR /&gt;
	temp4 = temp2[2:NROW(temp2),];&lt;BR /&gt;
END;&lt;BR /&gt;
IF &amp;amp;nesttest = 1 &amp;amp; zerotet = 0 THEN DO;&lt;BR /&gt;
	tetlabel = temp5[2:NROW(temp5),];&lt;BR /&gt;
	tetres = temp6[2:NROW(temp6),];&lt;BR /&gt;
END;&lt;BR /&gt;
/* This is a nested test where one model has NO vanishing tetrads; */&lt;BR /&gt;
ELSE IF &amp;amp;nesttest = 1 &amp;amp; zerotet = 1 THEN DO;&lt;BR /&gt;
	tetlabel = temp3;&lt;BR /&gt;
	tetres = temp4;&lt;BR /&gt;
END;&lt;BR /&gt;
ELSE DO;&lt;BR /&gt;
	/* This is a non-nested test; */&lt;BR /&gt;
	tetlabel_nonnest = temp3;&lt;BR /&gt;
	tetres_nonnest = temp4;&lt;BR /&gt;
	initlabel_nonnest = tetlabel_nonnest;&lt;BR /&gt;
	initres_nonnest = tetres_nonnest; &lt;BR /&gt;
END;&lt;BR /&gt;
/* Don't free up temp3 temp4 yet, as they are needed below; */&lt;BR /&gt;
FREE temp1 temp2 temp5 temp6;&lt;BR /&gt;
	if notnest2 = 1 then print "These models are NOT nested---same # of df";&lt;BR /&gt;
	if matswitch = 0 then print "Model implied matrices are in correct order";&lt;BR /&gt;
	if matswitch = 1 then print "NOTE: Model implied matrices were incorrectly entered for large and small models---they have been reversed";&lt;BR /&gt;
	if notnest = 0 then print "Models are tetrad nested";&lt;BR /&gt;
	if notnest = 1 then print "ERROR:  These models are NOT tetrad nested.  Nested test is INAPPROPRIATE";&lt;BR /&gt;
	if notnest = 2 then print "ERROR:  These models contain the same tetrads.  Nested test is INAPPROPRIATE";&lt;BR /&gt;
	if notnest = 3 then print "NOTE:  The first model contains no tetrads; tetrad chi-square for first model also represents nested test";&lt;BR /&gt;
	if notnest = 4 then print "NOTE:  The second model contains no tetrads; tetrad chi-square for first model also represents nested test";&lt;BR /&gt;
&lt;BR /&gt;
initlabel = tetlabel;&lt;BR /&gt;
initres = tetres;&lt;BR /&gt;
&lt;BR /&gt;
DO r = 1 to &amp;amp;reps;&lt;BR /&gt;
	RUN TETRAD;&lt;BR /&gt;
END;&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
/* Fixing the formatting of the output */&lt;BR /&gt;
IF &amp;amp;reps &amp;gt; 1 THEN DO;&lt;BR /&gt;
	resultsch = J(NROW(results),NCOL(results),'aaaaaaaaa');&lt;BR /&gt;
	IF &amp;amp;nesttest = 1 THEN DO;&lt;BR /&gt;
		DO q = 1 to NROW(results);&lt;BR /&gt;
			resultsch[q,] = CHAR(results[q,1],4,0)||CHAR(results[q,2],8,2)||CHAR(results[q,3],4,0)||&lt;BR /&gt;
			CHAR(results[q,4],8,4)||CHAR(results[q,5],8,2)||CHAR(results[q,6],4,0)||CHAR(results[q,7],8,4)&lt;BR /&gt;
			||CHAR(results[q,8],8,2)||CHAR(results[q,9],4,0)||CHAR(results[q,10],8,4);&lt;BR /&gt;
		END;&lt;BR /&gt;
  	END;&lt;BR /&gt;
  	ELSE DO;&lt;BR /&gt;
		DO q = 1 to NROW(results);&lt;BR /&gt;
			resultsch[q,] = CHAR(results[q,1],4,0)||CHAR(results[q,2],8,2)||CHAR(results[q,3],4,0)||&lt;BR /&gt;
			CHAR(results[q,4],8,4);&lt;BR /&gt;
		END;&lt;BR /&gt;
	END;&lt;BR /&gt;
END;&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
IF &amp;amp;reps &amp;gt; 1 THEN DO;&lt;BR /&gt;
	PRINT Resultsch[label='results' colname=clabel];&lt;BR /&gt;
	CREATE Outfile FROM RESULTS[colname=clabel];&lt;BR /&gt;
		APPEND FROM RESULTS;&lt;BR /&gt;
END;&lt;BR /&gt;
&lt;BR /&gt;
FINISH;&lt;BR /&gt;
RUN;&lt;BR /&gt;
QUIT;&lt;BR /&gt;
&lt;BR /&gt;
%mend ctanest1;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;</description>
      <pubDate>Thu, 04 Jun 2009 07:06:57 GMT</pubDate>
      <guid>https://communities.sas.com/t5/ODS-and-Base-Reporting/reads-the-macro-but-doesn-t-give-the-output/m-p/40950#M5595</guid>
      <dc:creator>deleted_user</dc:creator>
      <dc:date>2009-06-04T07:06:57Z</dc:date>
    </item>
    <item>
      <title>Re: reads the macro but doesn't give the output</title>
      <link>https://communities.sas.com/t5/ODS-and-Base-Reporting/reads-the-macro-but-doesn-t-give-the-output/m-p/40951#M5596</link>
      <description>Start with adding macro compilation debugging logic:&lt;BR /&gt;
&lt;BR /&gt;
OPTIONS SOURCE SOURCE2 MACROGEN SYMBOLGEN MLOGIC;&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
Scott Barry&lt;BR /&gt;
SBBWorks, Inc.</description>
      <pubDate>Thu, 04 Jun 2009 11:33:30 GMT</pubDate>
      <guid>https://communities.sas.com/t5/ODS-and-Base-Reporting/reads-the-macro-but-doesn-t-give-the-output/m-p/40951#M5596</guid>
      <dc:creator>sbb</dc:creator>
      <dc:date>2009-06-04T11:33:30Z</dc:date>
    </item>
    <item>
      <title>Re: reads the macro but doesn't give the output</title>
      <link>https://communities.sas.com/t5/ODS-and-Base-Reporting/reads-the-macro-but-doesn-t-give-the-output/m-p/40952#M5597</link>
      <description>Hi:&lt;BR /&gt;
  Possibly reading the documentation, written by Dr. Hipp, the author, and published at these UNC sites might help:&lt;BR /&gt;
&lt;BR /&gt;
&lt;A href="http://www.unc.edu/~johnhipp/CTANEST1_documentation.doc" target="_blank"&gt;http://www.unc.edu/~johnhipp/CTANEST1_documentation.doc&lt;/A&gt;&lt;BR /&gt;
&lt;A href="http://www.unc.edu/~dbauer/manuscripts/hipp-bauer-bollen-SEM-2005.pdf" target="_blank"&gt;http://www.unc.edu/~dbauer/manuscripts/hipp-bauer-bollen-SEM-2005.pdf&lt;/A&gt;&lt;BR /&gt;
 &lt;BR /&gt;
cynthia</description>
      <pubDate>Sat, 06 Jun 2009 21:13:39 GMT</pubDate>
      <guid>https://communities.sas.com/t5/ODS-and-Base-Reporting/reads-the-macro-but-doesn-t-give-the-output/m-p/40952#M5597</guid>
      <dc:creator>Cynthia_sas</dc:creator>
      <dc:date>2009-06-06T21:13:39Z</dc:date>
    </item>
  </channel>
</rss>

