1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
* (Q) Find all combinations of n items out of m items.

* (A) by rlevesque@videotron.ca 2001/09/11;
	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 (combina) writes a syntax file 
	which subsequently writes a text file. The text file is read into the data editor and 
	used to write all combinations.


SET MPRINT=no.

*/////////////////////////////.
DEFINE !combine (n=!TOKENS(1) 
	/items=!CMDEND).

/* Find all combinations of n items out of m items*/
/* Sept 11,2001 rlevesque@videotron.ca */

* Count number of variables.
!LET !nb=!NULL
!DO !cnt !IN (!items)
!LET !nb=!CONCAT(!nb,!BLANK(1))
!DOEND
!LET !m=!LENGTH(!nb)



NEW FILE.
INPUT PROGRAM.
LOOP i=1 TO !n.
END CASE.
END LOOP.
END FILE.
END INPUT PROGRAM.
LIST.

!LET !list=!NULL
!DO !cnt=1 !TO !n
	!LET !list=!CONCAT(!list," ","j",!cnt)
!DOEND

COMPUTE n=!n.

* 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 - !n + 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=!n.
+	WRITE OUTFILE "c:\\temp\\macro.sps" 
	/"WRITE OUTFILE "quote"c:\\temp\\list.txt"quote "/" strlist "." .
+	LOOP cnt=1 TO !n.
+		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='c:\\temp\\list1.sav'.

/* 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 (!items)
!LET !lastone=!var
!DOEND

VECTOR vnames(!m A8).
!LET !cnt=!BLANK(1)

/* Create variables containing the names of the items variables */
!DO !var !IN (!items)
COMPUTE vnames(!LEN(!cnt))=!QUOTE(!var).
!LET !cnt=!CONCAT(!cnt,!BLANK(1))
!DOEND

/* Construct the string containing the list of combinations */.
STRING items(A255).
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 items=CONCAT(RTRIM(items)," ",vnames(j(cnt))).
END LOOP.

* Write the syntax file which will call the macro for each desired
	combination of variables.
WRITE OUTFILE='c:\\temp\\mymacro.sps' /'!kendal 'items'.'.
EXECUTE.

!ENDDEFINE.
*////////////////////////////.


*////////////////////////////.
DEFINE !kendal (!POS=!CMDEND)
NPAR TESTS
  /KENDALL = !1
  /MISSING LISTWISE.
!ENDDEFINE.
*////////////////////////////.


*************************.
* EXAMPLES OF USE.
*************************.

SET MPRINT=yes.
* write syntax file which will calculate Kendall for every combinations of 2 variables.
!combine n=2 items=educ jobcat jobtime prevexp minority.

GET FILE='c:\\program files\\spss\\employee data.sav'.
*** Next line does the job ***.
INCLUDE FILE='c:\\temp\\mymacro.sps'.

****** END OF SYNTAX ******.

*********************.
* Comments on above example.
*********************.

All you have to do is replace the line
!combine n=2 items=educ jobcat jobtime prevexp minority.
by the list of the 50 variables in your file then replace the line 

GET FILE='c:\\program files\\spss\\employee data.sav'.
by a line loading you data file.

Everything will be done automatically for you.
In your case, you have only 50 variables it is not a huge task 
to list all of those in macro call. Assuming you have hundreds 
of consecutive variables, you could use the macro defined in 
the syntax file "Define List of Variables between two variables.SPS" 
which is in the "Macro Gems" section of my web site. With this macro, 
you would only have to list the first and last variables in the macro call.