* (Q) How can I do an all-subsets regression using SPSS? Whereas a stepwise regression yields one final equation, the goal of all-subsets regression is to perform all possible regressions combination of and then let the user (rather than the stepwise regression) choose the "best" equation. * So, if one had 5 independent variables, the all-subsets regression would perform 5 regressions of each predictor on y, and then work up towards one final regression with all the predictors. The output can be any number of things, such as the r^2 for each equation, but I would rather use the adjusted predicted variables that SPSS can already create. * (A) by rlevesque@videotron.ca 2001/08/30; SPSS Dedicated web site http://pages.infinit.net/rlevesqu/index.htm. * Note: This is a complex syntax but it is very easy to use. See the example at the end. * 3 macros are defined by the syntax, the first of these macros (combine) writes a syntax file which subsequently writes a text file. The text file is read into the data editor and used to write a syntax file consisting of a series of macro calls; each macro call does one of the regressions. SET MPRINT=no. */////////////////////////////. DEFINE !combine (n=!TOKENS(1) /m=!TOKENS(1) /dep=!TOKENS(1) /indepv=!CMDEND). /* Find all combinations on n items out of m */ /* August 30,2001 rlevesque@videotron.ca */ !DO !thisn=1 !TO !n NEW FILE. INPUT PROGRAM. LOOP i=1 TO !thisn. END CASE. END LOOP. END FILE. END INPUT PROGRAM. LIST. !LET !list=!NULL !DO !cnt=1 !TO !thisn !LET !list=!CONCAT(!list," ","j",!cnt) !DOEND COMPUTE n=!thisn. * Calculate variable names for LOOP of the next WRITE command *. STRING cntname cntbeg(A8). COMPUTE cntname=CONCAT('j',LTRIM(STRING(i,F8.0))). * Calculate first parameter for the LOOP of the next WRITE command *. DO IF i=1. COMPUTE cntbeg="1". ELSE. COMPUTE cntbeg=CONCAT('j',LTRIM(STRING(i-1,F8.0))," + 1"). END IF. * Calculate second parameter for the LOOP of the next WRITE command *. COMPUTE k=!m - !thisn + i. FORMATS i k n(F8.0). STRING quote(A1) strlist(A255). COMPUTE quote='"'. COMPUTE strlist=!QUOTE(!list). * Write the syntax file which will store all the combinations in the list.txt file*. WRITE OUTFILE "c:\temp\macro.sps" /"LOOP "cntname"="cntbeg" TO "k".". DO IF i=!thisn. + WRITE OUTFILE "c:\temp\macro.sps" /"WRITE OUTFILE "quote"c:\temp\list.txt"quote "/" strlist "." . + LOOP cnt=1 TO !thisn. + WRITE OUTFILE "c:\temp\macro.sps" /"END LOOP.". + END LOOP. + WRITE OUTFILE "c:\temp\macro.sps" /"EXECUTE.". END IF. EXECUTE. INCLUDE FILE="c:\temp\macro.sps". /* Convert data from list.txt to the corresponding sav file */. DATA LIST FILE='c:\temp\list.txt' LIST /!list. SAVE OUTFILE=!QUOTE(!CONCAT('c:\temp\list',!thisn,'.sav')). !DOEND /* Combine all the sav files */. GET FILE='c:\temp\list1.sav'. !DO !nb=2 !TO !n. ADD FILES FILE=* /FILE=!QUOTE(!CONCAT('c:\temp\list',!nb,'.sav.')). !DOEND /* Eliminate duplicates */. SORT CASES BY ALL. MATCH FILES FILE=* /BY=ALL /FIRST=first. SELECT IF first. SAVE OUTFILE='c:\temp\all combinations.sav'. /* Find name of last variables */ !DO !var !IN (!indepv) !LET !lastone=!var !DOEND VECTOR vnames(!m A8). !LET !cnt=!BLANK(1) /* Create variables containing the names of the indep variables */ !DO !var !IN (!indepv) COMPUTE vnames(!LEN(!cnt))=!QUOTE(!var). !LET !cnt=!CONCAT(!cnt,!BLANK(1)) !DOEND /* Construct the string containing the list of indep var of each regression */. STRING dep (A8) indepv(A255). COMPUTE dep=!QUOTE(!dep). VECTOR j=j1 TO !CONCAT('j',!n) /ind=vnames1 TO !CONCAT('vnames',!m). COMPUTE nvar=NVALID(j1 TO !CONCAT('j',!n)). LOOP cnt=1 TO nvar. COMPUTE indepv=CONCAT(RTRIM(indepv)," ",vnames(j(cnt))). END LOOP. * Write the syntax file which will run all regressions */. WRITE OUTFILE='c:\temp\syntax to do all regressions.sps' /"!regres dep=" dep "indepv=" indepv ".". EXECUTE. !ENDDEFINE. *////////////////////////////. *////////////////////////////. DEFINE !regres (dep=!TOKENS(1) /indepv=!CMDEND) REGRESSION /MISSING LISTWISE /STATISTICS COEFF OUTS R ANOVA /CRITERIA=PIN(.05) POUT(.10) /NOORIGIN /DEPENDENT !dep /METHOD=ENTER !indepv /SAVE ZPRED . !ENDDEFINE. *////////////////////////////. *************************. * EXAMPLE OF USE. *************************. * You have to make any changes you require in the above regression macro *. SET MPRINT=yes. ****** Run the following macro to do the preparatory work. !combine n=4 m=4 dep=y indepv=x1 x2 x3 x4. ****** Load your data file and do the regressions. GET FILE='f:\855web\model.sav'. INCLUDE FILE='c:\temp\syntax to do all regressions.sps'.