Move all command implementations into a single 'commands' directory.
[pspp] / tests / language / commands / glm.at
diff --git a/tests/language/commands/glm.at b/tests/language/commands/glm.at
new file mode 100644 (file)
index 0000000..618d2a1
--- /dev/null
@@ -0,0 +1,570 @@
+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([GLM procedure])
+
+AT_SETUP([GLM latin square design])
+AT_KEYWORDS([categorical categoricals])
+
+dnl This example comes from :
+dnl  http://ssnds.uwo.ca/statsexamples/spssanova/latinsquareresults.html
+AT_DATA([latin.sps], [dnl
+set format = F20.3.
+data list notable  fixed /a 1 b 3 c 5 y 7-10(2).
+begin data.
+1 1 6  3.5
+1 2 2  8.9
+1 3 3  9.6
+1 4 4 10.5
+1 5 5  3.1
+1 6 1  5.9
+2 1 2  4.2
+2 2 6  1.9
+2 3 5  3.7
+2 4 3 10.2
+2 5 1  7.2
+2 6 4  7.6
+3 1 1  6.7
+3 2 4  5.8
+3 3 6 -2.7
+3 4 2  4.6
+3 5 3  4.0
+3 6 5 -0.7
+4 1 4  6.6
+4 2 1  4.5
+4 3 2  3.7
+4 4 5  3.7
+4 5 6 -3.3
+4 6 3  3.0
+5 1 3  4.1
+5 2 5  2.4
+5 3 4  6.0
+5 4 1  5.1
+5 5 2  3.5
+5 6 6  4.0
+6 1 5  3.8
+6 2 3  5.8
+6 3 1  7.0
+6 4 6  3.8
+6 5 4  5.0
+6 6 2  8.6
+end data.
+
+variable labels a 'Factor A' b 'Factor B' c 'Factor C' y 'Criterion'.
+
+glm y by   b a c
+  /intercept=include
+  /criteria=alpha(.05)
+  /design = a b c
+  .
+])
+
+AT_CHECK([pspp -O format=csv latin.sps | sed 's/329.62[[678]]/329.62/'], [0],
+  [dnl
+Table: Tests of Between-Subjects Effects
+,Type III Sum Of Squares,df,Mean Square,F,Sig.
+Corrected Model,263.064,15,17.538,5.269,.000
+Intercept,815.103,1,815.103,244.910,.000
+Factor A,78.869,5,15.774,4.739,.005
+Factor B,28.599,5,5.720,1.719,.176
+Factor C,155.596,5,31.119,9.350,.000
+Error,66.563,20,3.328,,
+Total,1144.730,36,,,
+Corrected Total,329.62,35,,,
+])
+
+AT_CLEANUP
+
+AT_SETUP([GLM 2 by 2 factorial design])
+AT_KEYWORDS([categorical categoricals])
+
+AT_DATA([2by2.sps], [dnl
+set format = F20.3.
+data list notable  list /Factor0 * Factor1 * points (F10).
+begin data.
+1      4       332
+1      4       380
+1      4       371
+1      4       366
+1      4       354
+1      0       259.5
+1      0       302.5
+1      0       296
+1      0       349
+1      0       309
+2      4       354.67
+2      4       353.5
+2      4       304
+2      4       365
+2      4       339
+2      0       306
+2      0       339
+2      0       353
+2      0       351
+2      0       333
+end data.
+
+glm points by Factor0 Factor1
+  /intercept=include
+  /criteria=alpha(.05)
+  .
+])
+
+
+AT_CHECK([pspp -O format=csv 2by2.sps ], [0],
+  [dnl
+Table: Tests of Between-Subjects Effects
+,Type III Sum Of Squares,df,Mean Square,F,Sig.
+Corrected Model,8667.053,3,2889.018,5.043,.012
+Intercept,2256018.640,1,2256018.640,3937.693,.000
+Factor0,313.394,1,313.394,.547,.470
+Factor1,5157.508,1,5157.508,9.002,.008
+Factor0 × Factor1,3196.150,1,3196.150,5.579,.031
+Error,9166.865,16,572.929,,
+Total,2273852.559,20,,,
+Corrected Total,17833.918,19,,,
+])
+
+AT_CLEANUP
+
+
+AT_SETUP([GLM Type I and II Sums of Squares])
+AT_KEYWORDS([categorical categoricals])
+
+dnl  The following example comes from
+dnl  http://www.uvm.edu/~dhowell/StatPages/More_Stuff/Type1-3.pdf
+AT_DATA([data-inc.sps], [dnl
+set decimal = dot.
+set format=F20.3.
+data list notable list /dv * Agrp * B0 * B1 * B2 * i0 * i1 * i2 * sss *.
+begin data.
+5   1  1  0  0  1  0  0 1.00
+7   1  1  0  0  1  0  0 1.00
+9   1  1  0  0  1  0  0 1.00
+8   1  1  0  0  1  0  0 1.00
+2   1  0  1  0  0  1  0 1.00
+5   1  0  1  0  0  1  0 1.00
+7   1  0  1  0  0  1  0 1.00
+3   1  0  1  0  0  1  0 1.00
+9   1  0  1  0  0  1  0 1.00
+8   1  0  0  1  0  0  1 1.00
+11  1  0  0  1  0  0  1 1.00
+12  1  0  0  1  0  0  1 1.00
+14  1  0  0  1  0  0  1 1.00
+11  1 -1 -1 -1 -1 -1 -1 1.00
+15  1 -1 -1 -1 -1 -1 -1 1.00
+16  1 -1 -1 -1 -1 -1 -1 1.00
+10  1 -1 -1 -1 -1 -1 -1 1.00
+9   1 -1 -1 -1 -1 -1 -1 1.00
+7  -1  1  0  0 -1  0  0 2.00
+9  -1  1  0  0 -1  0  0 2.00
+10 -1  1  0  0 -1  0  0 2.00
+9  -1  1  0  0 -1  0  0 2.00
+3  -1  0  1  0  0 -1  0 2.00
+8  -1  0  1  0  0 -1  0 2.00
+9  -1  0  1  0  0 -1  0 2.00
+11 -1  0  1  0  0 -1  0 2.00
+9  -1  0  0  1  0  0 -1 2.00
+12 -1  0  0  1  0  0 -1 2.00
+14 -1  0  0  1  0  0 -1 2.00
+8  -1  0  0  1  0  0 -1 2.00
+7  -1  0  0  1  0  0 -1 2.00
+11 -1 -1 -1 -1  1  1  1 2.00
+14 -1 -1 -1 -1  1  1  1 2.00
+10 -1 -1 -1 -1  1  1  1 2.00
+12 -1 -1 -1 -1  1  1  1 2.00
+13 -1 -1 -1 -1  1  1  1 2.00
+11 -1 -1 -1 -1  1  1  1 2.00
+12 -1 -1 -1 -1  1  1  1 2.00
+end data.
+
+do if B0 = -1 AND B1 = -1 AND B2 = -1.
+compute Bgrp = 4.
+end if.
+
+do if B0 = 0 AND B1 = 0 AND B2 = 1.
+compute Bgrp = 3.
+end if.
+
+do if B0 = 0 AND B1 = 1 AND B2 = 0.
+compute Bgrp = 2.
+end if.
+
+do if B0 = 1 AND B1 = 0 AND B2 = 0.
+compute Bgrp = 1.
+end if.
+])
+
+AT_DATA([type1.sps], [dnl
+include 'data-inc.sps'.
+
+glm dv by Agrp Bgrp
+       /method = sstype (1)
+       .
+
+glm dv by Agrp Bgrp
+       /method = sstype (1)
+       /design Bgrp Agrp Bgrp * Agrp
+       .
+])
+
+
+AT_CHECK([pspp -O format=csv type1.sps], [0],
+  [dnl
+Table: Tests of Between-Subjects Effects
+,Type I Sum Of Squares,df,Mean Square,F,Sig.
+Corrected Model,216.017,7,30.860,5.046,.001
+Agrp,9.579,1,9.579,1.566,.220
+Bgrp,186.225,3,62.075,10.151,.000
+Agrp × Bgrp,20.212,3,6.737,1.102,.364
+Error,183.457,30,6.115,,
+Total,3810.000,38,,,
+Corrected Total,399.474,37,,,
+
+Table: Tests of Between-Subjects Effects
+,Type I Sum Of Squares,df,Mean Square,F,Sig.
+Corrected Model,216.017,7,30.860,5.046,.001
+Bgrp,193.251,3,64.417,10.534,.000
+Agrp,2.553,1,2.553,.418,.523
+Bgrp × Agrp,20.212,3,6.737,1.102,.364
+Error,183.457,30,6.115,,
+Total,3810.000,38,,,
+Corrected Total,399.474,37,,,
+])
+
+
+AT_DATA([type2.sps], [dnl
+include 'data-inc.sps'.
+
+glm dv by Agrp Bgrp
+       /method = sstype (2)
+       .
+])
+
+
+AT_CHECK([pspp -O format=csv type2.sps], [0],
+  [dnl
+Table: Tests of Between-Subjects Effects
+,Type II Sum Of Squares,df,Mean Square,F,Sig.
+Corrected Model,216.017,7,30.860,5.046,.001
+Agrp,2.553,1,2.553,.418,.523
+Bgrp,186.225,3,62.075,10.151,.000
+Agrp × Bgrp,20.212,3,6.737,1.102,.364
+Error,183.457,30,6.115,,
+Total,3810.000,38,,,
+Corrected Total,399.474,37,,,
+])
+
+AT_CLEANUP
+
+
+
+AT_SETUP([GLM excluded intercept])
+AT_KEYWORDS([categorical categoricals])
+
+dnl  The following example comes from
+dnl
+dnl Rudolf N. Cardinal
+dnl Graduate-level statistics for psychology and neuroscience
+dnl ANOVA in practice, and complex ANOVA designs
+dnl Version of 2 May 2004
+dnl
+dnl Downloaded from: http://egret.psychol.cam.ac.uk/psychology/graduate/Guide_to_ANOVA.pdf
+
+AT_DATA([intercept-exclude.sps], [dnl
+set format = F20.3.
+
+data list notable list /depvar * A *.
+begin data.
+10     1
+14     1
+8      1
+7      1
+2      1
+10     1
+1      1
+3      1
+2      1
+8.5    1
+14.29  2
+18.49  2
+12.46  2
+11.63  2
+6.66   2
+14.02  2
+5.66   2
+7.06   2
+6.37   2
+13.26  2
+end data.
+
+GLM depvar by A
+   /intercept = exclude
+  .
+
+
+GLM depvar by A
+   /intercept = include
+  .
+
+])
+
+AT_CHECK([pspp -O format=csv intercept-exclude.sps], [0],
+  [dnl
+Table: Tests of Between-Subjects Effects
+,Type III Sum Of Squares,df,Mean Square,F,Sig.
+Model,1636.826,2,818.413,43.556,.000
+A,1636.826,2,818.413,43.556,.000
+Error,338.216,18,18.790,,
+Total,1975.042,20,,,
+
+Table: Tests of Between-Subjects Effects
+,Type III Sum Of Squares,df,Mean Square,F,Sig.
+Corrected Model,98.568,1,98.568,5.246,.034
+Intercept,1538.258,1,1538.258,81.867,.000
+A,98.568,1,98.568,5.246,.034
+Error,338.216,18,18.790,,
+Total,1975.042,20,,,
+Corrected Total,436.784,19,,,
+])
+
+AT_CLEANUP
+
+
+AT_SETUP([GLM missing values])
+AT_KEYWORDS([categorical categoricals])
+
+AT_DATA([glm.data], [dnl
+1 1 6  3.5
+1 2 2  8.9
+1 3 3  9.6
+1 4 4 10.5
+1 5 5  3.1
+1 6 1  5.9
+2 1 2  4.2
+2 2 6  1.9
+2 3 5  3.7
+2 4 3 10.2
+2 5 1  7.2
+2 6 4  7.6
+3 1 1  6.7
+3 2 4  5.8
+3 3 6 -2.7
+3 4 2  4.6
+3 5 3  4.0
+3 6 5 -0.7
+4 1 4  6.6
+4 2 1  4.5
+4 3 2  3.7
+4 4 5  3.7
+4 5 6 -3.3
+4 6 3  3.0
+5 1 3  4.1
+5 2 5  2.4
+5 3 4  6.0
+5 4 1  5.1
+5 5 2  3.5
+5 6 6  4.0
+6 1 5  3.8
+6 2 3  5.8
+6 3 1  7.0
+6 4 6  3.8
+6 5 4  5.0
+6 6 2  8.6
+])
+
+AT_DATA([glm-miss.sps], [dnl
+set format = F20.3.
+data list file='glm.data' notable  fixed /a 1 b 3 c 5 y 7-10(2).
+
+do if a=6.
+recode y (else=SYSMIS).
+end if.
+
+glm y by   b a c
+  /criteria=alpha(.05)
+  /design = a b c
+  .
+])
+
+AT_CHECK([pspp -O format=csv glm-miss.sps], [0],  [dnl
+Table: Tests of Between-Subjects Effects
+,Type III Sum Of Squares,df,Mean Square,F,Sig.
+Corrected Model,251.621,14,17.973,4.969,.002
+Intercept,628.376,1,628.376,173.737,.000
+a,72.929,4,18.232,5.041,.009
+b,20.703,5,4.141,1.145,.380
+c,135.179,5,27.036,7.475,.001
+Error,54.253,15,3.617,,
+Total,934.250,30,,,
+Corrected Total,305.874,29,,,
+])
+
+
+
+AT_DATA([glm-miss2.sps], [dnl
+set format = F20.3.
+data list file='glm.data' notable  fixed /a 1 b 3 c 5 y 7-10(2).
+
+select if a <> 6.
+
+glm y by   b a c
+  /criteria=alpha(.05)
+  /design = a b c
+  .
+])
+
+AT_CHECK([pspp -O format=csv glm-miss2.sps], [0],  [dnl
+Table: Tests of Between-Subjects Effects
+,Type III Sum Of Squares,df,Mean Square,F,Sig.
+Corrected Model,251.621,14,17.973,4.969,.002
+Intercept,628.376,1,628.376,173.737,.000
+a,72.929,4,18.232,5.041,.009
+b,20.703,5,4.141,1.145,.380
+c,135.179,5,27.036,7.475,.001
+Error,54.253,15,3.617,,
+Total,934.250,30,,,
+Corrected Total,305.874,29,,,
+])
+
+
+dnl Now for some missing values in the factor variables.
+
+AT_DATA([glm-miss3.sps], [dnl
+set format = F20.3.
+data list file=glm.data notable  fixed /a 1 b 3 c 5 y 7-10(2).
+
+do if a=6.
+recode a (else=SYSMIS).
+end if.
+
+glm y by   b a c
+  /criteria=alpha(.05)
+  /design = a b c
+  .
+])
+
+AT_CHECK([pspp -O format=csv glm-miss3.sps], [0],  [dnl
+Table: Tests of Between-Subjects Effects
+,Type III Sum Of Squares,df,Mean Square,F,Sig.
+Corrected Model,251.621,14,17.973,4.969,.002
+Intercept,628.376,1,628.376,173.737,.000
+a,72.929,4,18.232,5.041,.009
+b,20.703,5,4.141,1.145,.380
+c,135.179,5,27.036,7.475,.001
+Error,54.253,15,3.617,,
+Total,934.250,30,,,
+Corrected Total,305.874,29,,,
+])
+
+AT_CLEANUP
+
+AT_SETUP([GLM syntax errors])
+AT_DATA([glm.sps], [dnl
+DATA LIST LIST NOTABLE /x y z.
+GLM **.
+GLM x **.
+GLM x BY **.
+GLM x BY y.
+GLM x y BY z.
+GLM x BY y/MISSING=**.
+GLM x BY y/INTERCEPT=**.
+GLM x BY y/CRITERIA=**.
+GLM x BY y/CRITERIA=ALPHA **.
+GLM x BY y/CRITERIA=ALPHA(**).
+GLM x BY y/CRITERIA=ALPHA(123 **).
+GLM x BY y/METHOD=**.
+GLM x BY y/METHOD=SSTYPE **.
+GLM x BY y/METHOD=SSTYPE(4).
+GLM x BY y/METHOD=SSTYPE(2 **).
+GLM x BY y/DESIGN=**.
+GLM x BY y/DESIGN=x(y).
+GLM x BY y/DESIGN=x WITHIN y.
+])
+AT_CHECK([pspp -O format=csv glm.sps], [1], [dnl
+"glm.sps:2.5-2.6: error: GLM: Syntax error expecting variable name.
+    2 | GLM **.
+      |     ^~"
+
+"glm.sps:3.7-3.8: error: GLM: Syntax error expecting `BY'.
+    3 | GLM x **.
+      |       ^~"
+
+"glm.sps:4.10-4.11: error: GLM: Syntax error expecting variable name.
+    4 | GLM x BY **.
+      |          ^~"
+
+"glm.sps:6.1-6.3: error: GLM: Syntax error expecting `BEGIN DATA'.
+    6 | GLM x y BY z.
+      | ^~~"
+
+"glm.sps:6.1-6.3: error: GLM: Syntax error expecting end of command.
+    6 | GLM x y BY z.
+      | ^~~"
+
+"glm.sps:7.20-7.21: error: GLM: Syntax error expecting INCLUDE or EXCLUDE.
+    7 | GLM x BY y/MISSING=**.
+      |                    ^~"
+
+"glm.sps:8.22-8.23: error: GLM: Syntax error expecting INCLUDE or EXCLUDE.
+    8 | GLM x BY y/INTERCEPT=**.
+      |                      ^~"
+
+"glm.sps:9.21-9.22: error: GLM: Syntax error expecting `ALPHA@{:@'.
+    9 | GLM x BY y/CRITERIA=**.
+      |                     ^~"
+
+"glm.sps:10.21-10.28: error: GLM: Syntax error expecting `ALPHA@{:@'.
+   10 | GLM x BY y/CRITERIA=ALPHA **.
+      |                     ^~~~~~~~"
+
+"glm.sps:11.27-11.28: error: GLM: Syntax error expecting number.
+   11 | GLM x BY y/CRITERIA=ALPHA(**).
+      |                           ^~"
+
+"glm.sps:12.31-12.32: error: GLM: Syntax error expecting `@:}@'.
+   12 | GLM x BY y/CRITERIA=ALPHA(123 **).
+      |                               ^~"
+
+"glm.sps:13.19-13.20: error: GLM: Syntax error expecting `SSTYPE@{:@'.
+   13 | GLM x BY y/METHOD=**.
+      |                   ^~"
+
+"glm.sps:14.19-14.27: error: GLM: Syntax error expecting `SSTYPE@{:@'.
+   14 | GLM x BY y/METHOD=SSTYPE **.
+      |                   ^~~~~~~~~"
+
+"glm.sps:15.26: error: GLM: Syntax error expecting integer between 1 and 3 for SSTYPE.
+   15 | GLM x BY y/METHOD=SSTYPE(4).
+      |                          ^"
+
+"glm.sps:16.28-16.29: error: GLM: Syntax error expecting `@:}@'.
+   16 | GLM x BY y/METHOD=SSTYPE(2 **).
+      |                            ^~"
+
+"glm.sps:17.19-17.20: error: GLM: Syntax error expecting variable name.
+   17 | GLM x BY y/DESIGN=**.
+      |                   ^~"
+
+"glm.sps:18.20: error: GLM: Nested variables are not yet implemented.
+   18 | GLM x BY y/DESIGN=x(y).
+      |                    ^"
+
+"glm.sps:19.21-19.26: error: GLM: Nested variables are not yet implemented.
+   19 | GLM x BY y/DESIGN=x WITHIN y.
+      |                     ^~~~~~"
+])
+AT_CLEANUP