* ONEWAY ANOVA with summary data (II): several datasets at the same time. * MATRIX...END MATRIX recognizes SPLIT groups only in batch mode (INCLUDE). * (A) Sample datasets * data list list/testnum(F4.0) groups(A8) n(F5.0) mean(F8.1) sd(F8.3). begin data 1 Control 10 62.8 6.9730 1 Respir 10 70.2 6.2147 1 Metabol 10 79.4 6.2397 1 Mixed 10 80.2 6.1065 2 Control 15 72.8 7.7703 2 Respir 15 80.4 7.3174 2 Metabol 15 89.4 7.4379 2 Mixed 15 90.2 8.1056 end data. * (B) Copy & Save the following syntax as "C:\\Temp\\SummaryANOVA.sps". ******************** SYNTAX STARTS HERE *******************. matrix. * Import data *. get varnum /var=testnum. get names/var=groups. get n/var=n. get mean/var=mean. get sd/var=sd. print /title="-------------------------------------------". print varnum(1) /format="f8.0" /title="Split by:" /clabel="Nr.". /rlabel="Variable" * General calculations *. compute k=nrow(n). compute totaln=msum(n). compute var=sd&**2. compute dfwithin=totaln-k. compute poolvar=msum((n-1)&*var)/dfwithin. * Homogeneity of variances tests *. do if cmax(n)=cmin(n). print /title="Balanced design. Hartley's & Cochran's tests are possible". compute cochran=cmax(var)/msum(var). compute fmax=cmax(var)/cmin(var). print {cmax(var),cmin(var),fmax} /title="Hartley's Fmax test (check with tabulated critical values)" /format="f8.3" /clabels="Max S^2","Min S^2","H value". print cochran /title="Cochran's test (check with tabulated critical values)" /format="f8.3" /clabel="C value". print (n(1)-1) /title="DF for all groups" /format="f8.0". end if. print k /title="Number of groups (K)" /format="f8.0". compute x2=dfwithin*ln(poolvar)-msum((n-1)&*ln(var)). compute cc=1+(msum(1/(n-1))-1/dfwithin)/(3*(k-1)). compute chi2=x2/cc. compute chisig=1-chicdf(chi2,k-1). print {chi2,chisig} /title="Bartlett's Homogeneity of Variances Test (df=K-1)" /format="f8.3" /clabels="Chi^2","Sig.". * Sample & Total descriptives *. compute gmean=(msum(n&*mean))/totaln. compute totsd=sqrt((msum((n-1)&*var+n&*(mean&**2))-(gmean&**2)*totaln)/(totaln-1)). compute eem=sd&/sqrt(n). compute toteem=totsd/sqrt(msum(n)). compute samplecv=100*sd/mean. compute totalcv=100*totsd/gmean. * Altman's 95%CI for means (using MSwithin & DFwithin instead of data from each sample) *. loop tvalue95=1960 to 12706. compute t95=tvalue95/1000. compute onetail=1-tcdf(t95,dfwithin). do if abs(onetail-0.025) lt 0.00005. break. end if. end loop. compute low95=mean-t95*sqrt(poolvar/n). compute upp95=mean+t95*sqrt(poolvar/n). compute lowgmean=gmean-t95*sqrt(poolvar/totaln). compute uppgmean=gmean+t95*sqrt(poolvar/totaln). * Report *. compute names={names;'Total'}. print {n,mean,sd,samplecv,eem,low95,upp95;totaln,gmean,totsd,totalcv,toteem,lowgmean,uppgmean} /title="Descriptives: 95%CI for means (*) " /clabels='N','Mean','Sd','cv(%)','sem','Lower','Upper' /rnames=names /format='F7.2'. * Within groups (residual) CV *. compute cvar=100*sqrt(poolvar)/gmean. print cvar /title="Within-groups coefficient of variation (*)" /format="F5.2" /rlabels="CV(%)=". print /title="(*) Altman's 95%CI and Within-groups CV require homogeneous variances". * Writing data in matrix data format *. compute group=T({1:k}). MSAVE mean /TYPE=MEAN /fnames=group /factor=group /variable=depvar /snames=testnum /split=varnum /outfile=*. MSAVE sd /TYPE=STDDEV /fnames=group /factor=group /variable=depvar /snames=testnum /split=varnum /outfile=*. MSAVE n /TYPE=N /fnames=group /factor=group /variable=depvar /snames=testnum /split=varnum /outfile=*. print /title='Matrix data saved to current data file'. end matrix. **************************** END OF SYNTAX **************************. * (C) Now, we split the file by "testnum" and run the syntax. set mxloop=30000. split file layered by testnum. include "C:\\Temp\\SummaryANOVA.sps". * The last part is to perform a ONEWAY ANOVA for every variable in the dataset. * If ONEWAY with MATRIX DATA as input & SPLIT FILE worked OK, this would be the way of computing the ANOVA for both variables at the same time (as a matter of fact, split file IS activated). * ONEWAY depvar BY group /STATISTICS=DESCRIPTIVES WELCH /POSTHOC=TUKEY T2 /MATRIX=IN(*). *********************************************. * As it doesn't work (SPSS bug?), the solution is a MACRO *. (D) MACRO DEFINITION *. DEFINE !oneway (!POSITIONAL !TOKENS(1)). !DO !cnt=1 !TO !1. TEMPORARY. SELECT IF(testnum = !cnt). * You can replace the POSTHOC tests by your favorites ones. ONEWAY depvar BY group /STATISTICS=DESCRIPTIVES WELCH /POSTHOC=TUKEY T2 /MATRIX=IN(*). !DOEND. !ENDDEFINE. (E) MACRO CALL *. !oneway 2.