dnl PSPP - a program for statistical analysis.
dnl Copyright (C) 2017 Free Software Foundation, Inc.
dnl
dnl This program is free software: you can redistribute it and/or modify
dnl it under the terms of the GNU General Public License as published by
dnl the Free Software Foundation, either version 3 of the License, or
dnl (at your option) any later version.
dnl
dnl This program is distributed in the hope that it will be useful,
dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
dnl GNU General Public License for more details.
dnl
dnl You should have received a copy of the GNU General Public License
dnl along with this program.  If not, see <http://www.gnu.org/licenses/>.
dnl
AT_BANNER([CROSSTABS procedure])

dnl Based on bug #60982.
AT_SETUP([CROSSTABS residuals])
AT_DATA([crosstabs.sps],
  [DATASET CLOSE ALL.
DATA LIST LIST NOTABLE/ r c n.
BEGIN DATA
1 1 26
1 2 31
2 1 12
2 2 32
3 1 27
3 2 18
4 1 8
4 2 7
END DATA.
WEIGHT by n.
CROSSTABS r by c /STATISTICS=CHISQ
/CELLS=COUNT EXPECTED RESID SRESID ASRESID.
])
AT_CHECK([pspp -O format=csv crosstabs.sps], [0],
  [Table: Summary
,Cases,,,,,
,Valid,,Missing,,Total,
,N,Percent,N,Percent,N,Percent
r × c,161.00,100.0%,.00,.0%,161.00,100.0%

Table: r × c
,,,c,,Total
,,,1.00,2.00,
r,1.00,Count,26.00,31.00,57.00
,,Expected,25.84,31.16,.35
,,Residual,.16,-.16,
,,Std. Residual,.03,-.03,
,,Adjusted Residual,.05,-.05,
,2.00,Count,12.00,32.00,44.00
,,Expected,19.95,24.05,.27
,,Residual,-7.95,7.95,
,,Std. Residual,-1.78,1.62,
,,Adjusted Residual,-2.82,2.82,
,3.00,Count,27.00,18.00,45.00
,,Expected,20.40,24.60,.28
,,Residual,6.60,-6.60,
,,Std. Residual,1.46,-1.33,
,,Adjusted Residual,2.33,-2.33,
,4.00,Count,8.00,7.00,15.00
,,Expected,6.80,8.20,.09
,,Residual,1.20,-1.20,
,,Std. Residual,.46,-.42,
,,Adjusted Residual,.65,-.65,
Total,,Count,73.00,88.00,161.00
,,Expected,.45,.55,1.00

Table: Chi-Square Tests
,Value,df,Asymptotic Sig. (2-tailed)
Pearson Chi-Square,10.09,3.00,.018
Likelihood Ratio,10.35,3.00,.016
Linear-by-Linear Association,1.96,1.00,.162
N of Valid Cases,161.00,,
])
AT_CLEANUP

AT_SETUP([CROSSTABS integer mode crash])
AT_DATA([crosstabs.sps],
  [DATA LIST LIST /A * B * X * Y * .
BEGIN DATA.
2 3 4 5
END DATA.

CROSSTABS VARIABLES X (1,7) Y (1,7) /TABLES X BY Y.
])
AT_CHECK([pspp -o pspp.csv -o pspp.txt crosstabs.sps])
AT_CHECK([cat pspp.csv], [0],
  [[Table: Reading free-form data from INLINE.
Variable,Format
A,F8.0
B,F8.0
X,F8.0
Y,F8.0

Table: Summary
,Cases,,,,,
,Valid,,Missing,,Total,
,N,Percent,N,Percent,N,Percent
X × Y,1,100.0%,0,.0%,1,100.0%

Table: X × Y
,,,Y,,,,,,,Total
,,,1.00,2.00,3.00,4.00,5.00,6.00,7.00,
X,1.00,Count,0,0,0,0,0,0,0,0
,2.00,Count,0,0,0,0,0,0,0,0
,3.00,Count,0,0,0,0,0,0,0,0
,4.00,Count,0,0,0,0,1,0,0,1
,5.00,Count,0,0,0,0,0,0,0,0
,6.00,Count,0,0,0,0,0,0,0,0
,7.00,Count,0,0,0,0,0,0,0,0
Total,,Count,0,0,0,0,1,0,0,1
]])
AT_CLEANUP

# Bug #47600.
AT_SETUP([CROSSTABS integer mode crash 2])
AT_DATA([crosstabs.sps], [dnl
DATA LIST lIST /x y.
BEGIN DATA.
4 5
END DATA.

CROSSTABS
        VARIABLES x (1,3) y (1,7)
      /TABLES x BY y.
])
AT_CHECK([pspp -O format=csv crosstabs.sps], [0],
  [[Table: Reading free-form data from INLINE.
Variable,Format
x,F8.0
y,F8.0

Table: Summary
,Cases,,,,,
,Valid,,Missing,,Total,
,N,Percent,N,Percent,N,Percent
x × y,0,.0%,1,100.0%,1,100.0%

Table: x × y
,,,y,,,,,,,Total
,,,1.00,2.00,3.00,4.00,5.00,6.00,7.00,
x,1.00,Count,,,,,,,,
,2.00,Count,,,,,,,,
,3.00,Count,,,,,,,,
Total,,Count,,,,,,,,
]])
AT_CLEANUP

# Bug #22037.
AT_SETUP([CROSSTABS long string crash])
AT_DATA([crosstabs.sps],
  [data list list /x * y (a18).

begin data.

   1. 'zero none'

1 'one unity'
2 'two duality'
3 'three lots'
end data.

CROSSTABS /TABLES = x BY y.
])
AT_CHECK([pspp -o - -O format=csv -o pspp.txt crosstabs.sps], [0],
  [[Table: Reading free-form data from INLINE.
Variable,Format
x,F8.0
y,A18

"crosstabs.sps:4: warning: Missing value(s) for all variables from x onward.  These will be filled with the system-missing value or blanks, as appropriate."

"crosstabs.sps:6: warning: Missing value(s) for all variables from x onward.  These will be filled with the system-missing value or blanks, as appropriate."

Table: Summary
,Cases,,,,,
,Valid,,Missing,,Total,
,N,Percent,N,Percent,N,Percent
x × y,4,66.7%,2,33.3%,6,100.0%

Table: x × y
,,,y,,,,Total
,,,one unity,three lots,two duality,zero none,
x,1.00,Count,1,0,0,1,2
,2.00,Count,0,0,1,0,1
,3.00,Count,0,1,0,0,1
Total,,Count,1,1,1,1,4
]])
AT_CLEANUP

AT_SETUP([CROSSTABS crash])
AT_DATA([crosstabs.sps],
  [[DATA LIST FIXED
     / x   1-2
       y   3
       z   4.

BEGIN DATA.
0111
0222
0311
0412
0521
0612
0711
0811
0912
END DATA.

LIST.


CROSSTABS TABLES  y by z.
]])
AT_CHECK([pspp -o - -O format=csv -o pspp.txt crosstabs.sps], [0],
  [Table: Reading 1 record from INLINE.
Variable,Record,Columns,Format
x,1,1-2,F2.0
y,1,3-3,F1.0
z,1,4-4,F1.0

Table: Data List
x,y,z
1,1,1
2,2,2
3,1,1
4,1,2
5,2,1
6,1,2
7,1,1
8,1,1
9,1,2

Table: Summary
,Cases,,,,,
,Valid,,Missing,,Total,
,N,Percent,N,Percent,N,Percent
y × z,9,100.0%,0,.0%,9,100.0%

Table: y × z
,,,z,,Total
,,,1,2,
y,1,Count,4,3,7
,2,Count,1,1,2
Total,,Count,5,4,9
])
AT_CLEANUP

# Bug #26739, which caused CROSSTABS to crash or to fail to output
# chi-square results.
AT_SETUP([CROSSTABS chi-square crash])
AT_DATA([crosstabs.sps],
  [[DATA LIST LIST /x * y *.
BEGIN DATA.
2 2
3 1
4 2
4 1
END DATA.

CROSSTABS
        /TABLES= x BY y
        /STATISTICS=CHISQ.
]])
AT_CHECK([pspp -O format=csv crosstabs.sps], [0],
  [[Table: Reading free-form data from INLINE.
Variable,Format
x,F8.0
y,F8.0

Table: Summary
,Cases,,,,,
,Valid,,Missing,,Total,
,N,Percent,N,Percent,N,Percent
x × y,4,100.0%,0,.0%,4,100.0%

Table: x × y
,,,y,,Total
,,,1.00,2.00,
x,2.00,Count,0,1,1
,3.00,Count,1,0,1
,4.00,Count,1,1,2
Total,,Count,2,2,4

Table: Chi-Square Tests
,Value,df,Asymptotic Sig. (2-tailed)
Pearson Chi-Square,2.00,2,.368
Likelihood Ratio,2.77,2,.250
Linear-by-Linear Association,.27,1,.602
N of Valid Cases,4,,
]])
AT_CLEANUP

# Bug #27883.
AT_SETUP([CROSSTABS crash with SPLIT FILE])
AT_DATA([crosstabs.sps],
  [data list notable / v0 to v2 1-6 (A)
begin data.
a c e
a c e
a c e
a d e
a d f
b d f
b d f
b c f
b d e
a c f
end data.
SORT CASES BY v0.
SPLIT FILE SEPARATE BY v0.

CROSSTABS
    /TABLES= v1 BY v2
    /FORMAT=AVALUE TABLES
    /STATISTICS=CHISQ
    /CELLS=COUNT ROW COLUMN TOTAL.
])

AT_CHECK([pspp -o pspp.csv -o pspp.txt crosstabs.sps])
AT_CHECK([cat pspp.csv], [0], [dnl
Table: Split Values
Variable,Value
v0,a

Table: Summary
,Cases,,,,,
,Valid,,Missing,,Total,
,N,Percent,N,Percent,N,Percent
v1 × v2,6,100.0%,0,.0%,6,100.0%

Table: v1 × v2
,,,v2,,Total
,,,e,f,
v1,c,Count,3,1,4
,,Row %,75.0%,25.0%,100.0%
,,Column %,75.0%,50.0%,66.7%
,,Total %,50.0%,16.7%,66.7%
,d,Count,1,1,2
,,Row %,50.0%,50.0%,100.0%
,,Column %,25.0%,50.0%,33.3%
,,Total %,16.7%,16.7%,33.3%
Total,,Count,4,2,6
,,Row %,66.7%,33.3%,100.0%
,,Column %,100.0%,100.0%,100.0%
,,Total %,66.7%,33.3%,100.0%

Table: Chi-Square Tests
,Value,df,Asymptotic Sig. (2-tailed),Exact Sig. (2-tailed),Exact Sig. (1-tailed)
Pearson Chi-Square,.38,1,.540,,
Likelihood Ratio,.37,1,.545,,
Fisher's Exact Test,,,,1.000,.600
Continuity Correction,.00,1,1.000,,
N of Valid Cases,6,,,,

Table: Split Values
Variable,Value
v0,b

Table: Summary
,Cases,,,,,
,Valid,,Missing,,Total,
,N,Percent,N,Percent,N,Percent
v1 × v2,4,100.0%,0,.0%,4,100.0%

Table: v1 × v2
,,,v2,,Total
,,,e,f,
v1,c,Count,0,1,1
,,Row %,.0%,100.0%,100.0%
,,Column %,.0%,33.3%,25.0%
,,Total %,.0%,25.0%,25.0%
,d,Count,1,2,3
,,Row %,33.3%,66.7%,100.0%
,,Column %,100.0%,66.7%,75.0%
,,Total %,25.0%,50.0%,75.0%
Total,,Count,1,3,4
,,Row %,25.0%,75.0%,100.0%
,,Column %,100.0%,100.0%,100.0%
,,Total %,25.0%,75.0%,100.0%

Table: Chi-Square Tests
,Value,df,Asymptotic Sig. (2-tailed),Exact Sig. (2-tailed),Exact Sig. (1-tailed)
Pearson Chi-Square,.44,1,.505,,
Likelihood Ratio,.68,1,.410,,
Fisher's Exact Test,,,,1.000,.750
Continuity Correction,.00,1,1.000,,
N of Valid Cases,4,,,,
])
AT_CLEANUP

# Bug #24752.
AT_SETUP([3-way CROSSTABS])
AT_DATA([crosstabs.sps],
  [[DATA LIST FIXED
     / x   1-2
       y   3
       z   4.

BEGIN DATA.
0111
0222
0311
0412
0521
0612
0711
0811
0912
END DATA.

LIST.


CROSSTABS TABLES  x BY y BY z/STATISTICS=ALL.
]])
AT_CHECK([pspp -o - -O format=csv -o pspp.csv -o pspp.txt crosstabs.sps], [0],
  [Table: Reading 1 record from INLINE.
Variable,Record,Columns,Format
x,1,1-2,F2.0
y,1,3-3,F1.0
z,1,4-4,F1.0

Table: Data List
x,y,z
1,1,1
2,2,2
3,1,1
4,1,2
5,2,1
6,1,2
7,1,1
8,1,1
9,1,2

Table: Summary
,Cases,,,,,
,Valid,,Missing,,Total,
,N,Percent,N,Percent,N,Percent
x × y × z,9,100.0%,0,.0%,9,100.0%

Table: x × y × z
,,,,,y,,Total
,,,,,1,2,
z,1,x,1,Count,1,0,1
,,,3,Count,1,0,1
,,,5,Count,0,1,1
,,,7,Count,1,0,1
,,,8,Count,1,0,1
,,Total,,Count,4,1,5
,2,x,2,Count,0,1,1
,,,4,Count,1,0,1
,,,6,Count,1,0,1
,,,9,Count,1,0,1
,,Total,,Count,3,1,4

Table: Chi-Square Tests
,,,Value,df,Asymptotic Sig. (2-tailed)
z,1,Pearson Chi-Square,5.00,4,.287
,,Likelihood Ratio,5.00,4,.287
,,Linear-by-Linear Association,.01,1,.938
,,N of Valid Cases,5,,
,2,Pearson Chi-Square,4.00,3,.261
,,Likelihood Ratio,4.50,3,.212
,,Linear-by-Linear Association,1.58,1,.209
,,N of Valid Cases,4,,

Table: Symmetric Measures
,,,,Value,Asymp. Std. Error,Approx. T,Approx. Sig.
z,1,Nominal by Nominal,Phi,1.00,,,
,,,Cramer's V,1.00,,,
,,,Contingency Coefficient,.71,,,
,,Ordinal by Ordinal,Kendall's tau-b,.00,.32,.00,
,,,Kendall's tau-c,.00,.32,.00,
,,,Gamma,.00,.50,.00,
,,,Spearman Correlation,.00,.22,.00,1.000
,,Interval by Interval,Pearson's R,.04,.22,.07,.950
,,N of Valid Cases,,5,,,
,2,Nominal by Nominal,Phi,1.00,,,
,,,Cramer's V,1.00,,,
,,,Contingency Coefficient,.71,,,
,,Ordinal by Ordinal,Kendall's tau-b,-.71,.20,-1.73,
,,,Kendall's tau-c,-.75,.43,-1.73,
,,,Gamma,-1.00,.00,-1.73,
,,,Spearman Correlation,-.77,.17,-1.73,.225
,,Interval by Interval,Pearson's R,-.73,.18,-1.49,.274
,,N of Valid Cases,,4,,,

Table: Directional Measures
,,,,,Value,Asymp. Std. Error,Approx. T,Approx. Sig.
z,1,Nominal by Nominal,Lambda,Symmetric,.40,.28,1.12,.264
,,,,x Dependent,.25,.22,1.12,.264
,,,,y Dependent,1.00,.00,1.12,.264
,,,Goodman and Kruskal tau,x Dependent,.25,,,
,,,,y Dependent,1.00,,,
,,,Uncertainty Coefficient,Symmetric,.47,.18,,
,,,,x Dependent,.31,.15,2.02,
,,,,y Dependent,1.00,.00,2.02,
,,Ordinal by Ordinal,Somers' d,Symmetric,.00,,.00,1.000
,,,,x Dependent,.00,.50,.00,1.000
,,,,y Dependent,.00,.20,.00,1.000
,,Nominal by Interval,Eta,x Dependent,.04,,,
,,,,y Dependent,1.00,,,
,2,Nominal by Nominal,Lambda,Symmetric,.50,.25,2.00,.046
,,,,x Dependent,.33,.27,1.15,.248
,,,,y Dependent,1.00,.00,1.15,.248
,,,Goodman and Kruskal tau,x Dependent,.33,,,
,,,,y Dependent,1.00,,,
,,,Uncertainty Coefficient,Symmetric,.58,.17,,
,,,,x Dependent,.41,.17,2.36,
,,,,y Dependent,1.00,.00,2.36,
,,Ordinal by Ordinal,Somers' d,Symmetric,-.67,,-1.73,.083
,,,,x Dependent,-1.00,.00,-1.73,.083
,,,,y Dependent,-.50,.29,-1.73,.083
,,Nominal by Interval,Eta,x Dependent,.73,,,
,,,,y Dependent,1.00,,,
])
AT_CLEANUP

AT_SETUP([CROSSTABS rounding weights with COUNT])
AT_DATA([crosstabs.sps],
  [[DATA LIST NOTABLE LIST /x y w.
BEGIN DATA.
1 1 1.4
1 1 1.4
1 2 1.6
1 2 1.6
2 1 1
2 2 2
END DATA.
WEIGHT BY w.

* These should have the same effect (no rounding).
CROSSTABS /TABLES x BY y.
CROSSTABS /TABLES x BY y /COUNT ASIS.

* Round input weights.
CROSSTABS /TABLES x BY y /COUNT CASE ROUND.
CROSSTABS /TABLES x BY y /COUNT CASE TRUNCATE.

* Round cell weights.
CROSSTABS /TABLES x BY y /COUNT.
CROSSTABS /TABLES x BY y /COUNT TRUNCATE.
]])

AT_CHECK([pspp -o pspp.csv -o pspp.txt crosstabs.sps])
AT_CHECK([cat pspp.csv], [0],
  [Table: Summary
,Cases,,,,,
,Valid,,Missing,,Total,
,N,Percent,N,Percent,N,Percent
x × y,9.00,100.0%,.00,.0%,9.00,100.0%

Table: x × y
,,,y,,Total
,,,1.00,2.00,
x,1.00,Count,2.80,3.20,6.00
,2.00,Count,1.00,2.00,3.00
Total,,Count,3.80,5.20,9.00

Table: Summary
,Cases,,,,,
,Valid,,Missing,,Total,
,N,Percent,N,Percent,N,Percent
x × y,9.00,100.0%,.00,.0%,9.00,100.0%

Table: x × y
,,,y,,Total
,,,1.00,2.00,
x,1.00,Count,2.80,3.20,6.00
,2.00,Count,1.00,2.00,3.00
Total,,Count,3.80,5.20,9.00

Table: Summary
,Cases,,,,,
,Valid,,Missing,,Total,
,N,Percent,N,Percent,N,Percent
x × y,9.00,100.0%,.00,.0%,9.00,100.0%

Table: x × y
,,,y,,Total
,,,1.00,2.00,
x,1.00,Count,2.00,4.00,6.00
,2.00,Count,1.00,2.00,3.00
Total,,Count,3.00,6.00,9.00

Table: Summary
,Cases,,,,,
,Valid,,Missing,,Total,
,N,Percent,N,Percent,N,Percent
x × y,7.00,100.0%,.00,.0%,7.00,100.0%

Table: x × y
,,,y,,Total
,,,1.00,2.00,
x,1.00,Count,2.00,2.00,4.00
,2.00,Count,1.00,2.00,3.00
Total,,Count,3.00,4.00,7.00

Table: Summary
,Cases,,,,,
,Valid,,Missing,,Total,
,N,Percent,N,Percent,N,Percent
x × y,9.00,100.0%,.00,.0%,9.00,100.0%

Table: x × y
,,,y,,Total
,,,1.00,2.00,
x,1.00,Count,3.00,3.00,6.00
,2.00,Count,1.00,2.00,3.00
Total,,Count,4.00,5.00,9.00

Table: Summary
,Cases,,,,,
,Valid,,Missing,,Total,
,N,Percent,N,Percent,N,Percent
x × y,8.00,100.0%,.00,.0%,8.00,100.0%

Table: x × y
,,,y,,Total
,,,1.00,2.00,
x,1.00,Count,2.00,3.00,5.00
,2.00,Count,1.00,2.00,3.00
Total,,Count,3.00,5.00,8.00
])
AT_CLEANUP

AT_SETUP([CROSSTABS descending sort order])
AT_DATA([crosstabs-descending.sps],
  [[DATA LIST NOTABLE LIST /x * y *.
BEGIN DATA.
2 2
2 2
3 1
4 1
3 2
3 2
END DATA.

CROSSTABS
        /TABLES= x BY y
	/FORMAT = DVALUE.
]])

AT_CHECK([pspp -o pspp.csv -o pspp.txt crosstabs-descending.sps])
AT_CHECK([cat pspp.csv], [0],
  [Table: Summary
,Cases,,,,,
,Valid,,Missing,,Total,
,N,Percent,N,Percent,N,Percent
x × y,6,100.0%,0,.0%,6,100.0%

Table: x × y
,,,y,,Total
,,,2.00,1.00,
x,4.00,Count,0,1,1
,3.00,Count,2,1,3
,2.00,Count,2,0,2
Total,,Count,4,2,6
])
AT_CLEANUP

# Bug #31260.
AT_SETUP([CROSSTABS crash when all cases missing])
AT_DATA([crosstabs.sps], [dnl
DATA LIST LIST NOTABLE /X1 X2.
BEGIN DATA.
1 1
END DATA.

MISSING VALUES x2 (1).

CROSSTABS /TABLES= X1 by X2.
])
AT_CHECK([pspp -O format=csv crosstabs.sps], [0], [dnl
Table: Summary
,Cases,,,,,
,Valid,,Missing,,Total,
,N,Percent,N,Percent,N,Percent
X1 × X2,0,.0%,1,100.0%,1,100.0%

"crosstabs.sps:8.20-8.27: warning: CROSSTABS: Crosstabulation X1 × X2 contained no non-missing cases.
    8 | CROSSTABS /TABLES= X1 by X2.
      |                    ^~~~~~~~"
])
AT_CLEANUP



dnl This example comes from http://www.ats.ucla.edu/stat/spss/whatstat/whatstat.htm#chisq
AT_SETUP([CROSSTABS Fisher Exact Test])

AT_DATA([fisher-exact.sps], [dnl
SET FORMAT F12.3.
SET DECIMAL DOT.

DATA LIST notable LIST  /schtyp (F9.2) female (F9.2) ses (F9.2) .
begin data.
      1.00       .00      1.00
      1.00      1.00      2.00
      1.00       .00      3.00
      1.00       .00      3.00
      1.00       .00      2.00
      1.00       .00      2.00
      1.00       .00      2.00
      1.00       .00      2.00
      1.00       .00      2.00
      1.00       .00      2.00
      1.00       .00      2.00
      1.00       .00      2.00
      1.00       .00      3.00
      1.00       .00      3.00
      1.00       .00      1.00
      1.00       .00      1.00
      1.00       .00      3.00
      2.00       .00      2.00
      1.00       .00      3.00
      1.00       .00      2.00
      1.00       .00      2.00
      1.00       .00      2.00
      1.00       .00      2.00
      1.00       .00      3.00
      1.00       .00      2.00
      1.00       .00      2.00
      1.00       .00      3.00
      2.00       .00      2.00
      2.00       .00      3.00
      1.00       .00      1.00
      1.00       .00      2.00
      1.00       .00      3.00
      2.00       .00      3.00
      1.00       .00      2.00
      2.00       .00      3.00
      1.00       .00      3.00
      2.00       .00      2.00
      1.00       .00      3.00
      1.00       .00      1.00
      1.00       .00      2.00
      2.00       .00      2.00
      2.00       .00      2.00
      1.00       .00      2.00
      1.00       .00      1.00
      1.00       .00      3.00
      1.00       .00      1.00
      1.00       .00      3.00
      1.00       .00      2.00
      2.00       .00      2.00
      1.00       .00      2.00
      1.00       .00      2.00
      1.00       .00      3.00
      1.00       .00      2.00
      2.00       .00      2.00
      1.00       .00      2.00
      1.00       .00      3.00
      1.00       .00      1.00
      1.00       .00      2.00
      2.00       .00      2.00
      1.00       .00      2.00
      2.00       .00      2.00
      1.00       .00      3.00
      1.00       .00      1.00
      1.00       .00      2.00
      2.00       .00      3.00
      1.00       .00      2.00
      1.00       .00      2.00
      1.00       .00      1.00
      1.00       .00      1.00
      1.00       .00      2.00
      1.00       .00      2.00
      1.00       .00      3.00
      1.00       .00      2.00
      1.00       .00      2.00
      1.00       .00      2.00
      1.00       .00      1.00
      1.00       .00      3.00
      1.00       .00      3.00
      1.00       .00      2.00
      1.00       .00      3.00
      1.00       .00      3.00
      1.00       .00      1.00
      2.00       .00      2.00
      1.00       .00      1.00
      1.00       .00      2.00
      1.00       .00      3.00
      1.00       .00      3.00
      1.00       .00      3.00
      1.00       .00      2.00
      1.00       .00      3.00
      1.00       .00      2.00
      1.00       .00      1.00
      1.00      1.00      3.00
      1.00      1.00      1.00
      1.00      1.00      1.00
      1.00      1.00      1.00
      1.00      1.00      2.00
      1.00      1.00      3.00
      1.00      1.00      1.00
      2.00      1.00      3.00
      1.00      1.00      3.00
      1.00      1.00      3.00
      1.00      1.00      1.00
      1.00      1.00      3.00
      1.00      1.00      2.00
      1.00      1.00      2.00
      1.00      1.00      3.00
      1.00      1.00      1.00
      2.00      1.00      1.00
      2.00      1.00      3.00
      1.00      1.00      2.00
      1.00      1.00      1.00
      1.00      1.00      3.00
      1.00      1.00      1.00
      2.00      1.00      3.00
      1.00      1.00      2.00
      1.00      1.00      3.00
      1.00      1.00      3.00
      1.00      1.00      1.00
      1.00      1.00      1.00
      2.00      1.00      1.00
      1.00      1.00      2.00
      1.00      1.00      2.00
      1.00      1.00      2.00
      1.00      1.00      1.00
      1.00      1.00      3.00
      1.00      1.00      2.00
      1.00      1.00      2.00
      1.00      1.00      3.00
      1.00      1.00      1.00
      1.00      1.00      2.00
      1.00      1.00      1.00
      1.00      1.00      2.00
      1.00      1.00      2.00
      1.00      1.00      1.00
      1.00      1.00      3.00
      2.00      1.00      2.00
      1.00      1.00      2.00
      1.00      1.00      2.00
      2.00      1.00      2.00
      1.00      1.00      1.00
      1.00      1.00      3.00
      1.00      1.00      2.00
      1.00      1.00      2.00
      1.00      1.00      2.00
      2.00      1.00      3.00
      1.00      1.00      2.00
      2.00      1.00      2.00
      1.00      1.00      1.00
      1.00      1.00      1.00
      1.00      1.00      1.00
      1.00      1.00      3.00
      1.00      1.00      2.00
      1.00      1.00      2.00
      1.00      1.00      2.00
      1.00      1.00      2.00
      1.00      1.00      2.00
      1.00      1.00      2.00
      1.00      1.00      2.00
      1.00      1.00      3.00
      1.00      1.00      1.00
      1.00      1.00      2.00
      2.00      1.00      3.00
      1.00      1.00      1.00
      1.00      1.00      2.00
      1.00      1.00      1.00
      1.00      1.00      2.00
      1.00      1.00      1.00
      2.00      1.00      2.00
      1.00      1.00      1.00
      1.00      1.00      1.00
      1.00      1.00      2.00
      1.00      1.00      3.00
      1.00      1.00      3.00
      1.00      1.00      1.00
      1.00      1.00      1.00
      1.00      1.00      2.00
      1.00      1.00      2.00
      1.00      1.00      3.00
      1.00      1.00      1.00
      1.00      1.00      2.00
      2.00      1.00      2.00
      1.00      1.00      3.00
      1.00      1.00      2.00
      1.00      1.00      3.00
      1.00      1.00      1.00
      1.00      1.00      2.00
      1.00      1.00      2.00
      2.00      1.00      3.00
      1.00      1.00      1.00
      1.00      1.00      1.00
      2.00      1.00      3.00
      2.00      1.00      2.00
      1.00      1.00      3.00
      2.00      1.00      2.00
      2.00      1.00      2.00
      1.00      1.00      2.00
      2.00      1.00      2.00
      1.00      1.00      2.00
      1.00      1.00      3.00
end data.

VARIABLE LABEL schtyp 'type of school'.
ADD VALUE LABELS female 0 male 1 female.
ADD VALUE LABELS ses 1 low 2 middle 3 high.
ADD VALUE LABELS schtyp 1 public 2 private.

crosstabs /tables = schtyp by female /statistic = chisq.
crosstabs /tables = female by ses  /statistic = chisq.
])

AT_CHECK([pspp -o pspp.csv -o pspp.txt fisher-exact.sps])
AT_CHECK([cat pspp.csv], [0], [Table: Summary
,Cases,,,,,
,Valid,,Missing,,Total,
,N,Percent,N,Percent,N,Percent
type of school × female,200,100.0%,0,.0%,200,100.0%

Table: type of school × female
,,,female,,Total
,,,male,female,
type of school,public,Count,77,91,168
,private,Count,14,18,32
Total,,Count,91,109,200

Table: Chi-Square Tests
,Value,df,Asymptotic Sig. (2-tailed),Exact Sig. (2-tailed),Exact Sig. (1-tailed)
Pearson Chi-Square,.047,1,.828,,
Likelihood Ratio,.047,1,.828,,
Fisher's Exact Test,,,,.849,.492
Continuity Correction,.001,1,.981,,
Linear-by-Linear Association,.047,1,.829,,
N of Valid Cases,200,,,,

Table: Summary
,Cases,,,,,
,Valid,,Missing,,Total,
,N,Percent,N,Percent,N,Percent
female × ses,200,100.0%,0,.0%,200,100.0%

Table: female × ses
,,,ses,,,Total
,,,low,middle,high,
female,male,Count,15,47,29,91
,female,Count,32,48,29,109
Total,,Count,47,95,58,200

Table: Chi-Square Tests
,Value,df,Asymptotic Sig. (2-tailed)
Pearson Chi-Square,4.577,2,.101
Likelihood Ratio,4.679,2,.096
Linear-by-Linear Association,3.110,1,.078
N of Valid Cases,200,,
])

AT_CLEANUP

AT_SETUP([CROSSTABS Pearson's R - 1])
AT_DATA([pearson.sps], [dnl
SET FORMAT F8.3.

* From http://www.statisticslectures.com/topics/pearsonr/.
DATA LIST FREE/x y.
BEGIN DATA.
1 4
3 6
5 10
5 12
6 13
END DATA.
CROSSTABS x BY y/STATISTICS=CORR.
])
AT_CHECK([pspp -o pspp.csv -o pspp.txt pearson.sps])
AT_CHECK([cat pspp.csv], [0], [dnl
Table: Summary
,Cases,,,,,
,Valid,,Missing,,Total,
,N,Percent,N,Percent,N,Percent
x × y,5,100.0%,0,.0%,5,100.0%

Table: x × y
,,,y,,,,,Total
,,,4.000,6.000,10.000,12.000,13.000,
x,1.000,Count,1,0,0,0,0,1
,3.000,Count,0,1,0,0,0,1
,5.000,Count,0,0,1,1,0,2
,6.000,Count,0,0,0,0,1,1
Total,,Count,1,1,1,1,1,5

Table: Symmetric Measures
,,Value,Asymp. Std. Error,Approx. T,Approx. Sig.
Ordinal by Ordinal,Spearman Correlation,.975,.022,7.550,.005
Interval by Interval,Pearson's R,.968,.017,6.708,.007
N of Valid Cases,,5,,,
])
AT_CLEANUP

AT_SETUP([CROSSTABS Pearson's R - 2])
AT_DATA([pearson2.sps], [dnl
SET FORMAT F8.3.

* Checked with http://www.socscistatistics.com/tests/pearson/Default2.aspx.
DATA LIST FREE/x y.
BEGIN DATA.
1 1.5
2 1.5
3 4
4 6
5 5
6 7
7 6.5
8 9
9 10.5
10 11
END DATA.
CROSSTABS x BY y/STATISTICS=CORR.
])
AT_CHECK([pspp -o pspp.csv -o pspp.txt pearson2.sps])
AT_CHECK([cat pspp.csv], [0], [dnl
Table: Summary
,Cases,,,,,
,Valid,,Missing,,Total,
,N,Percent,N,Percent,N,Percent
x × y,10,100.0%,0,.0%,10,100.0%

Table: x × y
,,,y,,,,,,,,,Total
,,,1.500,4.000,5.000,6.000,6.500,7.000,9.000,10.500,11.000,
x,1.000,Count,1,0,0,0,0,0,0,0,0,1
,2.000,Count,1,0,0,0,0,0,0,0,0,1
,3.000,Count,0,1,0,0,0,0,0,0,0,1
,4.000,Count,0,0,0,1,0,0,0,0,0,1
,5.000,Count,0,0,1,0,0,0,0,0,0,1
,6.000,Count,0,0,0,0,0,1,0,0,0,1
,7.000,Count,0,0,0,0,1,0,0,0,0,1
,8.000,Count,0,0,0,0,0,0,1,0,0,1
,9.000,Count,0,0,0,0,0,0,0,1,0,1
,10.000,Count,0,0,0,0,0,0,0,0,1,1
Total,,Count,2,1,1,1,1,1,1,1,1,10

Table: Symmetric Measures
,,Value,Asymp. Std. Error,Approx. T,Approx. Sig.
Ordinal by Ordinal,Spearman Correlation,.973,.015,11.844,.000
Interval by Interval,Pearson's R,.971,.017,11.580,.000
N of Valid Cases,,10,,,
])
AT_CLEANUP

AT_SETUP([CROSSTABS Pearson's R - 3])
AT_DATA([pearson3.sps], [dnl
SET FORMAT F8.3.

* From http://learntech.uwe.ac.uk/da/Default.aspx?pageid=1442.
DATA LIST FREE/x y.
BEGIN DATA.
56 87
56 91
65 85
65 91
50 75
25 28
87 122
44 66
35 58
END DATA.
CROSSTABS x BY y/STATISTICS=CORR.
])
AT_CHECK([pspp -o pspp.csv -o pspp.txt pearson3.sps])
AT_CHECK([cat pspp.csv], [0], [dnl
Table: Summary
,Cases,,,,,
,Valid,,Missing,,Total,
,N,Percent,N,Percent,N,Percent
x × y,9,100.0%,0,.0%,9,100.0%

Table: x × y
,,,y,,,,,,,,Total
,,,28.000,58.000,66.000,75.000,85.000,87.000,91.000,122.000,
x,25.000,Count,1,0,0,0,0,0,0,0,1
,35.000,Count,0,1,0,0,0,0,0,0,1
,44.000,Count,0,0,1,0,0,0,0,0,1
,50.000,Count,0,0,0,1,0,0,0,0,1
,56.000,Count,0,0,0,0,0,1,1,0,2
,65.000,Count,0,0,0,0,1,0,1,0,2
,87.000,Count,0,0,0,0,0,0,0,1,1
Total,,Count,1,1,1,1,1,1,2,1,9

Table: Symmetric Measures
,,Value,Asymp. Std. Error,Approx. T,Approx. Sig.
Ordinal by Ordinal,Spearman Correlation,.911,.068,5.860,.001
Interval by Interval,Pearson's R,.966,.017,9.915,.000
N of Valid Cases,,9,,,
])
AT_CLEANUP

AT_SETUP([CROSSTABS Pearson's R - 4])
AT_DATA([pearson4.sps], [dnl
SET FORMAT F8.3.

* From http://psychology.ucdavis.edu/faculty_sites/sommerb/sommerdemo/correlation/hand/pearson_hand.htm.
DATA LIST FREE/x y.
BEGIN DATA.
5 5
10 20
6 4
8 15
4 11
4 9
3 12
10 18
2 7
6 2
7 14
9 17
END DATA.
CROSSTABS x BY y/STATISTICS=CORR.
])
AT_CHECK([pspp -o pspp.csv -o pspp.txt pearson4.sps])
AT_CHECK([cat pspp.csv], [0], [dnl
Table: Summary
,Cases,,,,,
,Valid,,Missing,,Total,
,N,Percent,N,Percent,N,Percent
x × y,12,100.0%,0,.0%,12,100.0%

Table: x × y
,,,y,,,,,,,,,,,,Total
,,,2.000,4.000,5.000,7.000,9.000,11.000,12.000,14.000,15.000,17.000,18.000,20.000,
x,2.000,Count,0,0,0,1,0,0,0,0,0,0,0,0,1
,3.000,Count,0,0,0,0,0,0,1,0,0,0,0,0,1
,4.000,Count,0,0,0,0,1,1,0,0,0,0,0,0,2
,5.000,Count,0,0,1,0,0,0,0,0,0,0,0,0,1
,6.000,Count,1,1,0,0,0,0,0,0,0,0,0,0,2
,7.000,Count,0,0,0,0,0,0,0,1,0,0,0,0,1
,8.000,Count,0,0,0,0,0,0,0,0,1,0,0,0,1
,9.000,Count,0,0,0,0,0,0,0,0,0,1,0,0,1
,10.000,Count,0,0,0,0,0,0,0,0,0,0,1,1,2
Total,,Count,1,1,1,1,1,1,1,1,1,1,1,1,12

Table: Symmetric Measures
,,Value,Asymp. Std. Error,Approx. T,Approx. Sig.
Ordinal by Ordinal,Spearman Correlation,.657,.140,2.758,.020
Interval by Interval,Pearson's R,.667,.132,2.830,.018
N of Valid Cases,,12,,,
])
AT_CLEANUP

AT_SETUP([CROSSTABS Pearson's R - 5])
AT_DATA([pearson5.sps], [dnl
SET FORMAT F8.3.

* From http://www.statisticslectures.com/topics/pearsonr/.
DATA LIST FREE/x y.
BEGIN DATA.
18 15000
25 29000
57 68000
45 52000
26 32000
64 80000
37 41000
40 45000
24 26000
33 33000
END DATA.
CROSSTABS x BY y/STATISTICS=CORR.
])
AT_CHECK([pspp -o pspp.csv -o pspp.txt pearson5.sps])
AT_CHECK([cat pspp.csv], [0], [dnl
Table: Summary
,Cases,,,,,
,Valid,,Missing,,Total,
,N,Percent,N,Percent,N,Percent
x × y,10,100.0%,0,.0%,10,100.0%

Table: x × y
,,,y,,,,,,,,,,Total
,,,15000.00,26000.00,29000.00,32000.00,33000.00,41000.00,45000.00,52000.00,68000.00,80000.00,
x,18.000,Count,1,0,0,0,0,0,0,0,0,0,1
,24.000,Count,0,1,0,0,0,0,0,0,0,0,1
,25.000,Count,0,0,1,0,0,0,0,0,0,0,1
,26.000,Count,0,0,0,1,0,0,0,0,0,0,1
,33.000,Count,0,0,0,0,1,0,0,0,0,0,1
,37.000,Count,0,0,0,0,0,1,0,0,0,0,1
,40.000,Count,0,0,0,0,0,0,1,0,0,0,1
,45.000,Count,0,0,0,0,0,0,0,1,0,0,1
,57.000,Count,0,0,0,0,0,0,0,0,1,0,1
,64.000,Count,0,0,0,0,0,0,0,0,0,1,1
Total,,Count,1,1,1,1,1,1,1,1,1,1,10

Table: Symmetric Measures
,,Value,Asymp. Std. Error,Approx. T,Approx. Sig.
Ordinal by Ordinal,Spearman Correlation,1.000,.000,+Infinit,.000
Interval by Interval,Pearson's R,.992,.004,22.638,.000
N of Valid Cases,,10,,,
])
AT_CLEANUP

AT_SETUP([CROSSTABS Goodman and Kruskal's lambda - 1])
AT_DATA([lambda.sps], [dnl
SET FORMAT F8.3.

* From http://www.csupomona.edu/~jlkorey/POWERMUTT/Topics/contingency_tables.html.
DATA LIST LIST NOTABLE/x y w.
WEIGHT BY w.
BEGIN DATA.
1 1 424
1 2 213
1 3 59
3 1 55
3 2 188
3 3 357
END DATA.

CROSSTABS x BY y/CELLS=NONE/STATISTICS=LAMBDA.
])
AT_CHECK([pspp -o pspp.csv -o pspp.txt lambda.sps])
AT_CHECK([cat pspp.csv], [0], [dnl
Table: Summary
,Cases,,,,,
,Valid,,Missing,,Total,
,N,Percent,N,Percent,N,Percent
x × y,1296.000,100.0%,.000,.0%,1296.000,100.0%

Table: Directional Measures
,,,Value,Asymp. Std. Error,Approx. T,Approx. Sig.
Nominal by Nominal,Lambda,Symmetric,.423,.021,16.875,.000
,,x Dependent,.497,.024,15.986,.000
,,y Dependent,.370,.020,16.339,.000
,Goodman and Kruskal tau,x Dependent,.382,,,
,,y Dependent,.198,,,
])
AT_CLEANUP

AT_SETUP([CROSSTABS Goodman and Kruskal's lambda - 2])
AT_DATA([lambda.sps], [dnl
SET FORMAT F8.3.

* From http://vassarstats.net.
DATA LIST LIST NOTABLE/x y w.
WEIGHT BY w.
BEGIN DATA.
1 1 19
1 2 26
1 3 8
2 1 21
2 2 13
2 3 5
3 1 6
3 2 12
3 3 27
END DATA.

CROSSTABS x BY y/CELLS=NONE/STATISTICS=LAMBDA.
])
AT_CHECK([pspp -o pspp.csv -o pspp.txt lambda.sps])
AT_CHECK([cat pspp.csv], [0], [dnl
Table: Summary
,Cases,,,,,
,Valid,,Missing,,Total,
,N,Percent,N,Percent,N,Percent
x × y,137.000,100.0%,.000,.0%,137.000,100.0%

Table: Directional Measures
,,,Value,Asymp. Std. Error,Approx. T,Approx. Sig.
Nominal by Nominal,Lambda,Symmetric,.259,.081,2.902,.004
,,x Dependent,.250,.089,2.479,.013
,,y Dependent,.267,.085,2.766,.006
,Goodman and Kruskal tau,x Dependent,.129,,,
,,y Dependent,.123,,,
])
AT_CLEANUP

AT_SETUP([CROSSTABS Goodman and Kruskal's lambda - 3])
AT_DATA([lambda.sps], [dnl
SET FORMAT F8.3.

* From Goodman, L.A., Kruskal, W.H. (1954) "Measures of association for
  cross classifications". Part I. Journal of the American Statistical
  Association, 49, 732-764.
DATA LIST LIST NOTABLE/x y w.
WEIGHT BY w.
BEGIN DATA.
1 1 1768
1 2 807
1 3 189
1 4 47
2 1 946
2 2 1387
2 3 746
2 4 53
3 1 115
3 2 438
3 3 288
3 4 16
END DATA.
CROSSTABS x BY y/CELLS=NONE/STATISTICS=LAMBDA.
])
AT_CHECK([pspp -o pspp.csv -o pspp.txt lambda.sps])
AT_CHECK([cat pspp.csv], [0], [dnl
Table: Summary
,Cases,,,,,
,Valid,,Missing,,Total,
,N,Percent,N,Percent,N,Percent
x × y,6800.000,100.0%,.000,.0%,6800.000,100.0%

Table: Directional Measures
,,,Value,Asymp. Std. Error,Approx. T,Approx. Sig.
Nominal by Nominal,Lambda,Symmetric,.208,.010,18.793,.000
,,x Dependent,.224,.013,16.076,.000
,,y Dependent,.192,.012,14.438,.000
,Goodman and Kruskal tau,x Dependent,.089,,,
,,y Dependent,.081,,,
])
AT_CLEANUP

AT_SETUP([CROSSTABS Goodman and Kruskal's lambda - treatment of ties])
AT_DATA([lambda.sps], [dnl
SET FORMAT F8.3.

* From Douglas Bonett.
DATA LIST LIST NOTABLE/x y w.
WEIGHT BY w.
BEGIN DATA.
1 1 225
1 2 43
1 3 216
2 1 3
2 2 1
2 3 12
END DATA.

CROSSTABS x BY y/CELLS=NONE/STATISTICS=LAMBDA.
])
AT_CHECK([pspp -o pspp.csv -o pspp.txt lambda.sps])
AT_CHECK([cat pspp.csv], [0], [dnl
Table: Summary
,Cases,,,,,
,Valid,,Missing,,Total,
,N,Percent,N,Percent,N,Percent
x × y,500.000,100.0%,.000,.0%,500.000,100.0%

Table: Directional Measures
,,,Value,Asymp. Std. Error,Approx. T,Approx. Sig.
Nominal by Nominal,Lambda,Symmetric,.031,.013,2.336,.019
,,x Dependent,.000,.000,NaN,NaN
,,y Dependent,.033,.014,2.336,.019
,Goodman and Kruskal tau,x Dependent,.012,,,
,,y Dependent,.009,,,
])
AT_CLEANUP

AT_SETUP([CROSSTABS Somers' D, Tau-B, Tau-C, Gamma - 1])
AT_DATA([somersd.sps], [dnl
SET FORMAT F8.3.

* From http://stats.stackexchange.com/questions/72203/problem-with-calculating-asymptotic-standard-error-for-somers-d.
DATA LIST LIST NOTABLE/x y * w (F10.6).
WEIGHT BY w.
BEGIN DATA.
1 1 0.000025
1 2 0.0001
1 3 0.001
1 4 0.0025
1 5 0.004
1 6 0.0075
1 7 0.0125
2 1 0.049975
2 2 0.0999
2 3 0.199
2 4 0.2475
2 5 0.196
2 6 0.1425
2 7 0.0375
END DATA.
CROSSTABS x BY y/STATISTICS=D/CELLS=NONE.
])
AT_CHECK([pspp -o pspp.csv -o pspp.txt somersd.sps])
AT_CHECK([cat pspp.csv], [0], [dnl
Table: Summary
,Cases,,,,,
,Valid,,Missing,,Total,
,N,Percent,N,Percent,N,Percent
x × y,1.000000,100.0%,.000000,.0%,1.000000,100.0%

Table: Directional Measures
,,,Value,Asymp. Std. Error,Approx. T,Approx. Sig.
Ordinal by Ordinal,Somers' d,Symmetric,-.084,,-.149,.882
,,x Dependent,-.045,.300,-.149,.882
,,y Dependent,-.684,2.378,-.149,.882
])
AT_CLEANUP

AT_SETUP([CROSSTABS Somers' D, Tau-B, Tau-C, Gamma - 2])
AT_DATA([somersd.sps], [dnl
SET FORMAT F8.3.

* From http://uregina.ca/~gingrich/gamma.pdf.
DATA LIST LIST NOTABLE/x y w.
WEIGHT BY w.
BEGIN DATA.
1 1 34
1 2 24
1 3 15
2 1 42
2 2 74
2 3 67
3 1 28
3 2 111
3 3 292
END DATA.
CROSSTABS x BY y/STATISTICS=BTAU CTAU GAMMA D/CELLS=NONE.
])
AT_CHECK([pspp -o pspp.csv -o pspp.txt somersd.sps])
AT_CHECK([cat pspp.csv], [0], [dnl
Table: Summary
,Cases,,,,,
,Valid,,Missing,,Total,
,N,Percent,N,Percent,N,Percent
x × y,687.000,100.0%,.000,.0%,687.000,100.0%

Table: Symmetric Measures
,,Value,Asymp. Std. Error,Approx. T
Ordinal by Ordinal,Kendall's tau-b,.372,.033,10.669
,Kendall's tau-c,.310,.029,10.669
,Gamma,.591,.043,10.669
N of Valid Cases,,687.000,,

Table: Directional Measures
,,,Value,Asymp. Std. Error,Approx. T,Approx. Sig.
Ordinal by Ordinal,Somers' d,Symmetric,.371,,10.669,.000
,,x Dependent,.351,.032,10.669,.000
,,y Dependent,.394,.035,10.669,.000
])
AT_CLEANUP

AT_SETUP([CROSSTABS Somers' D, Tau-B, Tau-C, Gamma - 3])
AT_DATA([ordinal.sps], [dnl
SET FORMAT F8.3.

* From https://www.iup.edu/WorkArea/DownloadAsset.aspx?id=9829, "Case 1".
DATA LIST LIST NOTABLE /x y w.
WEIGHT BY w.
BEGIN DATA.
1 2 40
2 3 80
3 4 30
END DATA.
CROSSTABS x BY y/STATISTICS=GAMMA D BTAU/CELLS=NONE.

* Same site, case 2.
DATA LIST LIST NOTABLE /x y w.
WEIGHT BY w.
BEGIN DATA.
1 1 40
2 3 80
3 4 30
END DATA.
CROSSTABS x BY y/STATISTICS=GAMMA D BTAU/CELLS=NONE.

* Same site, case 3.
DATA LIST LIST NOTABLE /x y w.
WEIGHT BY w.
BEGIN DATA.
1 4 40
2 3 80
3 2 30
END DATA.
CROSSTABS x BY y/STATISTICS=GAMMA D BTAU/CELLS=NONE.

* Same site, case 4.
DATA LIST LIST NOTABLE /x y w.
WEIGHT BY w.
BEGIN DATA.
1 1 20
1 2 20
2 3 80
3 4 30
END DATA.
CROSSTABS x BY y/STATISTICS=GAMMA D BTAU/CELLS=NONE.

* Same site, case 5.
DATA LIST LIST NOTABLE /x y w.
WEIGHT BY w.
BEGIN DATA.
1 2 40
2 2 80
3 2 29
3 3 1
END DATA.
CROSSTABS x BY y/STATISTICS=GAMMA D BTAU/CELLS=NONE.

* Same site, case 6.
DATA LIST LIST NOTABLE /x y w.
WEIGHT BY w.
BEGIN DATA.
1 1 3
1 2 6
1 3 28
1 4 61
2 1 4
2 2 5
2 3 21
2 4 20
END DATA.
CROSSTABS x BY y/STATISTICS=GAMMA D BTAU/CELLS=NONE.

* Same site, case 7.
DATA LIST LIST NOTABLE /x y w.
WEIGHT BY w.
BEGIN DATA.
1 1 38
1 2 6
1 3 3
1 4 51
2 1 4
2 2 20
2 3 21
2 4 5
END DATA.
CROSSTABS x BY y/STATISTICS=LAMBDA D PHI GAMMA/CELLS=NONE.

* Same site, case 8.
DATA LIST LIST NOTABLE /x y w.
WEIGHT BY w.
BEGIN DATA.
1 1 2
1 2 3
1 3 5
1 4 1
2 1 2
2 2 16
2 3 3
2 4 6
3 1 3
3 2 10
3 3 35
3 4 27
4 1 6
4 2 15
4 3 33
4 4 45
END DATA.
CROSSTABS x BY y/STATISTICS=LAMBDA D PHI BTAU/CELLS=NONE.
])
AT_CHECK([pspp -o pspp.csv -o pspp.txt ordinal.sps])
AT_CHECK([cat pspp.csv], [0], [dnl
Table: Summary
,Cases,,,,,
,Valid,,Missing,,Total,
,N,Percent,N,Percent,N,Percent
x × y,150.000,100.0%,.000,.0%,150.000,100.0%

Table: Symmetric Measures
,,Value,Asymp. Std. Error,Approx. T
Ordinal by Ordinal,Kendall's tau-b,1.000,.000,24.841
,Gamma,1.000,.000,24.841
N of Valid Cases,,150.000,,

Table: Directional Measures
,,,Value,Asymp. Std. Error,Approx. T,Approx. Sig.
Ordinal by Ordinal,Somers' d,Symmetric,1.000,,24.841,.000
,,x Dependent,1.000,.000,24.841,.000
,,y Dependent,1.000,.000,24.841,.000

Table: Summary
,Cases,,,,,
,Valid,,Missing,,Total,
,N,Percent,N,Percent,N,Percent
x × y,150.000,100.0%,.000,.0%,150.000,100.0%

Table: Symmetric Measures
,,Value,Asymp. Std. Error,Approx. T
Ordinal by Ordinal,Kendall's tau-b,1.000,.000,24.841
,Gamma,1.000,.000,24.841
N of Valid Cases,,150.000,,

Table: Directional Measures
,,,Value,Asymp. Std. Error,Approx. T,Approx. Sig.
Ordinal by Ordinal,Somers' d,Symmetric,1.000,,24.841,.000
,,x Dependent,1.000,.000,24.841,.000
,,y Dependent,1.000,.000,24.841,.000

Table: Summary
,Cases,,,,,
,Valid,,Missing,,Total,
,N,Percent,N,Percent,N,Percent
x × y,150.000,100.0%,.000,.0%,150.000,100.0%

Table: Symmetric Measures
,,Value,Asymp. Std. Error,Approx. T
Ordinal by Ordinal,Kendall's tau-b,-1.000,.000,-24.841
,Gamma,-1.000,.000,-24.841
N of Valid Cases,,150.000,,

Table: Directional Measures
,,,Value,Asymp. Std. Error,Approx. T,Approx. Sig.
Ordinal by Ordinal,Somers' d,Symmetric,-1.000,,-24.841,.000
,,x Dependent,-1.000,.000,-24.841,.000
,,y Dependent,-1.000,.000,-24.841,.000

Table: Summary
,Cases,,,,,
,Valid,,Missing,,Total,
,N,Percent,N,Percent,N,Percent
x × y,150.000,100.0%,.000,.0%,150.000,100.0%

Table: Symmetric Measures
,,Value,Asymp. Std. Error,Approx. T
Ordinal by Ordinal,Kendall's tau-b,.972,.007,24.841
,Gamma,1.000,.000,24.841
N of Valid Cases,,150.000,,

Table: Directional Measures
,,,Value,Asymp. Std. Error,Approx. T,Approx. Sig.
Ordinal by Ordinal,Somers' d,Symmetric,.971,,24.841,.000
,,x Dependent,.944,.013,24.841,.000
,,y Dependent,1.000,.000,24.841,.000

Table: Summary
,Cases,,,,,
,Valid,,Missing,,Total,
,N,Percent,N,Percent,N,Percent
x × y,150.000,100.0%,.000,.0%,150.000,100.0%

Table: Symmetric Measures
,,Value,Asymp. Std. Error,Approx. T
Ordinal by Ordinal,Kendall's tau-b,.119,.059,1.009
,Gamma,1.000,.000,1.009
N of Valid Cases,,150.000,,

Table: Directional Measures
,,,Value,Asymp. Std. Error,Approx. T,Approx. Sig.
Ordinal by Ordinal,Somers' d,Symmetric,.035,,1.009,.313
,,x Dependent,.805,.032,1.009,.313
,,y Dependent,.018,.017,1.009,.313

Table: Summary
,Cases,,,,,
,Valid,,Missing,,Total,
,N,Percent,N,Percent,N,Percent
x × y,148.000,100.0%,.000,.0%,148.000,100.0%

Table: Symmetric Measures
,,Value,Asymp. Std. Error,Approx. T
Ordinal by Ordinal,Kendall's tau-b,-.208,.078,-2.641
,Gamma,-.381,.130,-2.641
N of Valid Cases,,148.000,,

Table: Directional Measures
,,,Value,Asymp. Std. Error,Approx. T,Approx. Sig.
Ordinal by Ordinal,Somers' d,Symmetric,-.206,,-2.641,.008
,,x Dependent,-.182,.069,-2.641,.008
,,y Dependent,-.237,.089,-2.641,.008

Table: Summary
,Cases,,,,,
,Valid,,Missing,,Total,
,N,Percent,N,Percent,N,Percent
x × y,148.000,100.0%,.000,.0%,148.000,100.0%

Table: Symmetric Measures
,,Value,Asymp. Std. Error,Approx. T
Nominal by Nominal,Phi,.731,,
,Cramer's V,.731,,
Ordinal by Ordinal,Gamma,-.110,.107,-1.022
N of Valid Cases,,148.000,,

Table: Directional Measures
,,,Value,Asymp. Std. Error,Approx. T,Approx. Sig.
Nominal by Nominal,Lambda,Symmetric,.338,.059,4.743,.000
,,x Dependent,.640,.085,4.875,.000
,,y Dependent,.174,.050,3.248,.001
,Goodman and Kruskal tau,x Dependent,.534,,,
,,y Dependent,.167,,,
Ordinal by Ordinal,Somers' d,Symmetric,-.074,,-1.022,.307
,,x Dependent,-.060,.059,-1.022,.307
,,y Dependent,-.096,.094,-1.022,.307

Table: Summary
,Cases,,,,,
,Valid,,Missing,,Total,
,N,Percent,N,Percent,N,Percent
x × y,212.000,100.0%,.000,.0%,212.000,100.0%

Table: Symmetric Measures
,,Value,Asymp. Std. Error,Approx. T
Nominal by Nominal,Phi,.432,,
,Cramer's V,.249,,
Ordinal by Ordinal,Kendall's tau-b,.209,.062,3.338
N of Valid Cases,,212.000,,

Table: Directional Measures
,,,Value,Asymp. Std. Error,Approx. T,Approx. Sig.
Nominal by Nominal,Lambda,Symmetric,.102,.067,1.473,.141
,,x Dependent,.027,.087,.302,.763
,,y Dependent,.165,.065,2.349,.019
,Goodman and Kruskal tau,x Dependent,.051,,,
,,y Dependent,.068,,,
Ordinal by Ordinal,Somers' d,Symmetric,.209,,3.338,.001
,,x Dependent,.202,.060,3.338,.001
,,y Dependent,.217,.064,3.338,.001
])
AT_CLEANUP

AT_SETUP([CROSSTABS Cohens Kappa])

dnl Example from Wood J. M.
dnl "Understanding and Computing Cohen's Kappa: A Tutorial"
dnl WebPsychEmpiricist. Oct 3 2007
AT_DATA([kappa.sps], [dnl
SET FORMAT=F8.3.

data list notable list /p1 * p2 * w *.
begin data.
0 0 18
1 0 1
0 1 1
end data.

weight by w.

crosstabs /table = p1 by p2
	/statistics = kappa
	.
])

AT_CHECK([pspp -o pspp.csv -o pspp.txt kappa.sps])
AT_CHECK([cat pspp.csv], [0], [dnl
Table: Summary
,Cases,,,,,
,Valid,,Missing,,Total,
,N,Percent,N,Percent,N,Percent
p1 × p2,20.000,100.0%,.000,.0%,20.000,100.0%

Table: p1 × p2
,,,p2,,Total
,,,.000,1.000,
p1,.000,Count,18.000,1.000,19.000
,1.000,Count,1.000,.000,1.000
Total,,Count,19.000,1.000,20.000

Table: Symmetric Measures
,,Value,Asymp. Std. Error,Approx. T
Measure of Agreement,Kappa,-.053,.037,-.235
N of Valid Cases,,20.000,,
])

AT_CLEANUP


AT_SETUP([CROSSTABS many statistics])
AT_DATA([crosstabs.sps], [dnl
SET FORMAT=F8.4.

* From http://www4.stat.ncsu.edu/~dzhang2/st744/table3.9.lst.txt.
DATA LIST LIST NOTABLE/x y w.
WEIGHT BY w.
BEGIN DATA.
1 1 25
1 2 25
1 3 12
2 2 1
2 3 3
END DATA.
CROSSTABS x BY y/STATISTICS=CHISQ PHI CC LAMBDA UC BTAU CTAU GAMMA D CORR/CELLS=NONE.
])
AT_CHECK([pspp -o pspp.csv -o pspp.txt crosstabs.sps])
AT_CHECK([cat pspp.csv], [0], [dnl
Table: Summary
,Cases,,,,,
,Valid,,Missing,,Total,
,N,Percent,N,Percent,N,Percent
x × y,66.0000,100.0%,.0000,.0%,66.0000,100.0%

Table: Chi-Square Tests
,Value,df,Asymptotic Sig. (2-tailed)
Pearson Chi-Square,6.9562,2.0000,.031
Likelihood Ratio,6.6901,2.0000,.035
Linear-by-Linear Association,5.8450,1.0000,.016
N of Valid Cases,66.0000,,

Table: Symmetric Measures
,,Value,Asymp. Std. Error,Approx. T,Approx. Sig.
Nominal by Nominal,Phi,.3246,,,
,Cramer's V,.3246,,,
,Contingency Coefficient,.3088,,,
Ordinal by Ordinal,Kendall's tau-b,.2752,.0856,1.9920,
,Kendall's tau-c,.1497,.0751,1.9920,
,Gamma,.8717,.1250,1.9920,
,Spearman Correlation,.2908,.0906,2.4311,.018
Interval by Interval,Pearson's R,.2999,.0973,2.5147,.014
N of Valid Cases,,66.0000,,,

Table: Directional Measures
,,,Value,Asymp. Std. Error,Approx. T,Approx. Sig.
Nominal by Nominal,Lambda,Symmetric,.0455,.1629,.2723,.785
,,x Dependent,.0000,.0000,NaN,NaN
,,y Dependent,.0500,.1791,.2723,.785
,Goodman and Kruskal tau,x Dependent,.1054,,,
,,y Dependent,.0434,,,
,Uncertainty Coefficient,Symmetric,.0780,.0474,,
,,x Dependent,.2217,.1062,1.5373,
,,y Dependent,.0473,.0306,1.5373,
Ordinal by Ordinal,Somers' d,Symmetric,.1960,,1.9920,.046
,,x Dependent,.1152,.0572,1.9920,.046
,,y Dependent,.6573,.1417,1.9920,.046
])
AT_CLEANUP

AT_SETUP([CROSSTABS uncertainy coefficient])
AT_DATA([uc.sps], [dnl
* From http://groups.chass.utoronto.ca/pol242/5bMeasuringAssociation.htm.
SET FORMAT=F8.3.

DATA LIST LIST NOTABLE/x y w.
WEIGHT BY w.
BEGIN DATA.
1 1 416
1 2 121
2 1 335
2 2 2
3 1 112
3 2 1
END DATA.
CROSSTABS x BY y/STATISTICS=LAMBDA UC/CELLS=NONE.
])
AT_CHECK([pspp -o pspp.csv -o pspp.txt uc.sps])
AT_CHECK([cat pspp.csv], [0], [dnl
Table: Summary
,Cases,,,,,
,Valid,,Missing,,Total,
,N,Percent,N,Percent,N,Percent
x × y,987.000,100.0%,.000,.0%,987.000,100.0%

Table: Directional Measures
,,,Value,Asymp. Std. Error,Approx. T,Approx. Sig.
Nominal by Nominal,Lambda,Symmetric,.000,.000,NaN,NaN
,,x Dependent,.000,.000,NaN,NaN
,,y Dependent,.000,.000,NaN,NaN
,Goodman and Kruskal tau,x Dependent,.076,,,
,,y Dependent,.108,,,
,Uncertainty Coefficient,Symmetric,.105,.012,,
,,x Dependent,.073,.009,7.890,
,,y Dependent,.184,.019,7.890,
])
AT_CLEANUP

AT_SETUP([CROSSTABS estimated risk])
dnl Example data and expected output from
dnl http://www.psychology.nottingham.ac.uk/staff/ddc/c8cxpa/further/Project_resources/SPSSCrosstabW.pdf
AT_DATA([risk.sps], [dnl
DATA LIST LIST /factor disease count (F8.0).
WEIGHT BY count.
VALUE LABELS /factor 0 'Placebo' 1 'Aspirin'
             /disease 1 'No' 0 'Yes'.
BEGIN DATA.
0 1 80
0 0 20
1 1 135
1 0 15
END DATA.
CROSSTABS factor BY disease/STATISTICS=RISK CHISQ.
])
AT_CHECK([pspp -o pspp.csv -o pspp.txt risk.sps])
AT_CHECK([cat pspp.csv], [0], [dnl
Table: Reading free-form data from INLINE.
Variable,Format
factor,F8.0
disease,F8.0
count,F8.0

Table: Summary
,Cases,,,,,
,Valid,,Missing,,Total,
,N,Percent,N,Percent,N,Percent
factor × disease,250,100.0%,0,.0%,250,100.0%

Table: factor × disease
,,,disease,,Total
,,,Yes,No,
factor,Placebo,Count,20,80,100
,Aspirin,Count,15,135,150
Total,,Count,35,215,250

Table: Chi-Square Tests
,Value,df,Asymptotic Sig. (2-tailed),Exact Sig. (2-tailed),Exact Sig. (1-tailed)
Pearson Chi-Square,4.98,1,.026,,
Likelihood Ratio,4.88,1,.027,,
Fisher's Exact Test,,,,.039,.021
Continuity Correction,4.19,1,.041,,
Linear-by-Linear Association,4.96,1,.026,,
N of Valid Cases,250,,,,

Table: Risk Estimate
,Value,95% Confidence Interval,
,,Lower,Upper
Odds Ratio for factor (Placebo / Aspirin),2.25,1.09,4.64
For cohort disease = Yes,2.00,1.08,3.72
For cohort disease = No,.89,.80,.99
N of Valid Cases,250.00,,
])
AT_CLEANUP

AT_SETUP([CROSSTABS barchart])
AT_DATA([bc.sps], [dnl
SET FORMAT=F8.3.

DATA LIST LIST NOTABLE /x (a20) y (f8) z (f8) w (f8) .
BEGIN DATA.
This  1  0 416
That  2  0 121
Other 2  0 335
This  2  0 231
That  3  0 112
Other 4  0 130
This  1  1 160
That  2  1 211
Other 2  1 352
This  2  1 212
That  3  1 121
Other 4  1 101
END DATA.

WEIGHT BY w.

CROSSTABS
	  /table x BY y BY z
	  /table x BY y
	  /barchart.
])

AT_CHECK([pspp -O format=txt -o xxx bc.sps], [0], [ignore])

AT_CHECK([test -e xxx-1.png], [0], [ignore])
AT_CHECK([test -e xxx-2.png], [0], [ignore])

AT_CHECK([diff xxx-1.png xxx-2.png], [0], [ignore])

AT_CLEANUP

AT_SETUP([CROSSTABS syntax errors])
AT_DATA([crosstabs.sps], [dnl
DATA LIST LIST NOTABLE/x y v1 to v100.
CROSSTABS TABLES=x BY y/VARIABLES **.
CROSSTABS VARIABLES=**.
CROSSTABS VARIABLES=x **.
CROSSTABS VARIABLES=x (**).
CROSSTABS VARIABLES=x (1,**).
CROSSTABS VARIABLES=x (1,5**).
CROSSTABS MISSING=**.
CROSSTABS COUNT=**.
CROSSTABS FORMAT=**.
CROSSTABS CELLS=**.
CROSSTABS STATISTICS=**.
CROSSTABS **.
CROSSTABS
       v1 to v100 BY v1 to v100 BY v1 to v100 BY v1 to v100 BY v1 to v100 BY v1 to v100
    BY v1 to v100 BY v1 to v100 BY v1 to v100 BY v1 to v100 BY v1 to v100 BY v1 to v100
    BY v1 to v100 BY v1 to v100 BY v1 to v100 BY v1 to v100 BY v1 to v100 BY v1 to v100
    BY v1 to v100 BY v1 to v100 BY v1 to v100 BY v1 to v100 BY v1 to v100 BY v1 to v100
    BY v1 to v100 BY v1 to v100 BY v1 to v100 BY v1 to v100 BY v1 to v100 BY v1 to v100
    BY v1 to v100 BY v1 to v100 BY v1 to v100 BY v1 to v100 BY v1 to v100 BY v1 to v100.
CROSSTABS BARCHART.
CROSSTABS x BY y/MISSING=REPORT.
])
AT_CHECK([pspp -O format=csv crosstabs.sps], [1], [dnl
"crosstabs.sps:2.25-2.33: error: CROSSTABS: VARIABLES must be specified before TABLES.
    2 | CROSSTABS TABLES=x BY y/VARIABLES **.
      |                         ^~~~~~~~~"

"crosstabs.sps:3.21-3.22: error: CROSSTABS: Syntax error expecting variable name.
    3 | CROSSTABS VARIABLES=**.
      |                     ^~"

"crosstabs.sps:4.23-4.24: error: CROSSTABS: Syntax error expecting `('.
    4 | CROSSTABS VARIABLES=x **.
      |                       ^~"

"crosstabs.sps:5.24-5.25: error: CROSSTABS: Syntax error expecting integer.
    5 | CROSSTABS VARIABLES=x (**).
      |                        ^~"

"crosstabs.sps:6.26-6.27: error: CROSSTABS: Syntax error expecting positive integer.
    6 | CROSSTABS VARIABLES=x (1,**).
      |                          ^~"

"crosstabs.sps:7.27-7.28: error: CROSSTABS: Syntax error expecting `)'.
    7 | CROSSTABS VARIABLES=x (1,5**).
      |                           ^~"

"crosstabs.sps:8.19-8.20: error: CROSSTABS: Syntax error expecting TABLE, INCLUDE, or REPORT.
    8 | CROSSTABS MISSING=**.
      |                   ^~"

"crosstabs.sps:9.17-9.18: error: CROSSTABS: Syntax error expecting ASIS, CASE, CELL, ROUND, or TRUNCATE.
    9 | CROSSTABS COUNT=**.
      |                 ^~"

"crosstabs.sps:10.18-10.19: error: CROSSTABS: Syntax error expecting AVALUE, DVALUE, TABLES, or NOTABLES.
   10 | CROSSTABS FORMAT=**.
      |                  ^~"

"crosstabs.sps:11.17-11.18: error: CROSSTABS: Syntax error expecting COUNT, EXPECTED, ROW, COLUMN, TOTAL, RESIDUAL, SRESIDUAL, or ASRESIDUAL.
   11 | CROSSTABS CELLS=**.
      |                 ^~"

"crosstabs.sps:12.22-12.23: error: CROSSTABS: Syntax error expecting one of the following: CHISQ, PHI, CC, LAMBDA, UC, BTAU, CTAU, RISK, GAMMA, D, KAPPA, ETA, CORR.
   12 | CROSSTABS STATISTICS=**.
      |                      ^~"

"crosstabs.sps:13.11-13.12: error: CROSSTABS: Syntax error expecting subcommand name or variable name.
   13 | CROSSTABS **.
      |           ^~"

"crosstabs.sps:15.8-20.87: error: CROSSTABS: Too many cross-tabulation variables or dimensions.
   15 |        v1 to v100 BY v1 to v100 BY v1 to v100 BY v1 to v100 BY v1 to v100 BY v1 to v100
      |        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   16 |     BY v1 to v100 BY v1 to v100 BY v1 to v100 BY v1 to v100 BY v1 to v100 BY v1 to v100
      | ---------------------------------------------------------------------------------------
  ... |
   20 |     BY v1 to v100 BY v1 to v100 BY v1 to v100 BY v1 to v100 BY v1 to v100 BY v1 to v100.
      | ---------------------------------------------------------------------------------------"

crosstabs.sps:21: error: CROSSTABS: At least one crosstabulation must be requested (using the TABLES subcommand).

"crosstabs.sps:22.26-22.31: warning: CROSSTABS: Missing mode REPORT not allowed in general mode.  Assuming MISSING=TABLE.
   22 | CROSSTABS x BY y/MISSING=REPORT.
      |                          ^~~~~~"

error: CROSSTABS: At end of input: Syntax error expecting `BEGIN DATA'.
])
AT_CLEANUP