Added Levene test. Added T-TEST section to pspp.texi
authorJohn Darrington <john@darrington.wattle.id.au>
Wed, 18 Feb 2004 14:13:54 +0000 (14:13 +0000)
committerJohn Darrington <john@darrington.wattle.id.au>
Wed, 18 Feb 2004 14:13:54 +0000 (14:13 +0000)
15 files changed:
doc/ChangeLog
doc/pspp.texi
po/POTFILES.in
po/en_GB.po
po/pspp.pot
src/ChangeLog
src/Makefile.am
src/levene.c [new file with mode: 0644]
src/levene.h [new file with mode: 0644]
src/t-test.h
src/t-test.q
src/val.h [new file with mode: 0644]
src/var.h
src/vars-atr.c
tests/command/t-test-groups.sh

index c6520e220968d68bb85325df735fde3172493574..3c70bf04cb556b6d9447c9b7c5e427b75eb06d75 100644 (file)
@@ -1,3 +1,7 @@
+Wed Feb 18 21:50:36 WST 2004 John Darrington <john@darrington.wattle.id.au>
+
+       * Added a section on T-TEST
+
 Mon Jan  5 12:37:03 WAST 2004 John Darrington <john@darrington.wattle.id.au>
 
        * Added documentation for the HOST command.
index c0efc83f13d846c81565d74518366d43a81dee65..582692e8bd23c183878ffc0633632caf5c0bb49e 100644 (file)
@@ -7470,6 +7470,7 @@ far.
 * DESCRIPTIVES::                Descriptive statistics.
 * FREQUENCIES::                 Frequency tables.
 * CROSSTABS::                   Crosstabulation tables.
+* T-TEST::                      Test Hypotheses about means.
 @end menu
 
 @node DESCRIPTIVES, FREQUENCIES, Statistics, Statistics
@@ -7663,7 +7664,7 @@ NTILES causes the specified quartiles to be reported.  For instance,
 @code{/NTILES=4} would cause quartiles to be reported.  In addition,
 particular percentiles can be requested with the PERCENTILES subcommand.
 
-@node CROSSTABS,  , FREQUENCIES, Statistics
+@node CROSSTABS, T-TEST, FREQUENCIES, Statistics
 @section CROSSTABS
 
 @display
@@ -7842,6 +7843,118 @@ Approximate T of uncertainty coefficient is wrong.
 
 Fixes for any of these deficiencies would be welcomed.
 
+@node T-TEST, , CROSSTABS, Statistics
+@comment  node-name,  next,  previous,  up
+
+@section T-TEST
+
+@display
+T-TEST
+        /MISSING=@{ANALYSIS,LISTWISE@} @{EXCLUDE,INCLUDE@}
+        /CRITERIA=CIN(confidence)
+
+
+(One Sample mode.)
+        TESTVAL=test_value
+        /VARIABLES=var_list
+
+
+(Independent Samples mode.)
+        GROUPS=var(value1 [, value2])
+        /VARIABLES=var_list
+
+
+(Paired Samples mode.)
+        PAIRS=var_list [WITH var_list [(PAIRED)] ]
+
+@end display
+
+
+The @cmd{T-TEST} procedure outputs tables used in testing hypotheses about 
+means.  
+It operates in one of three modes:
+@itemize
+@item One Sample mode.
+@item Independent Groups mode.
+@item Paired mode.
+@end itemize
+
+@noindent
+Each of these modes are described in more detail below.
+There are two optional subcommands which are common to all modes.
+
+The @cmd{/CRITERIA} subcommand tells PSPP the confidence interval used
+in the tests.  The default value is 0.95.
+
+
+The @cmd{MISSING} subcommand determines the handling of missing
+variables.  
+If INCLUDE is set, then user-missing values are included in the
+calculations.  
+If EXCLUDE is set, which is the default, user-missing
+values are excluded.  
+If LISTWISE is set, then
+the entire case is excluded whenever any value in that case has a
+system-missing or, if INCLUDE is set, user-missing value.
+If ANALYSIS is set, then cases are excluded only where a value used in
+the analysis has a system-missing or, if INCLUDE is set, user-missing value.
+
+
+@menu
+* One Sample Mode::              Testing against a hypothesised mean
+* Independent Samples Mode::     Testing two independent groups for the same mean
+* Paired Samples Mode::          Testing two interdependet groups for the same mean
+@end menu
+
+@node One Sample Mode, Independent Samples Mode, T-TEST, T-TEST
+@comment  node-name,  next,  previous,  up
+
+@subsection One Sample Mode
+
+The @cmd{TESTVAL} subcommand invokes the One Sample mode.
+This mode is used to test a population mean against a hypothesised
+mean. 
+The value given to the @cmd{TESTVAL} subcommand is the value against
+which you wish to test.
+In this mode, you must also use the @cmd{/VARIABLES} subcommand to
+tell PSPP which variables you wish to test.
+
+@node Independent Samples Mode, Paired Samples Mode, One Sample Mode, T-TEST
+@comment  node-name,  next,  previous,  up
+@subsection Independent Samples Mode
+
+The @cmd{GROUPS} subcommand invokes Independent Samples mode or
+`Groups' mode. 
+This mode is used to test whether two groups of values have the
+same population mean.
+The variable given in the @cmd{GROUPS} subcommand is the independent
+variable which determines to which group the samples belong.
+The values in parentheses are the specific values of the independent
+variable for each group.
+In this mode, you must also use the @cmd{/VARIABLES} subcommand to
+tell PSPP the dependent variables you wish to test.
+
+@node Paired Samples Mode, , Independent Samples Mode, T-TEST
+@comment  node-name,  next,  previous,  up
+@subsection Paired Samples Mode
+
+The @cmd{PAIRS} subcommand introduces Paired Samples mode.
+Use this mode when repeated measures have been taken from the same
+samples.
+If the the @code{WITH} keyword is omitted, then tables for all
+combinations of variables given in the @cmd{PAIRS} subcommand are
+generated. 
+If the @code{WITH} keyword is given, and the @code{(PAIRED)} keyword
+is also given, then the number of variables preceding @code{WITH}
+must be the same as the number following it.
+In this case, tables for each respective pair of variables are
+generated.
+In the event that the @code{WITH} keyword is given, but the
+@code{(PAIRED)} keyword is omitted, then tables for each combination
+of variable preceding @code{WITH} against variable following
+@code{WITH} are generated.
+
+
 @node Utilities, Not Implemented, Statistics, Top
 @chapter Utilities
 
index b71f4f6f9cb044a5cb11eeae857a260fe254a44a..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 (file)
@@ -1,85 +0,0 @@
-src/correlations.q
-src/crosstabs.q
-src/descript.q
-src/file-handle.q
-src/frequencies.q
-src/list.q
-src/means.q
-src/set.q
-src/t-test.q
-src/aggregate.c
-src/algorithm.c
-src/alloc.c
-src/apply-dict.c
-src/ascii.c
-src/autorecode.c
-src/cases.c
-src/cmdline.c
-src/command.c
-src/compute.c
-src/count.c
-src/data-in.c
-src/data-list.c
-src/data-out.c
-src/dfm.c
-src/do-if.c
-src/error.c
-src/expr-evl.c
-src/expr-opt.c
-src/expr-prs.c
-src/file-type.c
-src/filename.c
-src/flip.c
-src/format.c
-src/formats.c
-src/get.c
-src/getline.c
-src/glob.c
-src/groff-font.c
-src/hash.c
-src/heap.c
-src/html.c
-src/include.c
-src/inpt-pgm.c
-src/lexer.c
-src/loop.c
-src/magic.c
-src/main.c
-src/matrix-data.c
-src/matrix.c
-src/mis-val.c
-src/misc.c
-src/modify-vars.c
-src/numeric.c
-src/output.c
-src/pfm-read.c
-src/pfm-write.c
-src/pool.c
-src/postscript.c
-src/print.c
-src/random.c
-src/recode.c
-src/rename-vars.c
-src/repeat.c
-src/sample.c
-src/sel-if.c
-src/sfm-read.c
-src/sfm-write.c
-src/som.c
-src/sort.c
-src/split-file.c
-src/stats.c
-src/str.c
-src/sysfile-info.c
-src/tab.c
-src/temporary.c
-src/title.c
-src/val-labs.c
-src/value-labels.c
-src/var-labs.c
-src/vars-atr.c
-src/vars-prs.c
-src/vector.c
-src/version.c
-src/vfm.c
-src/weight.c
index 7b40941297abe4f51b81039ddb78d648b602243e..7e293a06042496eb771d74d5180a3962299686de 100644 (file)
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PSPP 0.3.1\n"
 "Report-Msgid-Bugs-To: pspp-dev@gnu.org\n"
-"POT-Creation-Date: 2004-02-12 19:27+0800\n"
+"POT-Creation-Date: 2004-02-17 17:30+0800\n"
 "PO-Revision-Date: 2004-01-23 13:04+0800\n"
 "Last-Translator: John Darrington <john@darrington.wattle.id.au>\n"
 "Language-Team: John Darrington <john@darrington.wattle.id.au>\n"
@@ -16,276 +16,276 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n!=1);\n"
 
-#: src/crosstabs.q:254
+#: src/crosstabs.q:257
 msgid ""
 "Missing mode REPORT not allowed in general mode.  Assuming MISSING=TABLE."
 msgstr ""
 
-#: src/crosstabs.q:264
+#: src/crosstabs.q:267
 msgid "Write mode ALL not allowed in general mode.  Assuming WRITE=CELLS."
 msgstr ""
 
-#: src/crosstabs.q:323
+#: src/crosstabs.q:327
 msgid "expecting BY"
 msgstr ""
 
-#: src/crosstabs.q:390
+#: src/crosstabs.q:394
 msgid "VARIABLES must be specified before TABLES."
 msgstr ""
 
-#: src/crosstabs.q:427
+#: src/crosstabs.q:431
 #, c-format
 msgid "Maximum value (%ld) less than minimum value (%ld)."
 msgstr ""
 
-#: src/crosstabs.q:864
+#: src/crosstabs.q:865
 msgid "Summary."
 msgstr ""
 
-#: src/crosstabs.q:866
+#: src/crosstabs.q:867
 msgid "Cases"
 msgstr ""
 
-#: src/crosstabs.q:867 src/frequencies.q:999
+#: src/crosstabs.q:868 src/frequencies.q:999
 msgid "Valid"
 msgstr ""
 
-#: src/crosstabs.q:868 src/frequencies.q:1066
+#: src/crosstabs.q:869 src/frequencies.q:1066
 msgid "Missing"
 msgstr ""
 
-#: src/crosstabs.q:869 src/crosstabs.q:1070 src/crosstabs.q:1799
+#: src/crosstabs.q:870 src/crosstabs.q:1073 src/crosstabs.q:1806
 #: src/frequencies.q:1075
 msgid "Total"
 msgstr ""
 
-#: src/crosstabs.q:879 src/t-test.q:623 src/t-test.q:646 src/t-test.q:726
+#: src/crosstabs.q:880 src/t-test.q:623 src/t-test.q:646 src/t-test.q:726
 #: src/t-test.q:1297
 msgid "N"
 msgstr ""
 
-#: src/crosstabs.q:880 src/frequencies.q:1003 src/frequencies.q:1004
+#: src/crosstabs.q:881 src/frequencies.q:1003 src/frequencies.q:1004
 #: src/frequencies.q:1005
 msgid "Percent"
 msgstr ""
 
-#: src/crosstabs.q:1119
+#: src/crosstabs.q:1123
 msgid "count"
 msgstr ""
 
-#: src/crosstabs.q:1120
+#: src/crosstabs.q:1124
 msgid "row %"
 msgstr ""
 
-#: src/crosstabs.q:1121
+#: src/crosstabs.q:1125
 msgid "column %"
 msgstr ""
 
-#: src/crosstabs.q:1122
+#: src/crosstabs.q:1126
 msgid "total %"
 msgstr ""
 
-#: src/crosstabs.q:1123
+#: src/crosstabs.q:1127
 msgid "expected"
 msgstr ""
 
-#: src/crosstabs.q:1124
+#: src/crosstabs.q:1128
 msgid "residual"
 msgstr ""
 
-#: src/crosstabs.q:1125
+#: src/crosstabs.q:1129
 msgid "std. resid."
 msgstr ""
 
-#: src/crosstabs.q:1126
+#: src/crosstabs.q:1130
 msgid "adj. resid."
 msgstr ""
 
-#: src/crosstabs.q:1159 src/crosstabs.q:1186 src/crosstabs.q:1206
-#: src/crosstabs.q:1227
+#: src/crosstabs.q:1163 src/crosstabs.q:1190 src/crosstabs.q:1210
+#: src/crosstabs.q:1231
 msgid "Statistic"
 msgstr ""
 
-#: src/crosstabs.q:1160 src/crosstabs.q:1187 src/crosstabs.q:1207
-#: src/crosstabs.q:1229 src/frequencies.q:1001 src/frequencies.q:1118
-#: src/sysfile-info.c:536 src/vfm.c:1094
+#: src/crosstabs.q:1164 src/crosstabs.q:1191 src/crosstabs.q:1211
+#: src/crosstabs.q:1233 src/frequencies.q:1001 src/frequencies.q:1118
+#: src/sysfile-info.c:536 src/vfm.c:1082
 msgid "Value"
 msgstr ""
 
-#: src/crosstabs.q:1161 src/t-test.q:879 src/t-test.q:1067 src/t-test.q:1181
+#: src/crosstabs.q:1165 src/t-test.q:879 src/t-test.q:1067 src/t-test.q:1181
 msgid "df"
 msgstr ""
 
-#: src/crosstabs.q:1163
+#: src/crosstabs.q:1167
 msgid "Asymp. Sig. (2-sided)"
 msgstr ""
 
-#: src/crosstabs.q:1165
+#: src/crosstabs.q:1169
 msgid "Exact. Sig. (2-sided)"
 msgstr ""
 
-#: src/crosstabs.q:1167
+#: src/crosstabs.q:1171
 msgid "Exact. Sig. (1-sided)"
 msgstr ""
 
-#: src/crosstabs.q:1185 src/crosstabs.q:1226
+#: src/crosstabs.q:1189 src/crosstabs.q:1230
 msgid "Category"
 msgstr ""
 
-#: src/crosstabs.q:1188 src/crosstabs.q:1230
+#: src/crosstabs.q:1192 src/crosstabs.q:1234
 msgid "Asymp. Std. Error"
 msgstr ""
 
-#: src/crosstabs.q:1189 src/crosstabs.q:1231
+#: src/crosstabs.q:1193 src/crosstabs.q:1235
 msgid "Approx. T"
 msgstr ""
 
-#: src/crosstabs.q:1190 src/crosstabs.q:1232
+#: src/crosstabs.q:1194 src/crosstabs.q:1236
 msgid "Approx. Sig."
 msgstr ""
 
-#: src/crosstabs.q:1205
+#: src/crosstabs.q:1209
 #, c-format
 msgid " 95%% Confidence Interval"
 msgstr ""
 
-#: src/crosstabs.q:1208 src/t-test.q:883 src/t-test.q:1064 src/t-test.q:1184
+#: src/crosstabs.q:1212 src/t-test.q:883 src/t-test.q:1064 src/t-test.q:1184
 msgid "Lower"
 msgstr ""
 
-#: src/crosstabs.q:1209 src/t-test.q:884 src/t-test.q:1065 src/t-test.q:1185
+#: src/crosstabs.q:1213 src/t-test.q:884 src/t-test.q:1065 src/t-test.q:1185
 msgid "Upper"
 msgstr ""
 
-#: src/crosstabs.q:1228
+#: src/crosstabs.q:1232
 msgid "Type"
 msgstr ""
 
-#: src/crosstabs.q:1976
+#: src/crosstabs.q:1983
 msgid "Pearson Chi-Square"
 msgstr ""
 
-#: src/crosstabs.q:1977
+#: src/crosstabs.q:1984
 msgid "Likelihood Ratio"
 msgstr ""
 
-#: src/crosstabs.q:1978
+#: src/crosstabs.q:1985
 msgid "Fisher's Exact Test"
 msgstr ""
 
-#: src/crosstabs.q:1979
+#: src/crosstabs.q:1986
 msgid "Continuity Correction"
 msgstr ""
 
-#: src/crosstabs.q:1980
+#: src/crosstabs.q:1987
 msgid "Linear-by-Linear Association"
 msgstr ""
 
-#: src/crosstabs.q:2017 src/crosstabs.q:2087 src/crosstabs.q:2146
+#: src/crosstabs.q:2024 src/crosstabs.q:2094 src/crosstabs.q:2153
 msgid "N of Valid Cases"
 msgstr ""
 
-#: src/crosstabs.q:2033 src/crosstabs.q:2162
+#: src/crosstabs.q:2040 src/crosstabs.q:2169
 msgid "Nominal by Nominal"
 msgstr ""
 
-#: src/crosstabs.q:2034 src/crosstabs.q:2163
+#: src/crosstabs.q:2041 src/crosstabs.q:2170
 msgid "Ordinal by Ordinal"
 msgstr ""
 
-#: src/crosstabs.q:2035
+#: src/crosstabs.q:2042
 msgid "Interval by Interval"
 msgstr ""
 
-#: src/crosstabs.q:2036
+#: src/crosstabs.q:2043
 msgid "Measure of Agreement"
 msgstr ""
 
-#: src/crosstabs.q:2041
+#: src/crosstabs.q:2048
 msgid "Phi"
 msgstr ""
 
-#: src/crosstabs.q:2042
+#: src/crosstabs.q:2049
 msgid "Cramer's V"
 msgstr ""
 
-#: src/crosstabs.q:2043
+#: src/crosstabs.q:2050
 msgid "Contingency Coefficient"
 msgstr ""
 
-#: src/crosstabs.q:2044
+#: src/crosstabs.q:2051
 msgid "Kendall's tau-b"
 msgstr ""
 
-#: src/crosstabs.q:2045
+#: src/crosstabs.q:2052
 msgid "Kendall's tau-c"
 msgstr ""
 
-#: src/crosstabs.q:2046
+#: src/crosstabs.q:2053
 msgid "Gamma"
 msgstr ""
 
-#: src/crosstabs.q:2047
+#: src/crosstabs.q:2054
 msgid "Spearman Correlation"
 msgstr ""
 
-#: src/crosstabs.q:2048
+#: src/crosstabs.q:2055
 msgid "Pearson's R"
 msgstr ""
 
-#: src/crosstabs.q:2049
+#: src/crosstabs.q:2056
 msgid "Kappa"
 msgstr ""
 
-#: src/crosstabs.q:2119
+#: src/crosstabs.q:2126
 #, c-format
 msgid "Odds Ratio for %s (%g / %g)"
 msgstr ""
 
-#: src/crosstabs.q:2122
+#: src/crosstabs.q:2129
 #, c-format
 msgid "Odds Ratio for %s (%.*s / %.*s)"
 msgstr ""
 
-#: src/crosstabs.q:2130
+#: src/crosstabs.q:2137
 #, c-format
 msgid "For cohort %s = %g"
 msgstr ""
 
-#: src/crosstabs.q:2133
+#: src/crosstabs.q:2140
 #, c-format
 msgid "For cohort %s = %.*s"
 msgstr ""
 
-#: src/crosstabs.q:2164
+#: src/crosstabs.q:2171
 msgid "Nominal by Interval"
 msgstr ""
 
-#: src/crosstabs.q:2169
+#: src/crosstabs.q:2176
 msgid "Lambda"
 msgstr ""
 
-#: src/crosstabs.q:2170
+#: src/crosstabs.q:2177
 msgid "Goodman and Kruskal tau"
 msgstr ""
 
-#: src/crosstabs.q:2171
+#: src/crosstabs.q:2178
 msgid "Uncertainty Coefficient"
 msgstr ""
 
-#: src/crosstabs.q:2172
+#: src/crosstabs.q:2179
 msgid "Somers' d"
 msgstr ""
 
-#: src/crosstabs.q:2173
+#: src/crosstabs.q:2180
 msgid "Eta"
 msgstr ""
 
-#: src/crosstabs.q:2178
+#: src/crosstabs.q:2185
 msgid "Symmetric"
 msgstr ""
 
-#: src/crosstabs.q:2179 src/crosstabs.q:2180
+#: src/crosstabs.q:2186 src/crosstabs.q:2187
 #, c-format
 msgid "%s Dependent"
 msgstr ""
@@ -506,8 +506,8 @@ msgstr ""
 msgid "Z-score of "
 msgstr ""
 
-#: src/descript.q:792 src/data-list.c:732 src/data-list.c:869 src/print.c:801
-#: src/sysfile-info.c:135 src/sysfile-info.c:370 src/vfm.c:1093
+#: src/descript.q:792 src/data-list.c:736 src/data-list.c:877 src/print.c:801
+#: src/sysfile-info.c:135 src/sysfile-info.c:370 src/vfm.c:1081
 msgid "Variable"
 msgstr ""
 
@@ -532,10 +532,10 @@ msgid ""
 msgstr ""
 
 #: src/file-handle.q:88 src/autorecode.c:121 src/command.c:696
-#: src/compute.c:284 src/data-list.c:372 src/data-list.c:842
-#: src/data-list.c:1645 src/do-if.c:264 src/get.c:359 src/lexer.c:387
-#: src/loop.c:248 src/matrix-data.c:506 src/print.c:336 src/print.c:1064
-#: src/recode.c:409 src/sel-if.c:56 src/sel-if.c:136 src/vector.c:197
+#: src/compute.c:283 src/data-list.c:370 src/data-list.c:850
+#: src/data-list.c:1666 src/do-if.c:264 src/get.c:359 src/lexer.c:387
+#: src/loop.c:248 src/matrix-data.c:503 src/print.c:336 src/print.c:1057
+#: src/recode.c:408 src/sel-if.c:56 src/sel-if.c:136 src/vector.c:194
 msgid "expecting end of command"
 msgstr ""
 
@@ -1007,9 +1007,9 @@ msgstr ""
 msgid "%s & %s"
 msgstr ""
 
-#: src/aggregate.c:188 src/aggregate.c:229 src/data-list.c:1321
-#: src/data-list.c:1356 src/data-list.c:1369 src/data-list.c:1382
-#: src/data-list.c:1415
+#: src/aggregate.c:188 src/aggregate.c:229 src/data-list.c:1341
+#: src/data-list.c:1376 src/data-list.c:1389 src/data-list.c:1402
+#: src/data-list.c:1435
 #, c-format
 msgid "%s subcommand given multiple times."
 msgstr ""
@@ -1022,41 +1022,41 @@ msgstr ""
 msgid "BREAK subcommand not specified."
 msgstr ""
 
-#: src/aggregate.c:494
+#: src/aggregate.c:492
 msgid "expecting aggregation function"
 msgstr ""
 
-#: src/aggregate.c:510
+#: src/aggregate.c:508
 #, c-format
 msgid "Unknown aggregation function %s."
 msgstr ""
 
-#: src/aggregate.c:525
+#: src/aggregate.c:523
 msgid "expecting `('"
 msgstr ""
 
-#: src/aggregate.c:560
+#: src/aggregate.c:558
 #, c-format
 msgid "Missing argument %d to %s."
 msgstr ""
 
-#: src/aggregate.c:568
+#: src/aggregate.c:566
 #, c-format
 msgid "Arguments to %s must be of same type as source variables."
 msgstr ""
 
-#: src/aggregate.c:578 src/expr-prs.c:665
+#: src/aggregate.c:576 src/expr-prs.c:665
 msgid "expecting `)'"
 msgstr ""
 
-#: src/aggregate.c:590 src/autorecode.c:110
+#: src/aggregate.c:588 src/autorecode.c:110
 #, c-format
 msgid ""
 "Number of source variables (%d) does not match number of target variables (%"
 "d)."
 msgstr ""
 
-#: src/aggregate.c:657
+#: src/aggregate.c:655
 #, c-format
 msgid ""
 "Variable name %s is not unique within the aggregate file dictionary, which "
@@ -1382,25 +1382,25 @@ msgstr ""
 msgid "This command is not valid in a syntax file."
 msgstr ""
 
-#: src/compute.c:141 src/compute.c:200
+#: src/compute.c:140 src/compute.c:199
 #, c-format
 msgid ""
 "When executing COMPUTE: SYSMIS is not a valid value as an index into vector %"
 "s."
 msgstr ""
 
-#: src/compute.c:144 src/compute.c:204
+#: src/compute.c:143 src/compute.c:203
 #, c-format
 msgid ""
 "When executing COMPUTE: %g is not a valid value as an index into vector %s."
 msgstr ""
 
-#: src/compute.c:343
+#: src/compute.c:342
 #, c-format
 msgid "There is no vector named %s."
 msgstr ""
 
-#: src/compute.c:449
+#: src/compute.c:441
 msgid "Extra characters after expression."
 msgstr ""
 
@@ -1408,7 +1408,7 @@ msgstr ""
 msgid "Destination cannot be a string variable."
 msgstr ""
 
-#: src/count.c:286
+#: src/count.c:283
 #, c-format
 msgid ""
 "%g THRU %g is not a valid range.  The number following THRU must be at least "
@@ -1596,65 +1596,65 @@ msgstr ""
 msgid "Field too long (%d characters).  Truncated after character %d."
 msgstr ""
 
-#: src/data-list.c:137
+#: src/data-list.c:138
 msgid ""
 "DATA LIST may not use a different file from that specified on its "
 "surrounding FILE TYPE."
 msgstr ""
 
-#: src/data-list.c:156
+#: src/data-list.c:157
 msgid "The END subcommand may only be specified once."
 msgstr ""
 
-#: src/data-list.c:195
+#: src/data-list.c:193
 msgid "Only one of FIXED, FREE, or LIST may be specified."
 msgstr ""
 
-#: src/data-list.c:321 src/print.c:297
+#: src/data-list.c:319 src/print.c:297
 #, c-format
 msgid ""
 "The record number specified, %ld, is before the previous record, %d.  Data "
 "fields must be listed in order of increasing record number."
 msgstr ""
 
-#: src/data-list.c:353 src/data-list.c:1634
+#: src/data-list.c:351 src/data-list.c:1655
 msgid ""
 "SPSS-like or FORTRAN-like format specification expected after variable names."
 msgstr ""
 
-#: src/data-list.c:364 src/print.c:329
+#: src/data-list.c:362 src/print.c:329
 msgid ""
 "Variables are specified on records that should not exist according to "
 "RECORDS subcommand."
 msgstr ""
 
-#: src/data-list.c:396 src/data-list.c:409 src/print.c:506 src/print.c:519
+#: src/data-list.c:394 src/data-list.c:407 src/print.c:506 src/print.c:519
 msgid "Column positions for fields must be positive."
 msgstr ""
 
-#: src/data-list.c:414
+#: src/data-list.c:412
 msgid "The ending column for a field must be greater than the starting column."
 msgstr ""
 
-#: src/data-list.c:438 src/print.c:547
+#: src/data-list.c:436 src/print.c:547
 msgid "A format specifier on this line has extra characters on the end."
 msgstr ""
 
-#: src/data-list.c:453 src/print.c:563
+#: src/data-list.c:451 src/print.c:563
 msgid "The value for number of decimal places must be at least 1."
 msgstr ""
 
-#: src/data-list.c:467 src/print.c:576
+#: src/data-list.c:465 src/print.c:576
 #, c-format
 msgid "Input format %s doesn't accept decimal places."
 msgstr ""
 
-#: src/data-list.c:488 src/print.c:596
+#: src/data-list.c:486 src/print.c:596
 #, c-format
 msgid "The %d columns %d-%d can't be evenly divided into %d fields."
 msgstr ""
 
-#: src/data-list.c:528 src/data-list.c:625 src/data-list.c:825
+#: src/data-list.c:528 src/data-list.c:625 src/data-list.c:829
 #, c-format
 msgid "%s is a duplicate variable name."
 msgstr ""
@@ -1675,233 +1675,233 @@ msgid ""
 "given."
 msgstr ""
 
-#: src/data-list.c:698 src/print.c:769
+#: src/data-list.c:702 src/print.c:769
 msgid ""
 "There aren't enough format specifications to match the number of variable "
 "names given."
 msgstr ""
 
-#: src/data-list.c:733 src/print.c:802
+#: src/data-list.c:737 src/print.c:802
 msgid "Record"
 msgstr ""
 
-#: src/data-list.c:734 src/print.c:803
+#: src/data-list.c:738 src/print.c:803
 msgid "Columns"
 msgstr ""
 
-#: src/data-list.c:735 src/data-list.c:870 src/print.c:804
+#: src/data-list.c:739 src/data-list.c:878 src/print.c:804
 msgid "Format"
 msgstr ""
 
-#: src/data-list.c:758
+#: src/data-list.c:762
 #, c-format
 msgid "Reading %d record from file %s."
 msgid_plural "Reading %d records from file %s."
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/data-list.c:761
+#: src/data-list.c:765
 #, c-format
 msgid "Reading %d record from the command file."
 msgid_plural "Reading %d records from the command file."
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/data-list.c:768 src/data-list.c:769
+#: src/data-list.c:772 src/data-list.c:773
 msgid "Occurrence data specifications."
 msgstr ""
 
-#: src/data-list.c:893
+#: src/data-list.c:901
 #, c-format
 msgid "Reading free-form data from file %s."
 msgstr ""
 
-#: src/data-list.c:894
+#: src/data-list.c:902
 msgid "Reading free-form data from the command file."
 msgstr ""
 
-#: src/data-list.c:945 src/matrix-data.c:939
+#: src/data-list.c:953 src/matrix-data.c:935
 msgid "Scope of string exceeds line."
 msgstr ""
 
-#: src/data-list.c:1006
+#: src/data-list.c:1013
 msgid "Attempt to read past end of file."
 msgstr ""
 
-#: src/data-list.c:1035
+#: src/data-list.c:1042
 msgid "abort in write_case()\n"
 msgstr ""
 
-#: src/data-list.c:1063
+#: src/data-list.c:1070
 #, c-format
 msgid "Partial case of %d of %d records discarded."
 msgstr ""
 
-#: src/data-list.c:1112
+#: src/data-list.c:1119
 #, c-format
 msgid "Partial case discarded.  The first variable missing was %s."
 msgstr ""
 
-#: src/data-list.c:1153
+#: src/data-list.c:1160
 #, c-format
 msgid ""
 "Missing value(s) for all variables from %s onward.  These will be filled "
 "with the system-missing value or blanks, as appropriate."
 msgstr ""
 
-#: src/data-list.c:1311
+#: src/data-list.c:1331
 msgid ""
 "REPEATING DATA must use the same file as its corresponding DATA LIST or FILE "
 "TYPE."
 msgstr ""
 
-#: src/data-list.c:1345
+#: src/data-list.c:1365
 #, c-format
 msgid "STARTS beginning column (%d) exceeds STARTS ending column (%d)."
 msgstr ""
 
-#: src/data-list.c:1401
+#: src/data-list.c:1421
 #, c-format
 msgid "CONTINUED beginning column (%d) exceeds CONTINUED ending column (%d)."
 msgstr ""
 
-#: src/data-list.c:1424
+#: src/data-list.c:1444
 #, c-format
 msgid "ID beginning column (%ld) must be positive."
 msgstr ""
 
-#: src/data-list.c:1439
+#: src/data-list.c:1459
 #, c-format
 msgid "ID ending column (%ld) must be positive."
 msgstr ""
 
-#: src/data-list.c:1445
+#: src/data-list.c:1465
 #, c-format
 msgid "ID ending column (%ld) cannot be less than ID beginning column (%d)."
 msgstr ""
 
-#: src/data-list.c:1484
+#: src/data-list.c:1505
 msgid "Missing required specification STARTS."
 msgstr ""
 
-#: src/data-list.c:1486
+#: src/data-list.c:1507
 msgid "Missing required specification OCCURS."
 msgstr ""
 
-#: src/data-list.c:1493
+#: src/data-list.c:1514
 msgid "ID specified without CONTINUED."
 msgstr ""
 
-#: src/data-list.c:1581
+#: src/data-list.c:1602
 msgid "String variable not allowed here."
 msgstr ""
 
-#: src/data-list.c:1591
+#: src/data-list.c:1612
 #, c-format
 msgid "%s (%d) must be at least 1."
 msgstr ""
 
-#: src/data-list.c:1597
+#: src/data-list.c:1618
 #, c-format
 msgid "Variable or integer expected for %s."
 msgstr ""
 
-#: src/data-list.c:1736
+#: src/data-list.c:1753
 #, c-format
-msgid "Mismatched case ID (%s).  Expected value was %s."
+msgid "Encountered mismatched record ID \"%s\" expecting \"%s\"."
 msgstr ""
 
-#: src/data-list.c:1768
+#: src/data-list.c:1785
 #, c-format
 msgid ""
 "Variable %s starting in column %d extends beyond physical record length of %"
 "d."
 msgstr ""
 
-#: src/data-list.c:1836
+#: src/data-list.c:1853
 #, c-format
 msgid "Invalid value %d for OCCURS."
 msgstr ""
 
-#: src/data-list.c:1842
+#: src/data-list.c:1859
 #, c-format
 msgid "Beginning column for STARTS (%d) must be at least 1."
 msgstr ""
 
-#: src/data-list.c:1850
+#: src/data-list.c:1867
 #, c-format
 msgid "Ending column for STARTS (%d) is less than beginning column (%d)."
 msgstr ""
 
-#: src/data-list.c:1858
+#: src/data-list.c:1875
 #, c-format
 msgid "Invalid value %d for LENGTH."
 msgstr ""
 
-#: src/data-list.c:1865
+#: src/data-list.c:1882
 #, c-format
 msgid "Beginning column for CONTINUED (%d) must be at least 1."
 msgstr ""
 
-#: src/data-list.c:1873
+#: src/data-list.c:1890
 #, c-format
 msgid "Ending column for CONTINUED (%d) is less than beginning column (%d)."
 msgstr ""
 
-#: src/data-list.c:1896
+#: src/data-list.c:1913
 #, c-format
 msgid ""
 "Number of repetitions specified on OCCURS (%d) exceed number of repetitions "
 "available in space on STARTS (%d), and CONTINUED not specified."
 msgstr ""
 
-#: src/data-list.c:1913
+#: src/data-list.c:1930
 #, c-format
 msgid "Unexpected end of file with %d repetitions remaining out of %d."
 msgstr ""
 
-#: src/data-out.c:143 src/sfm-read.c:470 src/sysfile-info.c:116
+#: src/data-out.c:232 src/sfm-read.c:470 src/sysfile-info.c:116
 msgid "Unknown"
 msgstr ""
 
-#: src/data-out.c:251
+#: src/data-out.c:340
 msgid ""
 "The N output format cannot be used to output a negative number or the system-"
 "missing value."
 msgstr ""
 
-#: src/data-out.c:362
+#: src/data-out.c:451
 #, c-format
 msgid ""
 "Quality of zoned decimal (Z) output format code is suspect.  Check your "
 "results. Report bugs to %s."
 msgstr ""
 
-#: src/data-out.c:369
+#: src/data-out.c:459
 msgid "The system-missing value cannot be output as a zoned decimal number."
 msgstr ""
 
-#: src/data-out.c:382
+#: src/data-out.c:472
 #, c-format
 msgid "Number %g too big to fit in field with format Z%d.%d."
 msgstr ""
 
-#: src/data-out.c:774
+#: src/data-out.c:864
 #, c-format
 msgid "Time value %g too large in magnitude to convert to alphanumeric time."
 msgstr ""
 
-#: src/data-out.c:827
+#: src/data-out.c:915
 #, c-format
-msgid "Weekday index %d does not lie between 1 and 7."
+msgid "Weekday index %f does not lie between 1 and 7."
 msgstr ""
 
-#: src/data-out.c:848
+#: src/data-out.c:935
 #, c-format
-msgid "Month index %d does not lie between 1 and 12."
+msgid "Month index %f does not lie between 1 and 12."
 msgstr ""
 
-#: src/data-out.c:960
+#: src/data-out.c:1048
 #, c-format
 msgid ""
 "Year %d cannot be represented in four digits for output formatting purposes."
@@ -2082,51 +2082,41 @@ msgstr ""
 msgid "installation error"
 msgstr ""
 
-#: src/expr-evl.c:1125
+#: src/expr-evl.c:1118
 msgid ""
 "A number being treated as a Boolean in an expression was found to have a "
 "value other than 0 (false), 1 (true), or the system-missing value.  The "
 "result was forced to 0."
 msgstr ""
 
-#: src/expr-evl.c:1169
+#: src/expr-evl.c:1162
 #, c-format
 msgid ""
 "SYSMIS is not a valid index value for vector %s.  The result will be set to "
 "SYSMIS."
 msgstr ""
 
-#: src/expr-evl.c:1173
+#: src/expr-evl.c:1166
 #, c-format
 msgid ""
 "%g is not a valid index value for vector %s.  The result will be set to "
 "SYSMIS."
 msgstr ""
 
-#: src/expr-evl.c:1191
+#: src/expr-evl.c:1184
 #, c-format
 msgid ""
 "SYSMIS is not a valid index value for vector %s.  The result will be set to "
 "the empty string."
 msgstr ""
 
-#: src/expr-evl.c:1196
+#: src/expr-evl.c:1189
 #, c-format
 msgid ""
 "%g is not a valid index value for vector %s.  The result will be set to the "
 "empty string."
 msgstr ""
 
-#: src/expr-evl.c:1296
-#, c-format
-msgid "evaluate_expression(): not implemented: %s\n"
-msgstr ""
-
-#: src/expr-evl.c:1299
-#, c-format
-msgid "evaluate_expression(): not implemented: %d\n"
-msgstr ""
-
 #: src/expr-opt.c:663
 msgid ""
 "While optimizing a constant expression, there was a bad value for the third "
@@ -2149,7 +2139,7 @@ msgstr ""
 msgid "Second argument to %cTRIM() must be at least one character in length."
 msgstr ""
 
-#: src/expr-opt.c:881
+#: src/expr-opt.c:882
 msgid ""
 "When optimizing a constant expression, an integer that was being used as an "
 "Boolean value was found to have a constant value other than 0, 1, or SYSMIS."
@@ -2467,12 +2457,12 @@ msgstr ""
 msgid "No commands between FILE TYPE and END FILE TYPE."
 msgstr ""
 
-#: src/file-type.c:654
+#: src/file-type.c:655
 #, c-format
 msgid "Unknown record type \"%.*s\"."
 msgstr ""
 
-#: src/file-type.c:678
+#: src/file-type.c:679
 #, c-format
 msgid "Unknown record type %g."
 msgstr ""
@@ -2501,49 +2491,49 @@ msgstr ""
 msgid "Could not create acceptable variant for variable %s."
 msgstr ""
 
-#: src/flip.c:179
+#: src/flip.c:178
 msgid "Cannot create more than 99999 variable names."
 msgstr ""
 
-#: src/flip.c:295
+#: src/flip.c:293
 #, c-format
 msgid "Error reading FLIP source file: %s."
 msgstr ""
 
-#: src/flip.c:382
+#: src/flip.c:380
 msgid "Could not create temporary file for FLIP."
 msgstr ""
 
-#: src/flip.c:392 src/flip.c:411
+#: src/flip.c:390 src/flip.c:409
 #, c-format
 msgid "Error writing FLIP file: %s."
 msgstr ""
 
-#: src/flip.c:447
+#: src/flip.c:445
 msgid "Error creating FLIP source file."
 msgstr ""
 
-#: src/flip.c:450
+#: src/flip.c:448
 #, c-format
 msgid "Error rewinding FLIP file: %s."
 msgstr ""
 
-#: src/flip.c:459
+#: src/flip.c:457
 #, c-format
 msgid "Error reading FLIP file: %s."
 msgstr ""
 
-#: src/flip.c:471
+#: src/flip.c:469
 #, c-format
 msgid "Error seeking FLIP source file: %s."
 msgstr ""
 
-#: src/flip.c:476
+#: src/flip.c:474
 #, c-format
 msgid "Error writing FLIP source file: %s."
 msgstr ""
 
-#: src/flip.c:484
+#: src/flip.c:482
 #, c-format
 msgid "Error rewind FLIP source file: %s."
 msgstr ""
@@ -2639,7 +2629,7 @@ msgstr ""
 msgid "Format %s may not be assigned to a %s variable."
 msgstr ""
 
-#: src/formats.c:123 src/numeric.c:66 src/numeric.c:139
+#: src/formats.c:123 src/numeric.c:65 src/numeric.c:137
 msgid "`)' expected after output format."
 msgstr ""
 
@@ -2658,7 +2648,7 @@ msgstr ""
 msgid "GET translation table from file to memory:\n"
 msgstr ""
 
-#: src/get.c:115 src/get.c:1398
+#: src/get.c:115 src/get.c:1397
 #, c-format
 msgid "  %8s from %3d,%3d to %3d,%3d\n"
 msgstr ""
@@ -2740,18 +2730,18 @@ msgstr ""
 msgid "File %s lacks BY variable %s."
 msgstr ""
 
-#: src/get.c:1311
+#: src/get.c:1310
 #, c-format
 msgid ""
 "Variable %s in file %s (%s) has different type or width from the same "
 "variable in earlier file (%s)."
 msgstr ""
 
-#: src/get.c:1360
+#: src/get.c:1359
 msgid "expecting COMM or TAPE"
 msgstr ""
 
-#: src/get.c:1393
+#: src/get.c:1392
 #, c-format
 msgid "IMPORT translation table from file to memory:\n"
 msgstr ""
@@ -2781,24 +2771,24 @@ msgstr ""
 msgid "Closing `%s': %s."
 msgstr ""
 
-#: src/glob.c:222
+#: src/glob.c:217
 msgid "data> "
 msgstr ""
 
-#: src/glob.c:279
+#: src/glob.c:274
 msgid "Specify a terminal type with `setenv TERM <yourtype>'."
 msgstr ""
 
-#: src/glob.c:285
+#: src/glob.c:280
 msgid "Could not access the termcap data base."
 msgstr ""
 
-#: src/glob.c:287
+#: src/glob.c:282
 #, c-format
 msgid "Terminal type `%s' is not defined."
 msgstr ""
 
-#: src/glob.c:288
+#: src/glob.c:283
 msgid "Assuming screen of size 79x25."
 msgstr ""
 
@@ -3008,31 +2998,31 @@ msgstr ""
 msgid "Unrecognized filename format."
 msgstr ""
 
-#: src/inpt-pgm.c:83
+#: src/inpt-pgm.c:84
 msgid "No matching INPUT PROGRAM command."
 msgstr ""
 
-#: src/inpt-pgm.c:88
+#: src/inpt-pgm.c:89
 msgid ""
 "No data-input or transformation commands specified between INPUT PROGRAM and "
 "END INPUT PROGRAM."
 msgstr ""
 
-#: src/inpt-pgm.c:265 src/inpt-pgm.c:408
+#: src/inpt-pgm.c:283 src/inpt-pgm.c:420
 msgid ""
 "This command may only be executed between INPUT PROGRAM and END INPUT "
 "PROGRAM."
 msgstr ""
 
-#: src/inpt-pgm.c:324
+#: src/inpt-pgm.c:336
 msgid "COLUMN subcommand multiply specified."
 msgstr ""
 
-#: src/inpt-pgm.c:338
+#: src/inpt-pgm.c:350
 msgid "expecting file handle name"
 msgstr ""
 
-#: src/inpt-pgm.c:381
+#: src/inpt-pgm.c:393
 msgid ""
 "REREAD: Column numbers must be positive finite numbers.  Column set to 1."
 msgstr ""
@@ -3096,12 +3086,12 @@ msgstr ""
 msgid "The rest of this command has been discarded."
 msgstr ""
 
-#: src/lexer.c:842 src/print.c:1157
+#: src/lexer.c:842 src/print.c:1150
 #, c-format
 msgid "<ERROR>"
 msgstr ""
 
-#: src/lexer.c:968 src/pfm-read.c:132 src/repeat.c:226
+#: src/lexer.c:968 src/pfm-read.c:132 src/repeat.c:225
 msgid "Unexpected end of file."
 msgstr ""
 
@@ -3146,20 +3136,20 @@ msgstr ""
 msgid "The index variable may not be a string variable."
 msgstr ""
 
-#: src/loop.c:321
+#: src/loop.c:316
 msgid "There is no LOOP command that corresponds to this END LOOP."
 msgstr ""
 
-#: src/loop.c:522
+#: src/loop.c:517
 msgid ""
 "This command may only appear enclosed in a LOOP/END LOOP control structure."
 msgstr ""
 
-#: src/loop.c:528
+#: src/loop.c:523
 msgid "BREAK not enclosed in DO IF structure."
 msgstr ""
 
-#: src/loop.c:605
+#: src/loop.c:600
 #, c-format
 msgid "%s without %s."
 msgstr ""
@@ -3198,168 +3188,168 @@ msgstr ""
 msgid "VARNAME_ cannot be explicitly specified on VARIABLES."
 msgstr ""
 
-#: src/matrix-data.c:267
+#: src/matrix-data.c:265
 msgid "in FORMAT subcommand"
 msgstr ""
 
-#: src/matrix-data.c:278
+#: src/matrix-data.c:276
 msgid "SPLIT subcommand multiply specified."
 msgstr ""
 
-#: src/matrix-data.c:285
+#: src/matrix-data.c:283
 msgid "in SPLIT subcommand"
 msgstr ""
 
-#: src/matrix-data.c:294
+#: src/matrix-data.c:292
 msgid "Split variable may not be named ROWTYPE_ or VARNAME_."
 msgstr ""
 
-#: src/matrix-data.c:327
+#: src/matrix-data.c:324
 #, c-format
 msgid "Split variable %s is already another type."
 msgstr ""
 
-#: src/matrix-data.c:342
+#: src/matrix-data.c:339
 msgid "FACTORS subcommand multiply specified."
 msgstr ""
 
-#: src/matrix-data.c:357
+#: src/matrix-data.c:354
 #, c-format
 msgid "Factor variable %s is already another type."
 msgstr ""
 
-#: src/matrix-data.c:372
+#: src/matrix-data.c:369
 msgid "CELLS subcommand multiply specified."
 msgstr ""
 
-#: src/matrix-data.c:378 src/matrix-data.c:397
+#: src/matrix-data.c:375 src/matrix-data.c:394
 msgid "expecting positive integer"
 msgstr ""
 
-#: src/matrix-data.c:391
+#: src/matrix-data.c:388
 msgid "N subcommand multiply specified."
 msgstr ""
 
-#: src/matrix-data.c:412
+#: src/matrix-data.c:409
 msgid "CONTENTS subcommand multiply specified."
 msgstr ""
 
-#: src/matrix-data.c:432
+#: src/matrix-data.c:429
 msgid "Nested parentheses not allowed."
 msgstr ""
 
-#: src/matrix-data.c:442
+#: src/matrix-data.c:439
 msgid "Mismatched right parenthesis (`(')."
 msgstr ""
 
-#: src/matrix-data.c:447
+#: src/matrix-data.c:444
 msgid "Empty parentheses not allowed."
 msgstr ""
 
-#: src/matrix-data.c:460 src/matrix-data.c:468
+#: src/matrix-data.c:457 src/matrix-data.c:465
 msgid "in CONTENTS subcommand"
 msgstr ""
 
-#: src/matrix-data.c:475
+#: src/matrix-data.c:472
 #, c-format
 msgid "Content multiply specified for %s."
 msgstr ""
 
-#: src/matrix-data.c:492
+#: src/matrix-data.c:489
 msgid "Missing right parenthesis."
 msgstr ""
 
-#: src/matrix-data.c:512
+#: src/matrix-data.c:509
 msgid "Missing VARIABLES subcommand."
 msgstr ""
 
-#: src/matrix-data.c:518
+#: src/matrix-data.c:515
 msgid ""
 "CONTENTS subcommand not specified: assuming file contains only CORR matrix."
 msgstr ""
 
-#: src/matrix-data.c:528
+#: src/matrix-data.c:525
 msgid ""
 "Missing CELLS subcommand.  CELLS is required when ROWTYPE_ is not given in "
 "the data and factors are present."
 msgstr ""
 
-#: src/matrix-data.c:536
+#: src/matrix-data.c:533
 msgid "Split file values must be present in the data when ROWTYPE_ is present."
 msgstr ""
 
-#: src/matrix-data.c:592
+#: src/matrix-data.c:588
 msgid "No continuous variables specified."
 msgstr ""
 
-#: src/matrix-data.c:1006
+#: src/matrix-data.c:1002
 #, c-format
 msgid "End of line expected %s while reading %s."
 msgstr ""
 
-#: src/matrix-data.c:1193
+#: src/matrix-data.c:1190
 #, c-format
 msgid "expecting value for %s %s"
 msgstr ""
 
-#: src/matrix-data.c:1344
+#: src/matrix-data.c:1342
 #, c-format
 msgid "Syntax error expecting SPLIT FILE value %s."
 msgstr ""
 
-#: src/matrix-data.c:1353
+#: src/matrix-data.c:1351
 #, c-format
 msgid "Expecting value %g for %s."
 msgstr ""
 
-#: src/matrix-data.c:1391 src/matrix-data.c:1820
+#: src/matrix-data.c:1389 src/matrix-data.c:1823
 #, c-format
 msgid "Syntax error expecting factor value %s."
 msgstr ""
 
-#: src/matrix-data.c:1400
+#: src/matrix-data.c:1398
 #, c-format
 msgid "Syntax error expecting value %g for %s %s."
 msgstr ""
 
-#: src/matrix-data.c:1610
+#: src/matrix-data.c:1612
 #, c-format
 msgid "Syntax error %s expecting SPLIT FILE value."
 msgstr ""
 
-#: src/matrix-data.c:1734
+#: src/matrix-data.c:1736
 #, c-format
 msgid ""
 "Expected %d lines of data for %s content; actually saw %d lines.  No data "
 "will be output for this content."
 msgstr ""
 
-#: src/matrix-data.c:1765
+#: src/matrix-data.c:1768
 #, c-format
 msgid "Multiply specified ROWTYPE_ %s."
 msgstr ""
 
-#: src/matrix-data.c:1770
+#: src/matrix-data.c:1773
 #, c-format
 msgid "Syntax error %s expecting ROWTYPE_ string."
 msgstr ""
 
-#: src/matrix-data.c:1789
+#: src/matrix-data.c:1792
 #, c-format
 msgid "Syntax error %s."
 msgstr ""
 
-#: src/matrix-data.c:1935
+#: src/matrix-data.c:1938
 #, c-format
 msgid "Duplicate specification for %s."
 msgstr ""
 
-#: src/matrix-data.c:1947
+#: src/matrix-data.c:1950
 #, c-format
 msgid "Too many rows of matrix data for %s."
 msgstr ""
 
-#: src/matrix-data.c:1992
+#: src/matrix-data.c:1995
 #, c-format
 msgid "Syntax error expecting value for %s %s."
 msgstr ""
@@ -3402,7 +3392,7 @@ msgstr ""
 msgid "String is not of proper length."
 msgstr ""
 
-#: src/mis-val.c:326 src/repeat.c:484
+#: src/mis-val.c:326 src/repeat.c:476
 msgid "String expected."
 msgstr ""
 
@@ -3490,17 +3480,17 @@ msgstr ""
 msgid "`/' or `.' expected."
 msgstr ""
 
-#: src/numeric.c:59
+#: src/numeric.c:58
 #, c-format
 msgid "Format type %s may not be used with a numeric variable."
 msgstr ""
 
-#: src/numeric.c:78 src/numeric.c:161 src/vector.c:158
+#: src/numeric.c:77 src/numeric.c:159 src/vector.c:157
 #, c-format
 msgid "There is already a variable named %s."
 msgstr ""
 
-#: src/numeric.c:132
+#: src/numeric.c:130
 #, c-format
 msgid "Format type %s may not be used with a string variable."
 msgstr ""
@@ -3685,7 +3675,7 @@ msgstr ""
 msgid "portable file %s corrupt at offset %ld: "
 msgstr ""
 
-#: src/pfm-read.c:108 src/pfm-write.c:501
+#: src/pfm-read.c:108 src/pfm-write.c:502
 #, c-format
 msgid "%s: Closing portable file: %s."
 msgstr ""
@@ -3893,12 +3883,12 @@ msgstr ""
 msgid "Error writing portable-file header."
 msgstr ""
 
-#: src/pfm-write.c:168
+#: src/pfm-write.c:169
 #, c-format
 msgid "%s: Writing portable file: %s."
 msgstr ""
 
-#: src/pfm-write.c:510
+#: src/pfm-write.c:511
 msgid "writing as a portable file"
 msgstr ""
 
@@ -4086,25 +4076,25 @@ msgstr ""
 msgid "Writing %3d records to the listing file."
 msgstr ""
 
-#: src/print.c:1046
+#: src/print.c:1039
 msgid "A file name or handle was expected in the OUTFILE subcommand."
 msgstr ""
 
-#: src/print.c:1098
+#: src/print.c:1091
 #, c-format
 msgid ""
 "The expression on PRINT SPACE evaluated to %d.  It's not possible to PRINT "
 "SPACE a negative number of lines."
 msgstr ""
 
-#: src/recode.c:288
+#: src/recode.c:287
 #, c-format
 msgid ""
 "%d variable(s) cannot be recoded into %d variable(s).  Specify the same "
 "number of variables as input and output variables."
 msgstr ""
 
-#: src/recode.c:302
+#: src/recode.c:301
 #, c-format
 msgid ""
 "There is no string variable named %s.  (All string variables specified on "
@@ -4112,56 +4102,56 @@ msgid ""
 "variable.)"
 msgstr ""
 
-#: src/recode.c:311
+#: src/recode.c:310
 #, c-format
 msgid ""
 "Type mismatch between input and output variables.  Output variable %s is not "
 "a string variable, but all the input variables are string variables."
 msgstr ""
 
-#: src/recode.c:330
+#: src/recode.c:329
 #, c-format
 msgid "Type mismatch after INTO: %s is not a numeric variable."
 msgstr ""
 
-#: src/recode.c:360
+#: src/recode.c:359
 msgid ""
 "INTO must be used when the input values are numeric and output values are "
 "string."
 msgstr ""
 
-#: src/recode.c:368
+#: src/recode.c:367
 msgid ""
 "INTO must be used when the input values are string and output values are "
 "numeric."
 msgstr ""
 
-#: src/recode.c:504
+#: src/recode.c:501
 msgid ""
 "Inconsistent output types.  The output values must be all numeric or all "
 "string."
 msgstr ""
 
-#: src/recode.c:555
+#: src/recode.c:552
 msgid "following LO THRU"
 msgstr ""
 
-#: src/recode.c:571 src/recode.c:600
+#: src/recode.c:568 src/recode.c:597
 msgid "in source value"
 msgstr ""
 
-#: src/recode.c:613
+#: src/recode.c:610
 msgid ""
 "Keyword CONVERT may only be used with string input values and numeric output "
 "values."
 msgstr ""
 
-#: src/recode.c:869
+#: src/recode.c:866
 #, c-format
 msgid "!!END!!"
 msgstr ""
 
-#: src/recode.c:890 src/recode.c:906
+#: src/recode.c:887 src/recode.c:903
 #, c-format
 msgid "!!ERROR!!"
 msgstr ""
@@ -4183,12 +4173,12 @@ msgstr ""
 msgid "Renaming would duplicate variable name %s."
 msgstr ""
 
-#: src/repeat.c:159
+#: src/repeat.c:158
 #, c-format
 msgid "Identifier %s is given twice."
 msgstr ""
 
-#: src/repeat.c:202
+#: src/repeat.c:201
 #, c-format
 msgid ""
 "There must be the same number of substitutions for each dummy variable "
@@ -4196,11 +4186,11 @@ msgid ""
 "s as well, but %d were specified."
 msgstr ""
 
-#: src/repeat.c:311
+#: src/repeat.c:310
 msgid "No commands in scope."
 msgstr ""
 
-#: src/repeat.c:511
+#: src/repeat.c:503
 msgid "No matching DO REPEAT."
 msgstr ""
 
@@ -4696,7 +4686,7 @@ msgstr ""
 msgid "SORT: Closing handle %d."
 msgstr ""
 
-#: src/sort.c:594 src/sort.c:819
+#: src/sort.c:594 src/sort.c:818
 #, c-format
 msgid "%s: Error closing temporary file: %s."
 msgstr ""
@@ -4716,76 +4706,76 @@ msgstr ""
 msgid "%s: Error creating temporary file: %s."
 msgstr ""
 
-#: src/sort.c:823 src/sort.c:985 src/sort.c:1035 src/sort.c:1207
-#: src/sort.c:1214
+#: src/sort.c:822 src/sort.c:983 src/sort.c:1033 src/sort.c:1202
+#: src/sort.c:1209
 #, c-format
 msgid "%s: Error removing temporary file: %s."
 msgstr ""
 
-#: src/sort.c:967
+#: src/sort.c:965
 msgid "merging runs"
 msgstr ""
 
-#: src/sort.c:975
+#: src/sort.c:973
 #, c-format
 msgid " into run %d(%d)\n"
 msgstr ""
 
-#: src/sort.c:994
+#: src/sort.c:992
 msgid "Out of memory expanding Huffman priority queue."
 msgstr ""
 
-#: src/sort.c:1046
+#: src/sort.c:1044
 #, c-format
 msgid "%s: Error creating temporary file for merge: %s."
 msgstr ""
 
-#: src/sort.c:1074 src/sort.c:1134
+#: src/sort.c:1071 src/sort.c:1129
 #, c-format
 msgid "%s: Error reading temporary file in merge: %s."
 msgstr ""
 
-#: src/sort.c:1077 src/sort.c:1138
+#: src/sort.c:1074 src/sort.c:1133
 #, c-format
 msgid "%s: Unexpected end of temporary file in merge."
 msgstr ""
 
-#: src/sort.c:1103
+#: src/sort.c:1099
 #, c-format
 msgid "%s: Error writing temporary file in merge: %s."
 msgstr ""
 
-#: src/sort.c:1154 src/sort.c:1187
+#: src/sort.c:1149 src/sort.c:1182
 #, c-format
 msgid "%s: Error closing temporary file in merge: %s."
 msgstr ""
 
-#: src/sort.c:1159
+#: src/sort.c:1154
 #, c-format
 msgid "%s: Error removing temporary file in merge: %s."
 msgstr ""
 
-#: src/sort.c:1258
+#: src/sort.c:1253
 #, c-format
 msgid "%s: Cannot open sort result file: %s."
 msgstr ""
 
-#: src/sort.c:1269
+#: src/sort.c:1264
 #, c-format
 msgid "%s: Error reading sort result file: %s."
 msgstr ""
 
-#: src/sort.c:1272
+#: src/sort.c:1267
 #, c-format
 msgid "%s: Unexpected end of sort result file: %s."
 msgstr ""
 
-#: src/sort.c:1283
+#: src/sort.c:1278
 #, c-format
 msgid "%s: Error closing sort result file: %s."
 msgstr ""
 
-#: src/sort.c:1287
+#: src/sort.c:1282
 #, c-format
 msgid "%s: Error removing sort result file: %s."
 msgstr ""
@@ -4891,7 +4881,7 @@ msgstr ""
 msgid "Documents in the active file:"
 msgstr ""
 
-#: src/sysfile-info.c:379 src/sysfile-info.c:537 src/vfm.c:1095
+#: src/sysfile-info.c:379 src/sysfile-info.c:537 src/vfm.c:1083
 msgid "Label"
 msgstr ""
 
@@ -5081,95 +5071,95 @@ msgstr ""
 msgid "Bad bounds in use of TO convention."
 msgstr ""
 
-#: src/vector.c:69
+#: src/vector.c:68
 #, c-format
 msgid "Vector name %s is given twice."
 msgstr ""
 
-#: src/vector.c:75
+#: src/vector.c:74
 #, c-format
 msgid "There is already a vector with name %s."
 msgstr ""
 
-#: src/vector.c:96
+#: src/vector.c:95
 msgid ""
 "A slash must be used to separate each vector specification when using the "
 "long form.  Commands such as VECTOR A,B=Q1 TO Q20 are not supported."
 msgstr ""
 
-#: src/vector.c:130
+#: src/vector.c:129
 msgid "Vectors must have at least one element."
 msgstr ""
 
-#: src/vector.c:144
+#: src/vector.c:143
 #, c-format
 msgid "%s%d is too long for a variable name."
 msgstr ""
 
-#: src/vector.c:184
+#: src/vector.c:181
 msgid ""
 "The syntax for this command does not match the expected syntax for either "
 "the long form or the short form of VECTOR."
 msgstr ""
 
-#: src/vfm.c:293
+#: src/vfm.c:286
 #, c-format
 msgid ""
 "Workspace overflow predicted.  Max workspace is currently set to %d KB (%d "
 "cases at %d bytes each).  Paging active file to disk."
 msgstr ""
 
-#: src/vfm.c:365
+#: src/vfm.c:361
 msgid "<NOVAR>"
 msgstr ""
 
-#: src/vfm.c:612
+#: src/vfm.c:566
 #, c-format
 msgid ""
 "An error occurred attempting to create a temporary file for use as the "
 "active file: %s."
 msgstr ""
 
-#: src/vfm.c:630
+#: src/vfm.c:584
 #, c-format
 msgid ""
 "An error occurred while attempting to read from a temporary file created for "
 "the active file: %s."
 msgstr ""
 
-#: src/vfm.c:658
+#: src/vfm.c:612
 #, c-format
 msgid ""
 "An error occurred while attempting to write to a temporary file used as the "
 "active file: %s."
 msgstr ""
 
-#: src/vfm.c:672
+#: src/vfm.c:626
 #, c-format
 msgid ""
 "An error occurred while attempting to rewind a temporary file used as the "
 "active file: %s."
 msgstr ""
 
-#: src/vfm.c:787
+#: src/vfm.c:741
 msgid "Virtual memory exhausted.  Paging active file to disk."
 msgstr ""
 
-#: src/vfm.c:790
+#: src/vfm.c:744
 #, c-format
 msgid ""
 "Workspace limit of %d KB (%d cases at %d bytes each) overflowed.  Paging "
 "active file to disk."
 msgstr ""
 
-#: src/vfm.c:814 src/vfm.c:851
+#: src/vfm.c:768 src/vfm.c:805
 #, c-format
 msgid ""
 "An error occurred while attempting to write to a temporary file created as "
 "the active file, while paging to disk: %s."
 msgstr ""
 
-#: src/vfm.c:965
+#: src/vfm.c:919
 msgid "transform: "
 msgstr ""
 
index 0808c05dd23f715d589a2b12e72b2ecb8c5ad724..75b6ac03d0a268b8291fefa9c86f09a268369576 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: pspp-dev@gnu.org\n"
-"POT-Creation-Date: 2004-02-12 19:27+0800\n"
+"POT-Creation-Date: 2004-02-17 17:30+0800\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,276 +17,276 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
 
-#: src/crosstabs.q:254
+#: src/crosstabs.q:257
 msgid ""
 "Missing mode REPORT not allowed in general mode.  Assuming MISSING=TABLE."
 msgstr ""
 
-#: src/crosstabs.q:264
+#: src/crosstabs.q:267
 msgid "Write mode ALL not allowed in general mode.  Assuming WRITE=CELLS."
 msgstr ""
 
-#: src/crosstabs.q:323
+#: src/crosstabs.q:327
 msgid "expecting BY"
 msgstr ""
 
-#: src/crosstabs.q:390
+#: src/crosstabs.q:394
 msgid "VARIABLES must be specified before TABLES."
 msgstr ""
 
-#: src/crosstabs.q:427
+#: src/crosstabs.q:431
 #, c-format
 msgid "Maximum value (%ld) less than minimum value (%ld)."
 msgstr ""
 
-#: src/crosstabs.q:864
+#: src/crosstabs.q:865
 msgid "Summary."
 msgstr ""
 
-#: src/crosstabs.q:866
+#: src/crosstabs.q:867
 msgid "Cases"
 msgstr ""
 
-#: src/crosstabs.q:867 src/frequencies.q:999
+#: src/crosstabs.q:868 src/frequencies.q:999
 msgid "Valid"
 msgstr ""
 
-#: src/crosstabs.q:868 src/frequencies.q:1066
+#: src/crosstabs.q:869 src/frequencies.q:1066
 msgid "Missing"
 msgstr ""
 
-#: src/crosstabs.q:869 src/crosstabs.q:1070 src/crosstabs.q:1799
+#: src/crosstabs.q:870 src/crosstabs.q:1073 src/crosstabs.q:1806
 #: src/frequencies.q:1075
 msgid "Total"
 msgstr ""
 
-#: src/crosstabs.q:879 src/t-test.q:623 src/t-test.q:646 src/t-test.q:726
+#: src/crosstabs.q:880 src/t-test.q:623 src/t-test.q:646 src/t-test.q:726
 #: src/t-test.q:1297
 msgid "N"
 msgstr ""
 
-#: src/crosstabs.q:880 src/frequencies.q:1003 src/frequencies.q:1004
+#: src/crosstabs.q:881 src/frequencies.q:1003 src/frequencies.q:1004
 #: src/frequencies.q:1005
 msgid "Percent"
 msgstr ""
 
-#: src/crosstabs.q:1119
+#: src/crosstabs.q:1123
 msgid "count"
 msgstr ""
 
-#: src/crosstabs.q:1120
+#: src/crosstabs.q:1124
 msgid "row %"
 msgstr ""
 
-#: src/crosstabs.q:1121
+#: src/crosstabs.q:1125
 msgid "column %"
 msgstr ""
 
-#: src/crosstabs.q:1122
+#: src/crosstabs.q:1126
 msgid "total %"
 msgstr ""
 
-#: src/crosstabs.q:1123
+#: src/crosstabs.q:1127
 msgid "expected"
 msgstr ""
 
-#: src/crosstabs.q:1124
+#: src/crosstabs.q:1128
 msgid "residual"
 msgstr ""
 
-#: src/crosstabs.q:1125
+#: src/crosstabs.q:1129
 msgid "std. resid."
 msgstr ""
 
-#: src/crosstabs.q:1126
+#: src/crosstabs.q:1130
 msgid "adj. resid."
 msgstr ""
 
-#: src/crosstabs.q:1159 src/crosstabs.q:1186 src/crosstabs.q:1206
-#: src/crosstabs.q:1227
+#: src/crosstabs.q:1163 src/crosstabs.q:1190 src/crosstabs.q:1210
+#: src/crosstabs.q:1231
 msgid "Statistic"
 msgstr ""
 
-#: src/crosstabs.q:1160 src/crosstabs.q:1187 src/crosstabs.q:1207
-#: src/crosstabs.q:1229 src/frequencies.q:1001 src/frequencies.q:1118
-#: src/sysfile-info.c:536 src/vfm.c:1094
+#: src/crosstabs.q:1164 src/crosstabs.q:1191 src/crosstabs.q:1211
+#: src/crosstabs.q:1233 src/frequencies.q:1001 src/frequencies.q:1118
+#: src/sysfile-info.c:536 src/vfm.c:1082
 msgid "Value"
 msgstr ""
 
-#: src/crosstabs.q:1161 src/t-test.q:879 src/t-test.q:1067 src/t-test.q:1181
+#: src/crosstabs.q:1165 src/t-test.q:879 src/t-test.q:1067 src/t-test.q:1181
 msgid "df"
 msgstr ""
 
-#: src/crosstabs.q:1163
+#: src/crosstabs.q:1167
 msgid "Asymp. Sig. (2-sided)"
 msgstr ""
 
-#: src/crosstabs.q:1165
+#: src/crosstabs.q:1169
 msgid "Exact. Sig. (2-sided)"
 msgstr ""
 
-#: src/crosstabs.q:1167
+#: src/crosstabs.q:1171
 msgid "Exact. Sig. (1-sided)"
 msgstr ""
 
-#: src/crosstabs.q:1185 src/crosstabs.q:1226
+#: src/crosstabs.q:1189 src/crosstabs.q:1230
 msgid "Category"
 msgstr ""
 
-#: src/crosstabs.q:1188 src/crosstabs.q:1230
+#: src/crosstabs.q:1192 src/crosstabs.q:1234
 msgid "Asymp. Std. Error"
 msgstr ""
 
-#: src/crosstabs.q:1189 src/crosstabs.q:1231
+#: src/crosstabs.q:1193 src/crosstabs.q:1235
 msgid "Approx. T"
 msgstr ""
 
-#: src/crosstabs.q:1190 src/crosstabs.q:1232
+#: src/crosstabs.q:1194 src/crosstabs.q:1236
 msgid "Approx. Sig."
 msgstr ""
 
-#: src/crosstabs.q:1205
+#: src/crosstabs.q:1209
 #, c-format
 msgid " 95%% Confidence Interval"
 msgstr ""
 
-#: src/crosstabs.q:1208 src/t-test.q:883 src/t-test.q:1064 src/t-test.q:1184
+#: src/crosstabs.q:1212 src/t-test.q:883 src/t-test.q:1064 src/t-test.q:1184
 msgid "Lower"
 msgstr ""
 
-#: src/crosstabs.q:1209 src/t-test.q:884 src/t-test.q:1065 src/t-test.q:1185
+#: src/crosstabs.q:1213 src/t-test.q:884 src/t-test.q:1065 src/t-test.q:1185
 msgid "Upper"
 msgstr ""
 
-#: src/crosstabs.q:1228
+#: src/crosstabs.q:1232
 msgid "Type"
 msgstr ""
 
-#: src/crosstabs.q:1976
+#: src/crosstabs.q:1983
 msgid "Pearson Chi-Square"
 msgstr ""
 
-#: src/crosstabs.q:1977
+#: src/crosstabs.q:1984
 msgid "Likelihood Ratio"
 msgstr ""
 
-#: src/crosstabs.q:1978
+#: src/crosstabs.q:1985
 msgid "Fisher's Exact Test"
 msgstr ""
 
-#: src/crosstabs.q:1979
+#: src/crosstabs.q:1986
 msgid "Continuity Correction"
 msgstr ""
 
-#: src/crosstabs.q:1980
+#: src/crosstabs.q:1987
 msgid "Linear-by-Linear Association"
 msgstr ""
 
-#: src/crosstabs.q:2017 src/crosstabs.q:2087 src/crosstabs.q:2146
+#: src/crosstabs.q:2024 src/crosstabs.q:2094 src/crosstabs.q:2153
 msgid "N of Valid Cases"
 msgstr ""
 
-#: src/crosstabs.q:2033 src/crosstabs.q:2162
+#: src/crosstabs.q:2040 src/crosstabs.q:2169
 msgid "Nominal by Nominal"
 msgstr ""
 
-#: src/crosstabs.q:2034 src/crosstabs.q:2163
+#: src/crosstabs.q:2041 src/crosstabs.q:2170
 msgid "Ordinal by Ordinal"
 msgstr ""
 
-#: src/crosstabs.q:2035
+#: src/crosstabs.q:2042
 msgid "Interval by Interval"
 msgstr ""
 
-#: src/crosstabs.q:2036
+#: src/crosstabs.q:2043
 msgid "Measure of Agreement"
 msgstr ""
 
-#: src/crosstabs.q:2041
+#: src/crosstabs.q:2048
 msgid "Phi"
 msgstr ""
 
-#: src/crosstabs.q:2042
+#: src/crosstabs.q:2049
 msgid "Cramer's V"
 msgstr ""
 
-#: src/crosstabs.q:2043
+#: src/crosstabs.q:2050
 msgid "Contingency Coefficient"
 msgstr ""
 
-#: src/crosstabs.q:2044
+#: src/crosstabs.q:2051
 msgid "Kendall's tau-b"
 msgstr ""
 
-#: src/crosstabs.q:2045
+#: src/crosstabs.q:2052
 msgid "Kendall's tau-c"
 msgstr ""
 
-#: src/crosstabs.q:2046
+#: src/crosstabs.q:2053
 msgid "Gamma"
 msgstr ""
 
-#: src/crosstabs.q:2047
+#: src/crosstabs.q:2054
 msgid "Spearman Correlation"
 msgstr ""
 
-#: src/crosstabs.q:2048
+#: src/crosstabs.q:2055
 msgid "Pearson's R"
 msgstr ""
 
-#: src/crosstabs.q:2049
+#: src/crosstabs.q:2056
 msgid "Kappa"
 msgstr ""
 
-#: src/crosstabs.q:2119
+#: src/crosstabs.q:2126
 #, c-format
 msgid "Odds Ratio for %s (%g / %g)"
 msgstr ""
 
-#: src/crosstabs.q:2122
+#: src/crosstabs.q:2129
 #, c-format
 msgid "Odds Ratio for %s (%.*s / %.*s)"
 msgstr ""
 
-#: src/crosstabs.q:2130
+#: src/crosstabs.q:2137
 #, c-format
 msgid "For cohort %s = %g"
 msgstr ""
 
-#: src/crosstabs.q:2133
+#: src/crosstabs.q:2140
 #, c-format
 msgid "For cohort %s = %.*s"
 msgstr ""
 
-#: src/crosstabs.q:2164
+#: src/crosstabs.q:2171
 msgid "Nominal by Interval"
 msgstr ""
 
-#: src/crosstabs.q:2169
+#: src/crosstabs.q:2176
 msgid "Lambda"
 msgstr ""
 
-#: src/crosstabs.q:2170
+#: src/crosstabs.q:2177
 msgid "Goodman and Kruskal tau"
 msgstr ""
 
-#: src/crosstabs.q:2171
+#: src/crosstabs.q:2178
 msgid "Uncertainty Coefficient"
 msgstr ""
 
-#: src/crosstabs.q:2172
+#: src/crosstabs.q:2179
 msgid "Somers' d"
 msgstr ""
 
-#: src/crosstabs.q:2173
+#: src/crosstabs.q:2180
 msgid "Eta"
 msgstr ""
 
-#: src/crosstabs.q:2178
+#: src/crosstabs.q:2185
 msgid "Symmetric"
 msgstr ""
 
-#: src/crosstabs.q:2179 src/crosstabs.q:2180
+#: src/crosstabs.q:2186 src/crosstabs.q:2187
 #, c-format
 msgid "%s Dependent"
 msgstr ""
@@ -507,8 +507,8 @@ msgstr ""
 msgid "Z-score of "
 msgstr ""
 
-#: src/descript.q:792 src/data-list.c:732 src/data-list.c:869 src/print.c:801
-#: src/sysfile-info.c:135 src/sysfile-info.c:370 src/vfm.c:1093
+#: src/descript.q:792 src/data-list.c:736 src/data-list.c:877 src/print.c:801
+#: src/sysfile-info.c:135 src/sysfile-info.c:370 src/vfm.c:1081
 msgid "Variable"
 msgstr ""
 
@@ -533,10 +533,10 @@ msgid ""
 msgstr ""
 
 #: src/file-handle.q:88 src/autorecode.c:121 src/command.c:696
-#: src/compute.c:284 src/data-list.c:372 src/data-list.c:842
-#: src/data-list.c:1645 src/do-if.c:264 src/get.c:359 src/lexer.c:387
-#: src/loop.c:248 src/matrix-data.c:506 src/print.c:336 src/print.c:1064
-#: src/recode.c:409 src/sel-if.c:56 src/sel-if.c:136 src/vector.c:197
+#: src/compute.c:283 src/data-list.c:370 src/data-list.c:850
+#: src/data-list.c:1666 src/do-if.c:264 src/get.c:359 src/lexer.c:387
+#: src/loop.c:248 src/matrix-data.c:503 src/print.c:336 src/print.c:1057
+#: src/recode.c:408 src/sel-if.c:56 src/sel-if.c:136 src/vector.c:194
 msgid "expecting end of command"
 msgstr ""
 
@@ -1008,9 +1008,9 @@ msgstr ""
 msgid "%s & %s"
 msgstr ""
 
-#: src/aggregate.c:188 src/aggregate.c:229 src/data-list.c:1321
-#: src/data-list.c:1356 src/data-list.c:1369 src/data-list.c:1382
-#: src/data-list.c:1415
+#: src/aggregate.c:188 src/aggregate.c:229 src/data-list.c:1341
+#: src/data-list.c:1376 src/data-list.c:1389 src/data-list.c:1402
+#: src/data-list.c:1435
 #, c-format
 msgid "%s subcommand given multiple times."
 msgstr ""
@@ -1023,41 +1023,41 @@ msgstr ""
 msgid "BREAK subcommand not specified."
 msgstr ""
 
-#: src/aggregate.c:494
+#: src/aggregate.c:492
 msgid "expecting aggregation function"
 msgstr ""
 
-#: src/aggregate.c:510
+#: src/aggregate.c:508
 #, c-format
 msgid "Unknown aggregation function %s."
 msgstr ""
 
-#: src/aggregate.c:525
+#: src/aggregate.c:523
 msgid "expecting `('"
 msgstr ""
 
-#: src/aggregate.c:560
+#: src/aggregate.c:558
 #, c-format
 msgid "Missing argument %d to %s."
 msgstr ""
 
-#: src/aggregate.c:568
+#: src/aggregate.c:566
 #, c-format
 msgid "Arguments to %s must be of same type as source variables."
 msgstr ""
 
-#: src/aggregate.c:578 src/expr-prs.c:665
+#: src/aggregate.c:576 src/expr-prs.c:665
 msgid "expecting `)'"
 msgstr ""
 
-#: src/aggregate.c:590 src/autorecode.c:110
+#: src/aggregate.c:588 src/autorecode.c:110
 #, c-format
 msgid ""
 "Number of source variables (%d) does not match number of target variables (%"
 "d)."
 msgstr ""
 
-#: src/aggregate.c:657
+#: src/aggregate.c:655
 #, c-format
 msgid ""
 "Variable name %s is not unique within the aggregate file dictionary, which "
@@ -1383,25 +1383,25 @@ msgstr ""
 msgid "This command is not valid in a syntax file."
 msgstr ""
 
-#: src/compute.c:141 src/compute.c:200
+#: src/compute.c:140 src/compute.c:199
 #, c-format
 msgid ""
 "When executing COMPUTE: SYSMIS is not a valid value as an index into vector %"
 "s."
 msgstr ""
 
-#: src/compute.c:144 src/compute.c:204
+#: src/compute.c:143 src/compute.c:203
 #, c-format
 msgid ""
 "When executing COMPUTE: %g is not a valid value as an index into vector %s."
 msgstr ""
 
-#: src/compute.c:343
+#: src/compute.c:342
 #, c-format
 msgid "There is no vector named %s."
 msgstr ""
 
-#: src/compute.c:449
+#: src/compute.c:441
 msgid "Extra characters after expression."
 msgstr ""
 
@@ -1409,7 +1409,7 @@ msgstr ""
 msgid "Destination cannot be a string variable."
 msgstr ""
 
-#: src/count.c:286
+#: src/count.c:283
 #, c-format
 msgid ""
 "%g THRU %g is not a valid range.  The number following THRU must be at least "
@@ -1597,65 +1597,65 @@ msgstr ""
 msgid "Field too long (%d characters).  Truncated after character %d."
 msgstr ""
 
-#: src/data-list.c:137
+#: src/data-list.c:138
 msgid ""
 "DATA LIST may not use a different file from that specified on its "
 "surrounding FILE TYPE."
 msgstr ""
 
-#: src/data-list.c:156
+#: src/data-list.c:157
 msgid "The END subcommand may only be specified once."
 msgstr ""
 
-#: src/data-list.c:195
+#: src/data-list.c:193
 msgid "Only one of FIXED, FREE, or LIST may be specified."
 msgstr ""
 
-#: src/data-list.c:321 src/print.c:297
+#: src/data-list.c:319 src/print.c:297
 #, c-format
 msgid ""
 "The record number specified, %ld, is before the previous record, %d.  Data "
 "fields must be listed in order of increasing record number."
 msgstr ""
 
-#: src/data-list.c:353 src/data-list.c:1634
+#: src/data-list.c:351 src/data-list.c:1655
 msgid ""
 "SPSS-like or FORTRAN-like format specification expected after variable names."
 msgstr ""
 
-#: src/data-list.c:364 src/print.c:329
+#: src/data-list.c:362 src/print.c:329
 msgid ""
 "Variables are specified on records that should not exist according to "
 "RECORDS subcommand."
 msgstr ""
 
-#: src/data-list.c:396 src/data-list.c:409 src/print.c:506 src/print.c:519
+#: src/data-list.c:394 src/data-list.c:407 src/print.c:506 src/print.c:519
 msgid "Column positions for fields must be positive."
 msgstr ""
 
-#: src/data-list.c:414
+#: src/data-list.c:412
 msgid "The ending column for a field must be greater than the starting column."
 msgstr ""
 
-#: src/data-list.c:438 src/print.c:547
+#: src/data-list.c:436 src/print.c:547
 msgid "A format specifier on this line has extra characters on the end."
 msgstr ""
 
-#: src/data-list.c:453 src/print.c:563
+#: src/data-list.c:451 src/print.c:563
 msgid "The value for number of decimal places must be at least 1."
 msgstr ""
 
-#: src/data-list.c:467 src/print.c:576
+#: src/data-list.c:465 src/print.c:576
 #, c-format
 msgid "Input format %s doesn't accept decimal places."
 msgstr ""
 
-#: src/data-list.c:488 src/print.c:596
+#: src/data-list.c:486 src/print.c:596
 #, c-format
 msgid "The %d columns %d-%d can't be evenly divided into %d fields."
 msgstr ""
 
-#: src/data-list.c:528 src/data-list.c:625 src/data-list.c:825
+#: src/data-list.c:528 src/data-list.c:625 src/data-list.c:829
 #, c-format
 msgid "%s is a duplicate variable name."
 msgstr ""
@@ -1676,233 +1676,233 @@ msgid ""
 "given."
 msgstr ""
 
-#: src/data-list.c:698 src/print.c:769
+#: src/data-list.c:702 src/print.c:769
 msgid ""
 "There aren't enough format specifications to match the number of variable "
 "names given."
 msgstr ""
 
-#: src/data-list.c:733 src/print.c:802
+#: src/data-list.c:737 src/print.c:802
 msgid "Record"
 msgstr ""
 
-#: src/data-list.c:734 src/print.c:803
+#: src/data-list.c:738 src/print.c:803
 msgid "Columns"
 msgstr ""
 
-#: src/data-list.c:735 src/data-list.c:870 src/print.c:804
+#: src/data-list.c:739 src/data-list.c:878 src/print.c:804
 msgid "Format"
 msgstr ""
 
-#: src/data-list.c:758
+#: src/data-list.c:762
 #, c-format
 msgid "Reading %d record from file %s."
 msgid_plural "Reading %d records from file %s."
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/data-list.c:761
+#: src/data-list.c:765
 #, c-format
 msgid "Reading %d record from the command file."
 msgid_plural "Reading %d records from the command file."
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/data-list.c:768 src/data-list.c:769
+#: src/data-list.c:772 src/data-list.c:773
 msgid "Occurrence data specifications."
 msgstr ""
 
-#: src/data-list.c:893
+#: src/data-list.c:901
 #, c-format
 msgid "Reading free-form data from file %s."
 msgstr ""
 
-#: src/data-list.c:894
+#: src/data-list.c:902
 msgid "Reading free-form data from the command file."
 msgstr ""
 
-#: src/data-list.c:945 src/matrix-data.c:939
+#: src/data-list.c:953 src/matrix-data.c:935
 msgid "Scope of string exceeds line."
 msgstr ""
 
-#: src/data-list.c:1006
+#: src/data-list.c:1013
 msgid "Attempt to read past end of file."
 msgstr ""
 
-#: src/data-list.c:1035
+#: src/data-list.c:1042
 msgid "abort in write_case()\n"
 msgstr ""
 
-#: src/data-list.c:1063
+#: src/data-list.c:1070
 #, c-format
 msgid "Partial case of %d of %d records discarded."
 msgstr ""
 
-#: src/data-list.c:1112
+#: src/data-list.c:1119
 #, c-format
 msgid "Partial case discarded.  The first variable missing was %s."
 msgstr ""
 
-#: src/data-list.c:1153
+#: src/data-list.c:1160
 #, c-format
 msgid ""
 "Missing value(s) for all variables from %s onward.  These will be filled "
 "with the system-missing value or blanks, as appropriate."
 msgstr ""
 
-#: src/data-list.c:1311
+#: src/data-list.c:1331
 msgid ""
 "REPEATING DATA must use the same file as its corresponding DATA LIST or FILE "
 "TYPE."
 msgstr ""
 
-#: src/data-list.c:1345
+#: src/data-list.c:1365
 #, c-format
 msgid "STARTS beginning column (%d) exceeds STARTS ending column (%d)."
 msgstr ""
 
-#: src/data-list.c:1401
+#: src/data-list.c:1421
 #, c-format
 msgid "CONTINUED beginning column (%d) exceeds CONTINUED ending column (%d)."
 msgstr ""
 
-#: src/data-list.c:1424
+#: src/data-list.c:1444
 #, c-format
 msgid "ID beginning column (%ld) must be positive."
 msgstr ""
 
-#: src/data-list.c:1439
+#: src/data-list.c:1459
 #, c-format
 msgid "ID ending column (%ld) must be positive."
 msgstr ""
 
-#: src/data-list.c:1445
+#: src/data-list.c:1465
 #, c-format
 msgid "ID ending column (%ld) cannot be less than ID beginning column (%d)."
 msgstr ""
 
-#: src/data-list.c:1484
+#: src/data-list.c:1505
 msgid "Missing required specification STARTS."
 msgstr ""
 
-#: src/data-list.c:1486
+#: src/data-list.c:1507
 msgid "Missing required specification OCCURS."
 msgstr ""
 
-#: src/data-list.c:1493
+#: src/data-list.c:1514
 msgid "ID specified without CONTINUED."
 msgstr ""
 
-#: src/data-list.c:1581
+#: src/data-list.c:1602
 msgid "String variable not allowed here."
 msgstr ""
 
-#: src/data-list.c:1591
+#: src/data-list.c:1612
 #, c-format
 msgid "%s (%d) must be at least 1."
 msgstr ""
 
-#: src/data-list.c:1597
+#: src/data-list.c:1618
 #, c-format
 msgid "Variable or integer expected for %s."
 msgstr ""
 
-#: src/data-list.c:1736
+#: src/data-list.c:1753
 #, c-format
-msgid "Mismatched case ID (%s).  Expected value was %s."
+msgid "Encountered mismatched record ID \"%s\" expecting \"%s\"."
 msgstr ""
 
-#: src/data-list.c:1768
+#: src/data-list.c:1785
 #, c-format
 msgid ""
 "Variable %s starting in column %d extends beyond physical record length of %"
 "d."
 msgstr ""
 
-#: src/data-list.c:1836
+#: src/data-list.c:1853
 #, c-format
 msgid "Invalid value %d for OCCURS."
 msgstr ""
 
-#: src/data-list.c:1842
+#: src/data-list.c:1859
 #, c-format
 msgid "Beginning column for STARTS (%d) must be at least 1."
 msgstr ""
 
-#: src/data-list.c:1850
+#: src/data-list.c:1867
 #, c-format
 msgid "Ending column for STARTS (%d) is less than beginning column (%d)."
 msgstr ""
 
-#: src/data-list.c:1858
+#: src/data-list.c:1875
 #, c-format
 msgid "Invalid value %d for LENGTH."
 msgstr ""
 
-#: src/data-list.c:1865
+#: src/data-list.c:1882
 #, c-format
 msgid "Beginning column for CONTINUED (%d) must be at least 1."
 msgstr ""
 
-#: src/data-list.c:1873
+#: src/data-list.c:1890
 #, c-format
 msgid "Ending column for CONTINUED (%d) is less than beginning column (%d)."
 msgstr ""
 
-#: src/data-list.c:1896
+#: src/data-list.c:1913
 #, c-format
 msgid ""
 "Number of repetitions specified on OCCURS (%d) exceed number of repetitions "
 "available in space on STARTS (%d), and CONTINUED not specified."
 msgstr ""
 
-#: src/data-list.c:1913
+#: src/data-list.c:1930
 #, c-format
 msgid "Unexpected end of file with %d repetitions remaining out of %d."
 msgstr ""
 
-#: src/data-out.c:143 src/sfm-read.c:470 src/sysfile-info.c:116
+#: src/data-out.c:232 src/sfm-read.c:470 src/sysfile-info.c:116
 msgid "Unknown"
 msgstr ""
 
-#: src/data-out.c:251
+#: src/data-out.c:340
 msgid ""
 "The N output format cannot be used to output a negative number or the system-"
 "missing value."
 msgstr ""
 
-#: src/data-out.c:362
+#: src/data-out.c:451
 #, c-format
 msgid ""
 "Quality of zoned decimal (Z) output format code is suspect.  Check your "
 "results. Report bugs to %s."
 msgstr ""
 
-#: src/data-out.c:369
+#: src/data-out.c:459
 msgid "The system-missing value cannot be output as a zoned decimal number."
 msgstr ""
 
-#: src/data-out.c:382
+#: src/data-out.c:472
 #, c-format
 msgid "Number %g too big to fit in field with format Z%d.%d."
 msgstr ""
 
-#: src/data-out.c:774
+#: src/data-out.c:864
 #, c-format
 msgid "Time value %g too large in magnitude to convert to alphanumeric time."
 msgstr ""
 
-#: src/data-out.c:827
+#: src/data-out.c:915
 #, c-format
-msgid "Weekday index %d does not lie between 1 and 7."
+msgid "Weekday index %f does not lie between 1 and 7."
 msgstr ""
 
-#: src/data-out.c:848
+#: src/data-out.c:935
 #, c-format
-msgid "Month index %d does not lie between 1 and 12."
+msgid "Month index %f does not lie between 1 and 12."
 msgstr ""
 
-#: src/data-out.c:960
+#: src/data-out.c:1048
 #, c-format
 msgid ""
 "Year %d cannot be represented in four digits for output formatting purposes."
@@ -2083,51 +2083,41 @@ msgstr ""
 msgid "installation error"
 msgstr ""
 
-#: src/expr-evl.c:1125
+#: src/expr-evl.c:1118
 msgid ""
 "A number being treated as a Boolean in an expression was found to have a "
 "value other than 0 (false), 1 (true), or the system-missing value.  The "
 "result was forced to 0."
 msgstr ""
 
-#: src/expr-evl.c:1169
+#: src/expr-evl.c:1162
 #, c-format
 msgid ""
 "SYSMIS is not a valid index value for vector %s.  The result will be set to "
 "SYSMIS."
 msgstr ""
 
-#: src/expr-evl.c:1173
+#: src/expr-evl.c:1166
 #, c-format
 msgid ""
 "%g is not a valid index value for vector %s.  The result will be set to "
 "SYSMIS."
 msgstr ""
 
-#: src/expr-evl.c:1191
+#: src/expr-evl.c:1184
 #, c-format
 msgid ""
 "SYSMIS is not a valid index value for vector %s.  The result will be set to "
 "the empty string."
 msgstr ""
 
-#: src/expr-evl.c:1196
+#: src/expr-evl.c:1189
 #, c-format
 msgid ""
 "%g is not a valid index value for vector %s.  The result will be set to the "
 "empty string."
 msgstr ""
 
-#: src/expr-evl.c:1296
-#, c-format
-msgid "evaluate_expression(): not implemented: %s\n"
-msgstr ""
-
-#: src/expr-evl.c:1299
-#, c-format
-msgid "evaluate_expression(): not implemented: %d\n"
-msgstr ""
-
 #: src/expr-opt.c:663
 msgid ""
 "While optimizing a constant expression, there was a bad value for the third "
@@ -2150,7 +2140,7 @@ msgstr ""
 msgid "Second argument to %cTRIM() must be at least one character in length."
 msgstr ""
 
-#: src/expr-opt.c:881
+#: src/expr-opt.c:882
 msgid ""
 "When optimizing a constant expression, an integer that was being used as an "
 "Boolean value was found to have a constant value other than 0, 1, or SYSMIS."
@@ -2468,12 +2458,12 @@ msgstr ""
 msgid "No commands between FILE TYPE and END FILE TYPE."
 msgstr ""
 
-#: src/file-type.c:654
+#: src/file-type.c:655
 #, c-format
 msgid "Unknown record type \"%.*s\"."
 msgstr ""
 
-#: src/file-type.c:678
+#: src/file-type.c:679
 #, c-format
 msgid "Unknown record type %g."
 msgstr ""
@@ -2502,49 +2492,49 @@ msgstr ""
 msgid "Could not create acceptable variant for variable %s."
 msgstr ""
 
-#: src/flip.c:179
+#: src/flip.c:178
 msgid "Cannot create more than 99999 variable names."
 msgstr ""
 
-#: src/flip.c:295
+#: src/flip.c:293
 #, c-format
 msgid "Error reading FLIP source file: %s."
 msgstr ""
 
-#: src/flip.c:382
+#: src/flip.c:380
 msgid "Could not create temporary file for FLIP."
 msgstr ""
 
-#: src/flip.c:392 src/flip.c:411
+#: src/flip.c:390 src/flip.c:409
 #, c-format
 msgid "Error writing FLIP file: %s."
 msgstr ""
 
-#: src/flip.c:447
+#: src/flip.c:445
 msgid "Error creating FLIP source file."
 msgstr ""
 
-#: src/flip.c:450
+#: src/flip.c:448
 #, c-format
 msgid "Error rewinding FLIP file: %s."
 msgstr ""
 
-#: src/flip.c:459
+#: src/flip.c:457
 #, c-format
 msgid "Error reading FLIP file: %s."
 msgstr ""
 
-#: src/flip.c:471
+#: src/flip.c:469
 #, c-format
 msgid "Error seeking FLIP source file: %s."
 msgstr ""
 
-#: src/flip.c:476
+#: src/flip.c:474
 #, c-format
 msgid "Error writing FLIP source file: %s."
 msgstr ""
 
-#: src/flip.c:484
+#: src/flip.c:482
 #, c-format
 msgid "Error rewind FLIP source file: %s."
 msgstr ""
@@ -2640,7 +2630,7 @@ msgstr ""
 msgid "Format %s may not be assigned to a %s variable."
 msgstr ""
 
-#: src/formats.c:123 src/numeric.c:66 src/numeric.c:139
+#: src/formats.c:123 src/numeric.c:65 src/numeric.c:137
 msgid "`)' expected after output format."
 msgstr ""
 
@@ -2659,7 +2649,7 @@ msgstr ""
 msgid "GET translation table from file to memory:\n"
 msgstr ""
 
-#: src/get.c:115 src/get.c:1398
+#: src/get.c:115 src/get.c:1397
 #, c-format
 msgid "  %8s from %3d,%3d to %3d,%3d\n"
 msgstr ""
@@ -2741,18 +2731,18 @@ msgstr ""
 msgid "File %s lacks BY variable %s."
 msgstr ""
 
-#: src/get.c:1311
+#: src/get.c:1310
 #, c-format
 msgid ""
 "Variable %s in file %s (%s) has different type or width from the same "
 "variable in earlier file (%s)."
 msgstr ""
 
-#: src/get.c:1360
+#: src/get.c:1359
 msgid "expecting COMM or TAPE"
 msgstr ""
 
-#: src/get.c:1393
+#: src/get.c:1392
 #, c-format
 msgid "IMPORT translation table from file to memory:\n"
 msgstr ""
@@ -2782,24 +2772,24 @@ msgstr ""
 msgid "Closing `%s': %s."
 msgstr ""
 
-#: src/glob.c:222
+#: src/glob.c:217
 msgid "data> "
 msgstr ""
 
-#: src/glob.c:279
+#: src/glob.c:274
 msgid "Specify a terminal type with `setenv TERM <yourtype>'."
 msgstr ""
 
-#: src/glob.c:285
+#: src/glob.c:280
 msgid "Could not access the termcap data base."
 msgstr ""
 
-#: src/glob.c:287
+#: src/glob.c:282
 #, c-format
 msgid "Terminal type `%s' is not defined."
 msgstr ""
 
-#: src/glob.c:288
+#: src/glob.c:283
 msgid "Assuming screen of size 79x25."
 msgstr ""
 
@@ -3009,31 +2999,31 @@ msgstr ""
 msgid "Unrecognized filename format."
 msgstr ""
 
-#: src/inpt-pgm.c:83
+#: src/inpt-pgm.c:84
 msgid "No matching INPUT PROGRAM command."
 msgstr ""
 
-#: src/inpt-pgm.c:88
+#: src/inpt-pgm.c:89
 msgid ""
 "No data-input or transformation commands specified between INPUT PROGRAM and "
 "END INPUT PROGRAM."
 msgstr ""
 
-#: src/inpt-pgm.c:265 src/inpt-pgm.c:408
+#: src/inpt-pgm.c:283 src/inpt-pgm.c:420
 msgid ""
 "This command may only be executed between INPUT PROGRAM and END INPUT "
 "PROGRAM."
 msgstr ""
 
-#: src/inpt-pgm.c:324
+#: src/inpt-pgm.c:336
 msgid "COLUMN subcommand multiply specified."
 msgstr ""
 
-#: src/inpt-pgm.c:338
+#: src/inpt-pgm.c:350
 msgid "expecting file handle name"
 msgstr ""
 
-#: src/inpt-pgm.c:381
+#: src/inpt-pgm.c:393
 msgid ""
 "REREAD: Column numbers must be positive finite numbers.  Column set to 1."
 msgstr ""
@@ -3097,12 +3087,12 @@ msgstr ""
 msgid "The rest of this command has been discarded."
 msgstr ""
 
-#: src/lexer.c:842 src/print.c:1157
+#: src/lexer.c:842 src/print.c:1150
 #, c-format
 msgid "<ERROR>"
 msgstr ""
 
-#: src/lexer.c:968 src/pfm-read.c:132 src/repeat.c:226
+#: src/lexer.c:968 src/pfm-read.c:132 src/repeat.c:225
 msgid "Unexpected end of file."
 msgstr ""
 
@@ -3147,20 +3137,20 @@ msgstr ""
 msgid "The index variable may not be a string variable."
 msgstr ""
 
-#: src/loop.c:321
+#: src/loop.c:316
 msgid "There is no LOOP command that corresponds to this END LOOP."
 msgstr ""
 
-#: src/loop.c:522
+#: src/loop.c:517
 msgid ""
 "This command may only appear enclosed in a LOOP/END LOOP control structure."
 msgstr ""
 
-#: src/loop.c:528
+#: src/loop.c:523
 msgid "BREAK not enclosed in DO IF structure."
 msgstr ""
 
-#: src/loop.c:605
+#: src/loop.c:600
 #, c-format
 msgid "%s without %s."
 msgstr ""
@@ -3199,168 +3189,168 @@ msgstr ""
 msgid "VARNAME_ cannot be explicitly specified on VARIABLES."
 msgstr ""
 
-#: src/matrix-data.c:267
+#: src/matrix-data.c:265
 msgid "in FORMAT subcommand"
 msgstr ""
 
-#: src/matrix-data.c:278
+#: src/matrix-data.c:276
 msgid "SPLIT subcommand multiply specified."
 msgstr ""
 
-#: src/matrix-data.c:285
+#: src/matrix-data.c:283
 msgid "in SPLIT subcommand"
 msgstr ""
 
-#: src/matrix-data.c:294
+#: src/matrix-data.c:292
 msgid "Split variable may not be named ROWTYPE_ or VARNAME_."
 msgstr ""
 
-#: src/matrix-data.c:327
+#: src/matrix-data.c:324
 #, c-format
 msgid "Split variable %s is already another type."
 msgstr ""
 
-#: src/matrix-data.c:342
+#: src/matrix-data.c:339
 msgid "FACTORS subcommand multiply specified."
 msgstr ""
 
-#: src/matrix-data.c:357
+#: src/matrix-data.c:354
 #, c-format
 msgid "Factor variable %s is already another type."
 msgstr ""
 
-#: src/matrix-data.c:372
+#: src/matrix-data.c:369
 msgid "CELLS subcommand multiply specified."
 msgstr ""
 
-#: src/matrix-data.c:378 src/matrix-data.c:397
+#: src/matrix-data.c:375 src/matrix-data.c:394
 msgid "expecting positive integer"
 msgstr ""
 
-#: src/matrix-data.c:391
+#: src/matrix-data.c:388
 msgid "N subcommand multiply specified."
 msgstr ""
 
-#: src/matrix-data.c:412
+#: src/matrix-data.c:409
 msgid "CONTENTS subcommand multiply specified."
 msgstr ""
 
-#: src/matrix-data.c:432
+#: src/matrix-data.c:429
 msgid "Nested parentheses not allowed."
 msgstr ""
 
-#: src/matrix-data.c:442
+#: src/matrix-data.c:439
 msgid "Mismatched right parenthesis (`(')."
 msgstr ""
 
-#: src/matrix-data.c:447
+#: src/matrix-data.c:444
 msgid "Empty parentheses not allowed."
 msgstr ""
 
-#: src/matrix-data.c:460 src/matrix-data.c:468
+#: src/matrix-data.c:457 src/matrix-data.c:465
 msgid "in CONTENTS subcommand"
 msgstr ""
 
-#: src/matrix-data.c:475
+#: src/matrix-data.c:472
 #, c-format
 msgid "Content multiply specified for %s."
 msgstr ""
 
-#: src/matrix-data.c:492
+#: src/matrix-data.c:489
 msgid "Missing right parenthesis."
 msgstr ""
 
-#: src/matrix-data.c:512
+#: src/matrix-data.c:509
 msgid "Missing VARIABLES subcommand."
 msgstr ""
 
-#: src/matrix-data.c:518
+#: src/matrix-data.c:515
 msgid ""
 "CONTENTS subcommand not specified: assuming file contains only CORR matrix."
 msgstr ""
 
-#: src/matrix-data.c:528
+#: src/matrix-data.c:525
 msgid ""
 "Missing CELLS subcommand.  CELLS is required when ROWTYPE_ is not given in "
 "the data and factors are present."
 msgstr ""
 
-#: src/matrix-data.c:536
+#: src/matrix-data.c:533
 msgid "Split file values must be present in the data when ROWTYPE_ is present."
 msgstr ""
 
-#: src/matrix-data.c:592
+#: src/matrix-data.c:588
 msgid "No continuous variables specified."
 msgstr ""
 
-#: src/matrix-data.c:1006
+#: src/matrix-data.c:1002
 #, c-format
 msgid "End of line expected %s while reading %s."
 msgstr ""
 
-#: src/matrix-data.c:1193
+#: src/matrix-data.c:1190
 #, c-format
 msgid "expecting value for %s %s"
 msgstr ""
 
-#: src/matrix-data.c:1344
+#: src/matrix-data.c:1342
 #, c-format
 msgid "Syntax error expecting SPLIT FILE value %s."
 msgstr ""
 
-#: src/matrix-data.c:1353
+#: src/matrix-data.c:1351
 #, c-format
 msgid "Expecting value %g for %s."
 msgstr ""
 
-#: src/matrix-data.c:1391 src/matrix-data.c:1820
+#: src/matrix-data.c:1389 src/matrix-data.c:1823
 #, c-format
 msgid "Syntax error expecting factor value %s."
 msgstr ""
 
-#: src/matrix-data.c:1400
+#: src/matrix-data.c:1398
 #, c-format
 msgid "Syntax error expecting value %g for %s %s."
 msgstr ""
 
-#: src/matrix-data.c:1610
+#: src/matrix-data.c:1612
 #, c-format
 msgid "Syntax error %s expecting SPLIT FILE value."
 msgstr ""
 
-#: src/matrix-data.c:1734
+#: src/matrix-data.c:1736
 #, c-format
 msgid ""
 "Expected %d lines of data for %s content; actually saw %d lines.  No data "
 "will be output for this content."
 msgstr ""
 
-#: src/matrix-data.c:1765
+#: src/matrix-data.c:1768
 #, c-format
 msgid "Multiply specified ROWTYPE_ %s."
 msgstr ""
 
-#: src/matrix-data.c:1770
+#: src/matrix-data.c:1773
 #, c-format
 msgid "Syntax error %s expecting ROWTYPE_ string."
 msgstr ""
 
-#: src/matrix-data.c:1789
+#: src/matrix-data.c:1792
 #, c-format
 msgid "Syntax error %s."
 msgstr ""
 
-#: src/matrix-data.c:1935
+#: src/matrix-data.c:1938
 #, c-format
 msgid "Duplicate specification for %s."
 msgstr ""
 
-#: src/matrix-data.c:1947
+#: src/matrix-data.c:1950
 #, c-format
 msgid "Too many rows of matrix data for %s."
 msgstr ""
 
-#: src/matrix-data.c:1992
+#: src/matrix-data.c:1995
 #, c-format
 msgid "Syntax error expecting value for %s %s."
 msgstr ""
@@ -3403,7 +3393,7 @@ msgstr ""
 msgid "String is not of proper length."
 msgstr ""
 
-#: src/mis-val.c:326 src/repeat.c:484
+#: src/mis-val.c:326 src/repeat.c:476
 msgid "String expected."
 msgstr ""
 
@@ -3491,17 +3481,17 @@ msgstr ""
 msgid "`/' or `.' expected."
 msgstr ""
 
-#: src/numeric.c:59
+#: src/numeric.c:58
 #, c-format
 msgid "Format type %s may not be used with a numeric variable."
 msgstr ""
 
-#: src/numeric.c:78 src/numeric.c:161 src/vector.c:158
+#: src/numeric.c:77 src/numeric.c:159 src/vector.c:157
 #, c-format
 msgid "There is already a variable named %s."
 msgstr ""
 
-#: src/numeric.c:132
+#: src/numeric.c:130
 #, c-format
 msgid "Format type %s may not be used with a string variable."
 msgstr ""
@@ -3686,7 +3676,7 @@ msgstr ""
 msgid "portable file %s corrupt at offset %ld: "
 msgstr ""
 
-#: src/pfm-read.c:108 src/pfm-write.c:501
+#: src/pfm-read.c:108 src/pfm-write.c:502
 #, c-format
 msgid "%s: Closing portable file: %s."
 msgstr ""
@@ -3894,12 +3884,12 @@ msgstr ""
 msgid "Error writing portable-file header."
 msgstr ""
 
-#: src/pfm-write.c:168
+#: src/pfm-write.c:169
 #, c-format
 msgid "%s: Writing portable file: %s."
 msgstr ""
 
-#: src/pfm-write.c:510
+#: src/pfm-write.c:511
 msgid "writing as a portable file"
 msgstr ""
 
@@ -4087,25 +4077,25 @@ msgstr ""
 msgid "Writing %3d records to the listing file."
 msgstr ""
 
-#: src/print.c:1046
+#: src/print.c:1039
 msgid "A file name or handle was expected in the OUTFILE subcommand."
 msgstr ""
 
-#: src/print.c:1098
+#: src/print.c:1091
 #, c-format
 msgid ""
 "The expression on PRINT SPACE evaluated to %d.  It's not possible to PRINT "
 "SPACE a negative number of lines."
 msgstr ""
 
-#: src/recode.c:288
+#: src/recode.c:287
 #, c-format
 msgid ""
 "%d variable(s) cannot be recoded into %d variable(s).  Specify the same "
 "number of variables as input and output variables."
 msgstr ""
 
-#: src/recode.c:302
+#: src/recode.c:301
 #, c-format
 msgid ""
 "There is no string variable named %s.  (All string variables specified on "
@@ -4113,56 +4103,56 @@ msgid ""
 "variable.)"
 msgstr ""
 
-#: src/recode.c:311
+#: src/recode.c:310
 #, c-format
 msgid ""
 "Type mismatch between input and output variables.  Output variable %s is not "
 "a string variable, but all the input variables are string variables."
 msgstr ""
 
-#: src/recode.c:330
+#: src/recode.c:329
 #, c-format
 msgid "Type mismatch after INTO: %s is not a numeric variable."
 msgstr ""
 
-#: src/recode.c:360
+#: src/recode.c:359
 msgid ""
 "INTO must be used when the input values are numeric and output values are "
 "string."
 msgstr ""
 
-#: src/recode.c:368
+#: src/recode.c:367
 msgid ""
 "INTO must be used when the input values are string and output values are "
 "numeric."
 msgstr ""
 
-#: src/recode.c:504
+#: src/recode.c:501
 msgid ""
 "Inconsistent output types.  The output values must be all numeric or all "
 "string."
 msgstr ""
 
-#: src/recode.c:555
+#: src/recode.c:552
 msgid "following LO THRU"
 msgstr ""
 
-#: src/recode.c:571 src/recode.c:600
+#: src/recode.c:568 src/recode.c:597
 msgid "in source value"
 msgstr ""
 
-#: src/recode.c:613
+#: src/recode.c:610
 msgid ""
 "Keyword CONVERT may only be used with string input values and numeric output "
 "values."
 msgstr ""
 
-#: src/recode.c:869
+#: src/recode.c:866
 #, c-format
 msgid "!!END!!"
 msgstr ""
 
-#: src/recode.c:890 src/recode.c:906
+#: src/recode.c:887 src/recode.c:903
 #, c-format
 msgid "!!ERROR!!"
 msgstr ""
@@ -4184,12 +4174,12 @@ msgstr ""
 msgid "Renaming would duplicate variable name %s."
 msgstr ""
 
-#: src/repeat.c:159
+#: src/repeat.c:158
 #, c-format
 msgid "Identifier %s is given twice."
 msgstr ""
 
-#: src/repeat.c:202
+#: src/repeat.c:201
 #, c-format
 msgid ""
 "There must be the same number of substitutions for each dummy variable "
@@ -4197,11 +4187,11 @@ msgid ""
 "s as well, but %d were specified."
 msgstr ""
 
-#: src/repeat.c:311
+#: src/repeat.c:310
 msgid "No commands in scope."
 msgstr ""
 
-#: src/repeat.c:511
+#: src/repeat.c:503
 msgid "No matching DO REPEAT."
 msgstr ""
 
@@ -4697,7 +4687,7 @@ msgstr ""
 msgid "SORT: Closing handle %d."
 msgstr ""
 
-#: src/sort.c:594 src/sort.c:819
+#: src/sort.c:594 src/sort.c:818
 #, c-format
 msgid "%s: Error closing temporary file: %s."
 msgstr ""
@@ -4717,76 +4707,76 @@ msgstr ""
 msgid "%s: Error creating temporary file: %s."
 msgstr ""
 
-#: src/sort.c:823 src/sort.c:985 src/sort.c:1035 src/sort.c:1207
-#: src/sort.c:1214
+#: src/sort.c:822 src/sort.c:983 src/sort.c:1033 src/sort.c:1202
+#: src/sort.c:1209
 #, c-format
 msgid "%s: Error removing temporary file: %s."
 msgstr ""
 
-#: src/sort.c:967
+#: src/sort.c:965
 msgid "merging runs"
 msgstr ""
 
-#: src/sort.c:975
+#: src/sort.c:973
 #, c-format
 msgid " into run %d(%d)\n"
 msgstr ""
 
-#: src/sort.c:994
+#: src/sort.c:992
 msgid "Out of memory expanding Huffman priority queue."
 msgstr ""
 
-#: src/sort.c:1046
+#: src/sort.c:1044
 #, c-format
 msgid "%s: Error creating temporary file for merge: %s."
 msgstr ""
 
-#: src/sort.c:1074 src/sort.c:1134
+#: src/sort.c:1071 src/sort.c:1129
 #, c-format
 msgid "%s: Error reading temporary file in merge: %s."
 msgstr ""
 
-#: src/sort.c:1077 src/sort.c:1138
+#: src/sort.c:1074 src/sort.c:1133
 #, c-format
 msgid "%s: Unexpected end of temporary file in merge."
 msgstr ""
 
-#: src/sort.c:1103
+#: src/sort.c:1099
 #, c-format
 msgid "%s: Error writing temporary file in merge: %s."
 msgstr ""
 
-#: src/sort.c:1154 src/sort.c:1187
+#: src/sort.c:1149 src/sort.c:1182
 #, c-format
 msgid "%s: Error closing temporary file in merge: %s."
 msgstr ""
 
-#: src/sort.c:1159
+#: src/sort.c:1154
 #, c-format
 msgid "%s: Error removing temporary file in merge: %s."
 msgstr ""
 
-#: src/sort.c:1258
+#: src/sort.c:1253
 #, c-format
 msgid "%s: Cannot open sort result file: %s."
 msgstr ""
 
-#: src/sort.c:1269
+#: src/sort.c:1264
 #, c-format
 msgid "%s: Error reading sort result file: %s."
 msgstr ""
 
-#: src/sort.c:1272
+#: src/sort.c:1267
 #, c-format
 msgid "%s: Unexpected end of sort result file: %s."
 msgstr ""
 
-#: src/sort.c:1283
+#: src/sort.c:1278
 #, c-format
 msgid "%s: Error closing sort result file: %s."
 msgstr ""
 
-#: src/sort.c:1287
+#: src/sort.c:1282
 #, c-format
 msgid "%s: Error removing sort result file: %s."
 msgstr ""
@@ -4892,7 +4882,7 @@ msgstr ""
 msgid "Documents in the active file:"
 msgstr ""
 
-#: src/sysfile-info.c:379 src/sysfile-info.c:537 src/vfm.c:1095
+#: src/sysfile-info.c:379 src/sysfile-info.c:537 src/vfm.c:1083
 msgid "Label"
 msgstr ""
 
@@ -5082,95 +5072,95 @@ msgstr ""
 msgid "Bad bounds in use of TO convention."
 msgstr ""
 
-#: src/vector.c:69
+#: src/vector.c:68
 #, c-format
 msgid "Vector name %s is given twice."
 msgstr ""
 
-#: src/vector.c:75
+#: src/vector.c:74
 #, c-format
 msgid "There is already a vector with name %s."
 msgstr ""
 
-#: src/vector.c:96
+#: src/vector.c:95
 msgid ""
 "A slash must be used to separate each vector specification when using the "
 "long form.  Commands such as VECTOR A,B=Q1 TO Q20 are not supported."
 msgstr ""
 
-#: src/vector.c:130
+#: src/vector.c:129
 msgid "Vectors must have at least one element."
 msgstr ""
 
-#: src/vector.c:144
+#: src/vector.c:143
 #, c-format
 msgid "%s%d is too long for a variable name."
 msgstr ""
 
-#: src/vector.c:184
+#: src/vector.c:181
 msgid ""
 "The syntax for this command does not match the expected syntax for either "
 "the long form or the short form of VECTOR."
 msgstr ""
 
-#: src/vfm.c:293
+#: src/vfm.c:286
 #, c-format
 msgid ""
 "Workspace overflow predicted.  Max workspace is currently set to %d KB (%d "
 "cases at %d bytes each).  Paging active file to disk."
 msgstr ""
 
-#: src/vfm.c:365
+#: src/vfm.c:361
 msgid "<NOVAR>"
 msgstr ""
 
-#: src/vfm.c:612
+#: src/vfm.c:566
 #, c-format
 msgid ""
 "An error occurred attempting to create a temporary file for use as the "
 "active file: %s."
 msgstr ""
 
-#: src/vfm.c:630
+#: src/vfm.c:584
 #, c-format
 msgid ""
 "An error occurred while attempting to read from a temporary file created for "
 "the active file: %s."
 msgstr ""
 
-#: src/vfm.c:658
+#: src/vfm.c:612
 #, c-format
 msgid ""
 "An error occurred while attempting to write to a temporary file used as the "
 "active file: %s."
 msgstr ""
 
-#: src/vfm.c:672
+#: src/vfm.c:626
 #, c-format
 msgid ""
 "An error occurred while attempting to rewind a temporary file used as the "
 "active file: %s."
 msgstr ""
 
-#: src/vfm.c:787
+#: src/vfm.c:741
 msgid "Virtual memory exhausted.  Paging active file to disk."
 msgstr ""
 
-#: src/vfm.c:790
+#: src/vfm.c:744
 #, c-format
 msgid ""
 "Workspace limit of %d KB (%d cases at %d bytes each) overflowed.  Paging "
 "active file to disk."
 msgstr ""
 
-#: src/vfm.c:814 src/vfm.c:851
+#: src/vfm.c:768 src/vfm.c:805
 #, c-format
 msgid ""
 "An error occurred while attempting to write to a temporary file created as "
 "the active file, while paging to disk: %s."
 msgstr ""
 
-#: src/vfm.c:965
+#: src/vfm.c:919
 msgid "transform: "
 msgstr ""
 
index c1ef970989a6ea6dab6001d02921aa003d77658b..7c180a6d3f2818f967e6255eb27c14df3b7b3317 100644 (file)
@@ -1,3 +1,18 @@
+Wed Feb 18 21:48:54 WST 2004 John Darrington <john@darrington.wattle.id.au>
+
+       * Moved the declarations relating to values to their own header file
+         (val.h)
+
+       * Added levene.c and levene.h
+
+       * vars-atr.c: Changed the signature of compare_values to 
+       take const * arguments.
+               
+       * t-test.q: Changed the structure of struct t_test_proc 
+       variables now contain their own group statistics information.
+       Eventually, t_test_proc might get renamed, because it'd be 
+       applicable to other commands too.
+
 Mon Feb 16 23:15:51 2004  Ben Pfaff  <blp@gnu.org>
 
        * data-out.c: Clean up.  Changed interface of convert_*() to take
index 1305ca7e5c19c9582b8e134a5a9c33b11adfd464..5024da59ae8185ba5c4da70c9e6b966a373a0d26 100644 (file)
@@ -44,7 +44,8 @@ expr-prs.c expr.h exprP.h file-handle.h file-type.c   \
 filename.c filename.h flip.c font.h format.c format.def format.h       \
 formats.c get.c getline.c getline.h glob.c glob.h              \
 groff-font.c hash.c hash.h heap.c heap.h html.c htmlP.h include.c      \
-inpt-pgm.c lexer.c lexer.h log.h loop.c magic.c magic.h main.c \
+inpt-pgm.c lexer.c lexer.h levene.c levene.h \
+log.h loop.c magic.c magic.h main.c    \
 main.h matrix-data.c matrix.c matrix.h mis-val.c misc.c misc.h \
 modify-vars.c numeric.c output.c output.h pfm-read.c pfm-write.c pfm.h \
 pool.c pool.h postscript.c print.c random.c random.h recode.c          \
diff --git a/src/levene.c b/src/levene.c
new file mode 100644 (file)
index 0000000..9f2d3b1
--- /dev/null
@@ -0,0 +1,334 @@
+/* This file is part of GNU PSPP 
+   Computes Levene test  statistic.
+
+   Copyright (C) 2004 Free Software Foundation, Inc.
+   Written by John Darrington <john@darrington.wattle.id.au>
+
+   This program is free software; you can redistribute it and/or
+   modify it under the terms of the GNU General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+   02111-1307, USA. */
+
+#include <config.h>
+#include <assert.h>
+#include "levene.h"
+#include "hash.h"
+#include "var.h"
+#include "vfm.h"
+#include "alloc.h"
+#include "stats.h"
+
+#include <math.h>
+
+
+/* This module calculates the Levene statistic for variables.
+
+   Just for reference, the Levene Statistic is a defines as follows:
+
+   W = \frac{ (n-k)\sum_{i=1}^k n_i(Z_{iL} - Z_{LL})^2}
+            { (k-1)\sum_{i=1}^k \sum_{j=1}^{n_i} (Z_{ij} - Z_{iL})^2}
+
+   where:
+        k is the number of groups
+       n is the total number of samples
+        n_i is the number of samples in the ith group
+        Z_{ij} is | Y_{ij} - Y_{iL} | where Y_{iL} is the mean of the ith group
+       Z_{iL} is the  mean of Z_{ij} over the ith group
+       Z_{LL} is the grand mean of Z_{ij}
+
+   Imagine calculating that with pencil and paper!
+
+ */
+
+static void levene_precalc (void *);
+static int levene_calc (struct ccase *, void *);
+static void levene_postcalc (void *);
+
+
+/* Second pass */
+static void levene2_precalc (void *);
+static int levene2_calc (struct ccase *, void *);
+static void levene2_postcalc (void *);
+
+
+struct levene_info
+{
+
+  /* The number of groups */
+  int n_groups;
+
+  /* Per group statistics */
+  struct t_test_proc **group_stats;
+
+  /* The independent variable */
+  struct variable *v_indep; 
+
+  /* Number of dependent variables */
+  int n_dep;
+
+  /* The dependent variables */
+  struct variable  **v_dep;
+
+};
+
+
+
+void  
+levene(struct variable *v_indep, int n_dep, struct variable **v_dep)
+{
+  struct levene_info l;
+
+  l.n_dep=n_dep;
+  l.v_indep=v_indep;
+  l.v_dep=v_dep;
+
+  procedure(levene_precalc, levene_calc, levene_postcalc, &l);
+  procedure(levene2_precalc,levene2_calc,levene2_postcalc,&l);
+      
+}
+
+static struct hsh_table **hash;
+
+static int 
+compare_group_id(const void *a_, const void *b_, void *aux)
+{
+  const struct group_statistics *a = (struct group_statistics *) a_;
+  const struct group_statistics *b = (struct group_statistics *) b_;
+
+  int width = (int) aux;
+  
+  return compare_values(&a->id, &b->id, width);
+}
+
+
+static unsigned 
+hash_group_id(const void *g_, void *aux)
+{
+  const struct group_statistics *g = (struct group_statistics *) g_;
+
+  int width = (int) aux;
+
+  if ( 0 == width ) 
+    return hsh_hash_double (g->id.f);
+  else
+    return hsh_hash_bytes (g->id.s, width);
+
+}
+
+/* Internal variables used in calculating the Levene statistic */
+
+/* Per variable statistics */
+struct lz_stats
+{
+  /* Total of all lz */
+  double grand_total;
+
+  /* Mean of all lz */
+  double grand_mean;
+
+  /* The total number of cases */
+  double total_n ; 
+
+  /* Number of groups */
+  int n_groups;
+};
+
+/* An array of lz_stats for each variable */
+static struct lz_stats *lz;
+
+
+
+static void 
+levene_precalc (void *_l)
+{
+  int i;
+  struct levene_info *l = (struct levene_info *) _l;
+
+  lz  = xmalloc (sizeof (struct lz_stats ) * l->n_dep ) ;
+
+  hash = xmalloc (sizeof ( struct hsh_table *) * l->n_dep );
+
+  for(i=0; i < l->n_dep ; ++i ) 
+    {
+      struct variable *v = l->v_dep[i];
+      int g;
+      int number_of_groups = v->p.t_t.n_groups ; 
+
+      hash[i] = hsh_create (l->n_dep * number_of_groups,
+                           compare_group_id, hash_group_id,
+                           0,(void *) l->v_indep->width);
+
+      lz[i].grand_total = 0;
+      lz[i].total_n = 0;
+      lz[i].n_groups = number_of_groups;
+
+      for (g = 0 ; g < v->p.t_t.n_groups ; ++g ) 
+       {
+         struct group_statistics *gs = &v->p.t_t.gs[g];
+         gs->lz_total=0;
+         hsh_insert(hash[i],gs);
+       }
+    }
+
+}
+
+static int 
+levene_calc (struct ccase *c, void *_l)
+{
+  int var;
+  struct levene_info *l = (struct levene_info *) _l;
+  union value *gv = &c->data[l->v_indep->fv];
+  struct group_statistics key;
+  double weight = dict_get_case_weight(default_dict,c); 
+  
+  key.id = *gv;
+
+  for (var = 0; var < l->n_dep; ++var) 
+    {
+      double levene_z;
+      union value *v = &c->data[l->v_dep[var]->fv];
+      struct group_statistics *gs;
+      gs = hsh_find(hash[var],&key);
+      assert(0 == compare_values(&gs->id, &key.id, l->v_indep->width));
+
+      /* FIXME: handle SYSMIS properly */
+
+      levene_z= fabs(v->f - gs->mean);
+      lz[var].grand_total += levene_z * weight;
+      lz[var].total_n += weight; 
+
+      gs->lz_total += levene_z * weight;
+
+    }
+  return 0;
+}
+
+
+static void 
+levene_postcalc (void *_l)
+{
+  int v;
+
+  struct levene_info *l = (struct levene_info *) _l;
+
+  for (v = 0; v < l->n_dep; ++v) 
+    {
+      lz[v].grand_mean = lz[v].grand_total / lz[v].total_n ;
+
+    }
+
+}
+
+
+/* The denominator for the expression for the Levene */
+static double *lz_denominator;
+
+static void 
+levene2_precalc (void *_l)
+{
+  int v;
+
+  struct levene_info *l = (struct levene_info *) _l;
+
+  lz_denominator = (double *) xmalloc(sizeof(double) * l->n_dep);
+
+  /* This stuff could go in the first post calc . . . */
+  for (v = 0; v < l->n_dep; ++v) 
+    {
+      struct hsh_iterator hi;
+      struct group_statistics *g;
+      for(g = (struct group_statistics *) hsh_first(hash[v],&hi);
+         g != 0 ;
+         g = (struct group_statistics *) hsh_next(hash[v],&hi) )
+       {
+         g->lz_mean = g->lz_total/g->n ;
+       }
+      lz_denominator[v] = 0;
+  }
+}
+
+static int 
+levene2_calc (struct ccase *c, void *_l)
+{
+  int var;
+
+  struct levene_info *l = (struct levene_info *) _l;
+
+  double weight = dict_get_case_weight(default_dict,c); 
+
+  union value *gv = &c->data[l->v_indep->fv];
+  struct group_statistics key;
+
+  key.id = *gv;
+
+  for (var = 0; var < l->n_dep; ++var) 
+    {
+      double levene_z;
+      union value *v = &c->data[l->v_dep[var]->fv];
+      struct group_statistics *gs;
+      gs = hsh_find(hash[var],&key);
+      assert(gs);
+      assert(0 == compare_values(&gs->id, &key.id, l->v_indep->width));
+
+      /* FIXME: handle SYSMIS properly */
+
+      levene_z = fabs(v->f - gs->mean); 
+
+      lz_denominator[var] += weight * sqr(levene_z - gs->lz_mean);
+    }
+
+  return 0;
+}
+
+
+static void 
+levene2_postcalc (void *_l)
+{
+  int v;
+
+  struct levene_info *l = (struct levene_info *) _l;
+
+  for (v = 0; v < l->n_dep; ++v) 
+    {
+      double lz_numerator = 0;
+      struct hsh_iterator hi;
+      struct group_statistics *g;
+      for(g = (struct group_statistics *) hsh_first(hash[v],&hi);
+         g != 0 ;
+         g = (struct group_statistics *) hsh_next(hash[v],&hi) )
+       {
+
+         lz_numerator += g->n * sqr(g->lz_mean - lz[v].grand_mean );
+      
+
+       }
+      lz_numerator *= ( l->v_dep[v]->p.t_t.ugs.n - 
+                       l->v_dep[v]->p.t_t.n_groups );
+
+      lz_denominator[v] /= (l->v_dep[v]->p.t_t.n_groups - 1);
+      
+      l->v_dep[v]->p.t_t.levene = lz_numerator/lz_denominator[v] ;
+    }
+
+  /* Now clear up after ourselves */
+  free(lz_denominator);
+  for (v = 0; v < l->n_dep; ++v) 
+    {
+      hsh_destroy(hash[v]);
+    }
+
+  free(hash);
+  free(lz);
+}
+
+
diff --git a/src/levene.h b/src/levene.h
new file mode 100644 (file)
index 0000000..8f19dea
--- /dev/null
@@ -0,0 +1,43 @@
+/* This file is part of GNU PSPP 
+   Computes Levene test  statistic.
+
+   Copyright (C) 2004 Free Software Foundation, Inc.
+   Written by John Darrington <john@darrington.wattle.id.au>
+
+   This program is free software; you can redistribute it and/or
+   modify it under the terms of the GNU General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+   02111-1307, USA. */
+
+#if !levene_h
+#define levene_h 1
+
+
+#include "var.h"
+
+
+/* Calculate the Levene statistic 
+
+The independent variable :   v_indep; 
+
+Number of dependent variables :   n_dep;
+
+The dependent variables :   v_dep;
+
+*/
+
+void  levene(struct variable *v_indep, int n_dep, struct variable **v_dep);
+
+
+
+#endif /* levene_h */
index 8a72fb9ddd0ca7bf77af532dd985a0df9cb0382c..ad1d45cafa48ad18cd0dab176f8521abdbc62a70 100644 (file)
 #ifndef T_TEST_H
 #define T_TEST_H
 
-/* T-TEST private data */
-struct t_test_proc
+#include "val.h"
+
+/* Statistics for grouped data */
+struct group_statistics
   {
+    /* The value of the independent variable for this group */
+    union value id;
+
+    /* The arithmetic mean */
     double mean;
 
     /* Population std. deviation */
@@ -42,11 +48,35 @@ struct t_test_proc
     /* Std Err of Mean */
     double se_mean;
 
-    /* Sum of differnces */
+    /* Sum of differences */
     double sum_diff;
 
     /* Mean of differences */
     double mean_diff ;
+
+    /* Running total of the Levene for this group */
+    double lz_total;
+    
+    /* Group mean of Levene */
+    double lz_mean; 
+
   };
 
+
+/* T-TEST private data */
+struct t_test_proc
+{
+  /* Stats for the `universal group' */
+  struct group_statistics ugs;
+
+  /* Number of groups */
+  int n_groups ;
+
+  /* Stats for individual groups */
+  struct group_statistics *gs;
+
+  /* The levene statistic */
+  double levene ;
+};
+
 #endif
index 69d658aea001f1d211ef17c66908be9de4718e16..3f80214494bde1013c85f05713accbe7fe6df559 100644 (file)
@@ -40,6 +40,7 @@
 #include "hash.h"
 #include "stats.h"
 #include "t-test.h"
+#include "levene.h"
 
 /* (specification)
    "T-TEST" (tts_):
@@ -57,8 +58,6 @@
 
 static struct cmd_t_test cmd;
 
-int value_compare(const union value *a, const union value *b, int width);
-
 
 static struct pool *t_test_pool ;
 
@@ -67,15 +66,10 @@ static struct variable *groups;
 
 /* GROUPS: Number of values specified by the user; the values
    specified if any. */
+
 static int n_groups_values;
 static union value groups_values[2];
 
-/* Array of statistics for each group */
-typedef struct t_test_proc group_stats_t[2];
-static  group_stats_t *groups_stats;
-
-
-
 
 /* PAIRS: Number of pairs to be compared ; each pair. */
 static int n_pairs = 0 ;
@@ -281,10 +275,9 @@ cmd_t_test(void)
       break;
     case T_IND_SAMPLES:
       procedure(group_precalc,group_calc,group_postcalc, NULL);
+      levene(groups, cmd.n_variables, cmd.v_variables);
       break;
-
     }
-  
 
   t_test_pool = pool_create ();
 
@@ -293,9 +286,7 @@ cmd_t_test(void)
   ssbox_finalize(&stat_summary_box);
 
   if ( mode == T_PAIRED) 
-    {
       pscbox();
-    }
 
   trbox_create(&test_results_box,&cmd,mode);
   trbox_populate(&test_results_box,&cmd);
@@ -309,6 +300,17 @@ cmd_t_test(void)
   n_pairs=0;
   free(pairs);
   pairs=0;
+
+
+  if ( mode == T_IND_SAMPLES) 
+    {
+      int i;
+      /* Destroy any group statistics we created */
+      for (i= 0 ; i < cmd.n_variables ; ++i ) 
+       {
+         free(cmd.v_variables[i]->p.t_t.gs);
+       }
+    }
     
   return CMD_SUCCESS;
 }
@@ -693,14 +695,13 @@ ssbox_independent_samples_populate(struct ssbox *ssb,
       /* Fill in the group statistics */
       for ( g=0; g < 2 ; ++g ) 
        {
-         struct t_test_proc *ttp = &groups_stats[i][g];
+         struct group_statistics *gs = &cmd->v_variables[i]->p.t_t.gs[g];
 
-         tab_float(ssb->t, 2 ,i*2+g+1, TAB_RIGHT, ttp->n, 2, 0);
-         tab_float(ssb->t, 3 ,i*2+g+1, TAB_RIGHT, ttp->mean, 8, 2);
-         tab_float(ssb->t, 4 ,i*2+g+1, TAB_RIGHT, ttp->std_dev, 8, 3);
-         tab_float(ssb->t, 5 ,i*2+g+1, TAB_RIGHT, ttp->se_mean, 8, 3);
+         tab_float(ssb->t, 2 ,i*2+g+1, TAB_RIGHT, gs->n, 2, 0);
+         tab_float(ssb->t, 3 ,i*2+g+1, TAB_RIGHT, gs->mean, 8, 2);
+         tab_float(ssb->t, 4 ,i*2+g+1, TAB_RIGHT, gs->std_dev, 8, 3);
+         tab_float(ssb->t, 5 ,i*2+g+1, TAB_RIGHT, gs->se_mean, 8, 3);
        }
-
     }
 }
 
@@ -745,19 +746,19 @@ ssbox_paired_populate(struct ssbox *ssb,struct cmd_t_test *cmd UNUSED)
 
       for (j=0 ; j < 2 ; ++j) 
        {
-         struct t_test_proc *ttp;
+         struct group_statistics *gs;
 
-         ttp=&pairs[i].v[j]->p.t_t;
+         gs=&pairs[i].v[j]->p.t_t.ugs;
 
          /* Titles */
 
          tab_text (ssb->t, 1, i*2+j+1, TAB_LEFT, pairs[i].v[j]->name);
 
          /* Values */
-         tab_float (ssb->t,2, i*2+j+1, TAB_RIGHT, ttp->mean, 8, 2);
-         tab_float (ssb->t,3, i*2+j+1, TAB_RIGHT, ttp->n, 2, 0);
-         tab_float (ssb->t,4, i*2+j+1, TAB_RIGHT, ttp->std_dev, 8, 3);
-         tab_float (ssb->t,5, i*2+j+1, TAB_RIGHT, ttp->se_mean, 8, 3);
+         tab_float (ssb->t,2, i*2+j+1, TAB_RIGHT, gs->mean, 8, 2);
+         tab_float (ssb->t,3, i*2+j+1, TAB_RIGHT, gs->n, 2, 0);
+         tab_float (ssb->t,4, i*2+j+1, TAB_RIGHT, gs->std_dev, 8, 3);
+         tab_float (ssb->t,5, i*2+j+1, TAB_RIGHT, gs->se_mean, 8, 3);
 
        }
 
@@ -775,14 +776,14 @@ ssbox_one_sample_populate(struct ssbox *ssb, struct cmd_t_test *cmd)
 
   for (i=0; i < cmd->n_variables; ++i)
     {
-      struct t_test_proc *ttp;
-      ttp= &cmd->v_variables[i]->p.t_t;
+      struct group_statistics *gs;
+      gs= &cmd->v_variables[i]->p.t_t.ugs;
 
       tab_text (ssb->t, 0, i+1, TAB_LEFT, cmd->v_variables[i]->name);
-      tab_float (ssb->t,1, i+1, TAB_RIGHT, ttp->n, 2, 0);
-      tab_float (ssb->t,2, i+1, TAB_RIGHT, ttp->mean, 8, 2);
-      tab_float (ssb->t,3, i+1, TAB_RIGHT, ttp->std_dev, 8, 2);
-      tab_float (ssb->t,4, i+1, TAB_RIGHT, ttp->se_mean, 8, 3);
+      tab_float (ssb->t,1, i+1, TAB_RIGHT, gs->n, 2, 0);
+      tab_float (ssb->t,2, i+1, TAB_RIGHT, gs->mean, 8, 2);
+      tab_float (ssb->t,3, i+1, TAB_RIGHT, gs->std_dev, 8, 2);
+      tab_float (ssb->t,4, i+1, TAB_RIGHT, gs->se_mean, 8, 3);
     }
   
 }
@@ -907,30 +908,47 @@ trbox_independent_samples_populate(struct trbox *self,
       double t;
       double df;
 
+      double df1, df2;
+
       double pooled_variance;
       double std_err_diff;
       double mean_diff;
 
-      struct t_test_proc *ttp0;
-      struct t_test_proc *ttp1;
-      ttp0=&groups_stats[i][0];
-      ttp1=&groups_stats[i][1];
-
+      struct group_statistics *gs0 = &cmd->v_variables[i]->p.t_t.gs[0];
+      struct group_statistics *gs1 = &cmd->v_variables[i]->p.t_t.gs[1];
          
       tab_text (self->t, 0, i*2+3, TAB_LEFT, cmd->v_variables[i]->name);
 
       tab_text (self->t, 1, i*2+3, TAB_LEFT, _("Equal variances assumed"));
 
-      df = ttp0->n + ttp1->n - 2.0 ;
+
+      tab_float(self->t, 2, i*2+3, TAB_CENTER, 
+               cmd->v_variables[i]->p.t_t.levene, 8,3);
+
+
+      /* Now work out the significance of the Levene test */
+
+      which=1; df1 = 1; df2 = cmd->v_variables[i]->p.t_t.ugs.n - 2;
+      cdff(&which,&p,&q,&cmd->v_variables[i]->p.t_t.levene,
+          &df1,&df2,&status,&bound);
+
+      if ( 0 != status )
+       {
+         msg( SE, _("Error calculating F statistic (cdff returned %d)."),status);
+       }
+
+      tab_float(self->t, 3, i*2+3, TAB_CENTER, q, 8,3 );
+
+      df = gs0->n + gs1->n - 2.0 ;
       tab_float (self->t, 5, i*2+3, TAB_RIGHT, df, 2, 0);
 
-      pooled_variance = ( (ttp0->n )*sqr(ttp0->s_std_dev)
+      pooled_variance = ( (gs0->n )*sqr(gs0->s_std_dev)
                          + 
-                         (ttp1->n )*sqr(ttp1->s_std_dev) 
+                         (gs1->n )*sqr(gs1->s_std_dev) 
                        ) / df  ;
 
-      t = (ttp0->mean - ttp1->mean) / sqrt(pooled_variance) ;
-      t /= sqrt((ttp0->n + ttp1->n)/(ttp0->n*ttp1->n)); 
+      t = (gs0->mean - gs1->mean) / sqrt(pooled_variance) ;
+      t /= sqrt((gs0->n + gs1->n)/(gs0->n*gs1->n)); 
 
       tab_float (self->t, 4, i*2+3, TAB_RIGHT, t, 8, 3);
 
@@ -944,11 +962,11 @@ trbox_independent_samples_populate(struct trbox *self,
 
       tab_float(self->t, 6, i*2+3, TAB_RIGHT, 2.0*(t>0?q:p) , 8, 3);
 
-      mean_diff = ttp0->mean - ttp1->mean;
+      mean_diff = gs0->mean - gs1->mean;
       tab_float(self->t, 7, i*2+3, TAB_RIGHT, mean_diff, 8, 3);
 
 
-      std_err_diff = sqrt( sqr(ttp0->se_mean) + sqr(ttp1->se_mean));
+      std_err_diff = sqrt( sqr(gs0->se_mean) + sqr(gs1->se_mean));
       tab_float(self->t, 8, i*2+3, TAB_RIGHT, std_err_diff, 8, 3);
 
 
@@ -976,19 +994,19 @@ trbox_independent_samples_populate(struct trbox *self,
                TAB_LEFT, _("Equal variances not assumed"));
 
 
-      se2 = (sqr(ttp0->s_std_dev)/(ttp0->n -1) ) +
-       (sqr(ttp1->s_std_dev)/(ttp1->n -1) );
+      se2 = (sqr(gs0->s_std_dev)/(gs0->n -1) ) +
+       (sqr(gs1->s_std_dev)/(gs1->n -1) );
 
       t = mean_diff / sqrt(se2) ;
       tab_float (self->t, 4, i*2+3+1, TAB_RIGHT, t, 8, 3);
                
       df = sqr(se2) / ( 
-                      (sqr(sqr(ttp0->s_std_dev)/(ttp0->n - 1 )) 
-                       /(ttp0->n -1 )
+                      (sqr(sqr(gs0->s_std_dev)/(gs0->n - 1 )) 
+                       /(gs0->n -1 )
                        )
                       + 
-                      (sqr(sqr(ttp1->s_std_dev)/(ttp1->n - 1 ))
-                       /(ttp1->n -1 )
+                      (sqr(sqr(gs1->s_std_dev)/(gs1->n - 1 ))
+                       /(gs1->n -1 )
                        )
                       ) ;
       tab_float (self->t, 5, i*2+3+1, TAB_RIGHT, df, 8, 3);
@@ -1025,11 +1043,7 @@ trbox_independent_samples_populate(struct trbox *self,
       tab_float(self->t, 10, i*2+3+1, TAB_RIGHT, 
                mean_diff + t * std_err_diff, 8, 3); 
 
-
-
-
       }
-
     }
 }
 
@@ -1086,10 +1100,10 @@ trbox_paired_populate(struct trbox *trb,
       struct variable *v0 = pairs[i].v[0];
       struct variable *v1 = pairs[i].v[1];
 
-      struct t_test_proc *ttp0 = &v0->p.t_t;
-      struct t_test_proc *ttp1 = &v1->p.t_t;
+      struct group_statistics *gs0 = &v0->p.t_t.ugs;
+      struct group_statistics *gs1 = &v1->p.t_t.ugs;
 
-      double n = ttp0->n;
+      double n = gs0->n;
       double t;
       double df = n - 1;
       
@@ -1123,10 +1137,10 @@ trbox_paired_populate(struct trbox *trb,
       tab_float(trb->t, 6, i+3, TAB_RIGHT, 
                pairs[i].mean_diff + t * se_mean , 8, 4); 
 
-      t = ( ttp0->mean - ttp1->mean)
+      t = ( gs0->mean - gs1->mean)
        / sqrt ( 
-               (  sqr(ttp0->s_std_dev) + sqr(ttp1->s_std_dev)  - 
-                  2 * pairs[i].correlation * ttp0->s_std_dev * ttp1->s_std_dev                    )
+               (  sqr(gs0->s_std_dev) + sqr(gs1->s_std_dev)  - 
+                  2 * pairs[i].correlation * gs0->s_std_dev * gs1->s_std_dev              )
                / (n-1) )
        ;
 
@@ -1146,9 +1160,7 @@ trbox_paired_populate(struct trbox *trb,
 
       tab_float(trb->t, 9, i+3, TAB_RIGHT, 2.0*(t>0?q:p) , 8, 3);
 
-
     }
-
 }
 
 /* Initialize the one sample trbox */
@@ -1203,18 +1215,18 @@ trbox_one_sample_populate(struct trbox *trb, struct cmd_t_test *cmd)
       double df;
       int status;
       double bound;
-      struct t_test_proc *ttp;
-      ttp= &cmd->v_variables[i]->p.t_t;
+      struct group_statistics *gs;
+      gs= &cmd->v_variables[i]->p.t_t.ugs;
 
 
       tab_text (trb->t, 0, i+3, TAB_LEFT, cmd->v_variables[i]->name);
 
-      t = (ttp->mean - cmd->n_testval ) * sqrt(ttp->n) / ttp->std_dev ;
+      t = (gs->mean - cmd->n_testval ) * sqrt(gs->n) / gs->std_dev ;
 
       tab_float (trb->t, 1, i+3, TAB_RIGHT, t, 8,3);
 
       /* degrees of freedom */
-      df = ttp->n - 1;
+      df = gs->n - 1;
 
       tab_float (trb->t, 2, i+3, TAB_RIGHT, df, 8,0);
 
@@ -1230,7 +1242,7 @@ trbox_one_sample_populate(struct trbox *trb, struct cmd_t_test *cmd)
         the correct tail*/
       tab_float (trb->t, 3, i+3, TAB_RIGHT, 2.0*(t>0?q:p), 8,3);
 
-      tab_float (trb->t, 4, i+3, TAB_RIGHT, ttp->mean_diff, 8,3);
+      tab_float (trb->t, 4, i+3, TAB_RIGHT, gs->mean_diff, 8,3);
 
 
       q = (1 - cmd->criteria)/2.0;  /* 2-tailed test */
@@ -1243,10 +1255,10 @@ trbox_one_sample_populate(struct trbox *trb, struct cmd_t_test *cmd)
        }
 
       tab_float (trb->t, 5, i+3, TAB_RIGHT,
-                ttp->mean_diff - t * ttp->se_mean, 8,4);
+                gs->mean_diff - t * gs->se_mean, 8,4);
 
       tab_float (trb->t, 6, i+3, TAB_RIGHT,
-                ttp->mean_diff + t * ttp->se_mean, 8,4);
+                gs->mean_diff + t * gs->se_mean, 8,4);
     }
 }
 
@@ -1306,7 +1318,7 @@ pscbox(void)
       int status;
       double bound;
 
-      double df = pairs[i].v[0]->p.t_t.n -2;
+      double df = pairs[i].v[0]->p.t_t.ugs.n -2;
 
       double correlation_t = 
        pairs[i].correlation * sqrt(df) /
@@ -1323,7 +1335,7 @@ pscbox(void)
 
       /* row data */
       tab_float(table, 3, i+1, TAB_RIGHT, pairs[i].correlation, 8, 3);
-      tab_float(table, 2, i+1, TAB_RIGHT, pairs[i].v[0]->p.t_t.n , 4, 0);
+      tab_float(table, 2, i+1, TAB_RIGHT, pairs[i].v[0]->p.t_t.ugs.n , 4, 0);
 
 
       cdft(&which, &p, &q, &correlation_t, &df, &status, &bound);
@@ -1355,17 +1367,17 @@ common_calc (struct ccase *c, void *aux UNUSED)
 
   for(i=0; i< cmd.n_variables ; ++i) 
     {
-      struct t_test_proc *ttp;
+      struct group_statistics *gs;
       struct variable *v = cmd.v_variables[i];
       union value *val = &c->data[v->fv];
 
-      ttp= &cmd.v_variables[i]->p.t_t;
+      gs= &cmd.v_variables[i]->p.t_t.ugs;
 
       if (val->f != SYSMIS) 
        {
-         ttp->n+=weight;
-         ttp->sum+=weight * val->f;
-         ttp->ssq+=weight * val->f * val->f;
+         gs->n+=weight;
+         gs->sum+=weight * val->f;
+         gs->ssq+=weight * val->f * val->f;
        }
     }
   return 0;
@@ -1379,13 +1391,13 @@ common_precalc (void *aux UNUSED)
 
   for(i=0; i< cmd.n_variables ; ++i) 
     {
-      struct t_test_proc *ttp;
-      ttp= &cmd.v_variables[i]->p.t_t;
+      struct group_statistics *gs;
+      gs= &cmd.v_variables[i]->p.t_t.ugs;
       
-      ttp->sum=0;
-      ttp->n=0;
-      ttp->ssq=0;
-      ttp->sum_diff=0;
+      gs->sum=0;
+      gs->n=0;
+      gs->ssq=0;
+      gs->sum_diff=0;
     }
 }
 
@@ -1397,21 +1409,21 @@ common_postcalc (void *aux UNUSED)
 
   for(i=0; i< cmd.n_variables ; ++i) 
     {
-      struct t_test_proc *ttp;
-      ttp= &cmd.v_variables[i]->p.t_t;
+      struct group_statistics *gs;
+      gs= &cmd.v_variables[i]->p.t_t.ugs;
       
-      ttp->mean=ttp->sum / ttp->n;
-      ttp->s_std_dev= sqrt(
-                        ( (ttp->ssq / ttp->n ) - ttp->mean * ttp->mean )
+      gs->mean=gs->sum / gs->n;
+      gs->s_std_dev= sqrt(
+                        ( (gs->ssq / gs->n ) - gs->mean * gs->mean )
                         ) ;
 
-      ttp->std_dev= sqrt(
-                        ttp->n/(ttp->n-1) *
-                        ( (ttp->ssq / ttp->n ) - ttp->mean * ttp->mean )
+      gs->std_dev= sqrt(
+                        gs->n/(gs->n-1) *
+                        ( (gs->ssq / gs->n ) - gs->mean * gs->mean )
                         ) ;
 
-      ttp->se_mean = ttp->std_dev / sqrt(ttp->n);
-      ttp->mean_diff= ttp->sum_diff / ttp->n;
+      gs->se_mean = gs->std_dev / sqrt(gs->n);
+      gs->mean_diff= gs->sum_diff / gs->n;
     }
 }
 
@@ -1425,14 +1437,14 @@ one_sample_calc (struct ccase *c, void *aux UNUSED)
 
   for(i=0; i< cmd.n_variables ; ++i) 
     {
-      struct t_test_proc *ttp;
+      struct group_statistics *gs;
       struct variable *v = cmd.v_variables[i];
       union value *val = &c->data[v->fv];
 
-      ttp= &cmd.v_variables[i]->p.t_t;
+      gs= &cmd.v_variables[i]->p.t_t.ugs;
       
       if (val->f != SYSMIS) 
-       ttp->sum_diff += weight * (val->f - cmd.n_testval);
+       gs->sum_diff += weight * (val->f - cmd.n_testval);
     }
 
   return 0;
@@ -1446,10 +1458,10 @@ one_sample_precalc (void *aux UNUSED)
   
   for(i=0; i< cmd.n_variables ; ++i) 
     {
-      struct t_test_proc *ttp;
-      ttp= &cmd.v_variables[i]->p.t_t;
+      struct group_statistics *gs;
+      gs= &cmd.v_variables[i]->p.t_t.ugs;
       
-      ttp->sum_diff=0;
+      gs->sum_diff=0;
     }
 }
 
@@ -1461,11 +1473,11 @@ one_sample_postcalc (void *aux UNUSED)
   
   for(i=0; i< cmd.n_variables ; ++i) 
     {
-      struct t_test_proc *ttp;
-      ttp= &cmd.v_variables[i]->p.t_t;
+      struct group_statistics *gs;
+      gs= &cmd.v_variables[i]->p.t_t.ugs;
 
       
-      ttp->mean_diff = ttp->sum_diff / ttp->n ;
+      gs->mean_diff = gs->sum_diff / gs->n ;
     }
 }
 
@@ -1489,6 +1501,7 @@ hash_var_name (const void *a_, void *v_ UNUSED)
 }
 
 
+
 static void 
 paired_precalc (void *aux UNUSED)
 {
@@ -1503,6 +1516,7 @@ paired_precalc (void *aux UNUSED)
 
 }
 
+
 static int  
 paired_calc (struct ccase *c, void *aux UNUSED)
 {
@@ -1516,16 +1530,15 @@ paired_calc (struct ccase *c, void *aux UNUSED)
       union value *val0 = &c->data[v0->fv];
       union value *val1 = &c->data[v1->fv];
 
-      pairs[i].correlation += ( val0->f - pairs[i].v[0]->p.t_t.mean )
+      pairs[i].correlation += ( val0->f - pairs[i].v[0]->p.t_t.ugs.mean )
                              *
-                             ( val1->f - pairs[i].v[1]->p.t_t.mean );
+                             ( val1->f - pairs[i].v[1]->p.t_t.ugs.mean );
 
       pairs[i].sum_of_diffs += val0->f - val1->f ;
       pairs[i].ssq_diffs += sqr(val0->f - val1->f);
 
     }
 
-
   return 0;
 }
 
@@ -1536,11 +1549,11 @@ paired_postcalc (void *aux UNUSED)
 
   for(i=0; i < n_pairs ; ++i )
     {
-      const double n = pairs[i].v[0]->p.t_t.n ;
+      const double n = pairs[i].v[0]->p.t_t.ugs.n ;
       
-      pairs[i].correlation /= pairs[i].v[0]->p.t_t.std_dev * 
-                              pairs[i].v[1]->p.t_t.std_dev ;
-      pairs[i].correlation /= pairs[i].v[0]->p.t_t.n -1; 
+      pairs[i].correlation /= pairs[i].v[0]->p.t_t.ugs.std_dev * 
+                              pairs[i].v[1]->p.t_t.ugs.std_dev ;
+      pairs[i].correlation /= pairs[i].v[0]->p.t_t.ugs.n -1; 
 
 
       pairs[i].mean_diff = pairs[i].sum_of_diffs / n ;
@@ -1551,28 +1564,15 @@ paired_postcalc (void *aux UNUSED)
                                    - 
                                    sqr(pairs[i].mean_diff )
                                    ) );
-
     }
 }
 
-
-/* Compare two (union value)s */
-int
-value_compare(const union value *a, const union value *b, int width)
-{
-  if (width == 0)
-    return (a->f < b->f) ? -1 : ( a->f > b->f ) ;
-  else
-    return memcmp (a->s, b->s, width);
-}
-
-
 static int
 get_group(const union value *val, struct variable *var)
 {
-  if ( 0 == value_compare(val,&groups_values[0],var->width) )
+  if ( 0 == compare_values(val,&groups_values[0],var->width) )
     return 0;
-  else if (0 == value_compare(val,&groups_values[1],var->width) )
+  else if (0 == compare_values(val,&groups_values[1],var->width) )
     return 1;
 
   /* Never reached */
@@ -1587,15 +1587,20 @@ group_precalc (void *aux UNUSED)
   int i;
   int j;
 
-  groups_stats = xmalloc(sizeof(group_stats_t) * cmd.n_variables);
-
   for(i=0; i< cmd.n_variables ; ++i) 
     {
+      struct t_test_proc *ttpr = &cmd.v_variables[i]->p.t_t;
+
+      /* There's always 2 groups for a T - TEST */
+      ttpr->n_groups = 2;
+      ttpr->gs = xmalloc(sizeof(struct group_statistics) * 2) ;
+
       for (j=0 ; j < 2 ; ++j)
        {
-         groups_stats[i][j].sum=0;
-         groups_stats[i][j].n=0;
-         groups_stats[i][j].ssq=0;
+         ttpr->gs[j].sum=0;
+         ttpr->gs[j].n=0;
+         ttpr->gs[j].ssq=0;
+         ttpr->gs[j].id = groups_values[j];
        }
     }
 
@@ -1614,17 +1619,20 @@ group_calc (struct ccase *c, void *aux UNUSED)
   for(i=0; i< cmd.n_variables ; ++i) 
     {
       int g = get_group(gv,groups);
-      struct t_test_proc *ttp=&groups_stats[i][g];
+
+      struct group_statistics *gs = &cmd.v_variables[i]->p.t_t.gs[g];
+
       union value *val=&c->data[cmd.v_variables[i]->fv];
 
-      ttp->n+=weight;
-      ttp->sum+=weight * val->f;
-      ttp->ssq+=weight * sqr(val->f);
+      gs->n+=weight;
+      gs->sum+=weight * val->f;
+      gs->ssq+=weight * sqr(val->f);
     }
 
   return 0;
 }
 
+
 static void 
 group_postcalc (void *aux UNUSED)
 {
@@ -1635,22 +1643,22 @@ group_postcalc (void *aux UNUSED)
     {
       for (j=0 ; j < 2 ; ++j)
        {
-         struct t_test_proc *ttp;
-         ttp=&groups_stats[i][j];
+         struct group_statistics *gs;
+         gs=&cmd.v_variables[i]->p.t_t.gs[j];
 
-         ttp->mean = ttp->sum / ttp->n;
+         gs->mean = gs->sum / gs->n;
          
-         ttp->s_std_dev= sqrt(
-                        ( (ttp->ssq / ttp->n ) - ttp->mean * ttp->mean )
+         gs->s_std_dev= sqrt(
+                        ( (gs->ssq / gs->n ) - gs->mean * gs->mean )
                         ) ;
 
-         ttp->std_dev= sqrt(
-                        ttp->n/(ttp->n-1) *
-                        ( (ttp->ssq / ttp->n ) - ttp->mean * ttp->mean )
+         gs->std_dev= sqrt(
+                        gs->n/(gs->n-1) *
+                        ( (gs->ssq / gs->n ) - gs->mean * gs->mean )
                         ) ;
          
-         ttp->se_mean = ttp->std_dev / sqrt(ttp->n);
+         gs->se_mean = gs->std_dev / sqrt(gs->n);
        }
-      
     }
 }
+
diff --git a/src/val.h b/src/val.h
new file mode 100644 (file)
index 0000000..3b42a83
--- /dev/null
+++ b/src/val.h
@@ -0,0 +1,72 @@
+/* PSPP - computes sample statistics.
+   Copyright (C) 1997-9, 2000 Free Software Foundation, Inc.
+   Written by Ben Pfaff <blp@gnu.org>.
+
+   This program is free software; you can redistribute it and/or
+   modify it under the terms of the GNU General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+   02111-1307, USA. */
+
+#if !val_h
+#define val_h 1
+
+
+/* Values. */
+
+/* Max length of a short string value, generally 8 chars. */
+#define MAX_SHORT_STRING ((SIZEOF_DOUBLE)>=8 ? ((SIZEOF_DOUBLE)+1)/2*2 : 8)
+#define MIN_LONG_STRING (MAX_SHORT_STRING+1)
+
+/* Max string length. */
+#define MAX_STRING 255
+
+/* FYI: It is a bad situation if sizeof(flt64) < MAX_SHORT_STRING:
+   then short string missing values can be truncated in system files
+   because there's only room for as many characters as can fit in a
+   flt64. */
+#if MAX_SHORT_STRING > 8
+#error MAX_SHORT_STRING must be less than 8.
+#endif
+
+/* Special values. */
+#define SYSMIS (-DBL_MAX)
+#define LOWEST second_lowest_value
+#define HIGHEST DBL_MAX
+
+/* Describes one value, which is either a floating-point number or a
+   short string. */
+union value
+  {
+    /* A numeric value. */
+    double f;
+
+    /* A short-string value. */
+    unsigned char s[MAX_SHORT_STRING];
+
+    /* Used by evaluate_expression() to return a string result.
+       As currently implemented, it's a pointer to a dynamic
+       buffer in the appropriate expression.
+
+       Also used by the AGGREGATE procedure in handling string
+       values. */
+    unsigned char *c;
+  };
+
+/* Maximum number of `union value's in a single number or string
+   value. */
+#define MAX_ELEMS_PER_VALUE (MAX_STRING / sizeof (union value) + 1)
+
+int compare_values (const union value *a, const union value *b, int width);
+
+
+#endif /* !val_h */
index fc9827d93b94785661a27a2c08a57884ac2e873e..277bfde8ad3ccd1f3afda2aa01c2077633f85fe6 100644 (file)
--- a/src/var.h
+++ b/src/var.h
 #include <stddef.h>
 #include "format.h"
 #include "t-test.h"
+#include "val.h"
 
-/* Values. */
-
-/* Max length of a short string value, generally 8 chars. */
-#define MAX_SHORT_STRING ((SIZEOF_DOUBLE)>=8 ? ((SIZEOF_DOUBLE)+1)/2*2 : 8)
-#define MIN_LONG_STRING (MAX_SHORT_STRING+1)
-
-/* Max string length. */
-#define MAX_STRING 255
-
-/* FYI: It is a bad situation if sizeof(flt64) < MAX_SHORT_STRING:
-   then short string missing values can be truncated in system files
-   because there's only room for as many characters as can fit in a
-   flt64. */
-#if MAX_SHORT_STRING > 8
-#error MAX_SHORT_STRING must be less than 8.
-#endif
-
-/* Special values. */
-#define SYSMIS (-DBL_MAX)
-#define LOWEST second_lowest_value
-#define HIGHEST DBL_MAX
-
-/* Describes one value, which is either a floating-point number or a
-   short string. */
-union value
-  {
-    /* A numeric value. */
-    double f;
-
-    /* A short-string value. */
-    unsigned char s[MAX_SHORT_STRING];
-
-    /* Used by evaluate_expression() to return a string result.
-       As currently implemented, it's a pointer to a dynamic
-       buffer in the appropriate expression.
-
-       Also used by the AGGREGATE procedure in handling string
-       values. */
-    unsigned char *c;
-  };
-
-/* Maximum number of `union value's in a single number or string
-   value. */
-#define MAX_ELEMS_PER_VALUE (MAX_STRING / sizeof (union value) + 1)
-
-int compare_values (union value *a, union value *b, int width);
-\f
 /* Frequency tables. */
 
 /* Frequency table entry. */
index f90dc1c929812e3a9fffd5466f10e514c3fbda32..7efc5390a6d3c4ada3b8a426139c60576060a4cc 100644 (file)
@@ -38,7 +38,7 @@
 /* Compares A and B, which both have the given WIDTH, and returns
    a strcmp()-type result. */
 int
-compare_values (union value *a, union value *b, int width) 
+compare_values (const union value *a, const union value *b, int width) 
 {
   if (width == 0) 
     return a->f < b->f ? -1 : a->f > b->f;
index 9c5d9108dfdb18492256acf6f979f1d73cdf4278..a8dfdd6c2eed8ea0fa02213f34a4be0b807accb2 100755 (executable)
@@ -93,18 +93,18 @@ diff -B -b $TEMPDIR/pspp.list - <<EOF
 #==========#=#====#==============#========#
 
 2.2 T-TEST.  Independent Samples Test
-#===============================#======#===============================================================================#
-#                               #Levene|                          t-test for Equality of Means                         #
-#                               #-+----+------+-----+---------------+---------------+---------------------+------------#
-#                               # |    |      |     |               |               |                     |    95%     #
-#                               # |    |      |     |               |               |                     +------+-----#
-#                               #F|Sig.|   t  |  df |Sig. (2-tailed)|Mean Difference|Std. Error Difference| Lower|Upper#
-#===============================#=#====#======#=====#===============#===============#=====================#======#=====#
-#DEP1Equal variances assumed    # |    |-4.472|    8|           .002|         -2.000|                 .447|-3.031|-.969#
-#    Equal variances not assumed# |    |-4.472|8.000|           .002|         -2.000|                 .447|-3.031|-.969#
-#DEP2Equal variances assumed    # |    | 4.472|    8|           .002|          2.000|                 .447|  .969|3.031#
-#    Equal variances not assumed# |    | 4.472|8.000|           .002|          2.000|                 .447|  .969|3.031#
-#===============================#=#====#======#=====#===============#===============#=====================#======#=====#
+#===============================#==========#===============================================================================#
+#                               # Levene's |                          t-test for Equality of Means                         #
+#                               #----+-----+------+-----+---------------+---------------+---------------------+------------#
+#                               #    |     |      |     |               |               |                     |    95%     #
+#                               #    |     |      |     |               |               |                     +------+-----#
+#                               # F  | Sig.|   t  |  df |Sig. (2-tailed)|Mean Difference|Std. Error Difference| Lower|Upper#
+#===============================#====#=====#======#=====#===============#===============#=====================#======#=====#
+#DEP1Equal variances assumed    #.000|1.000|-4.472|    8|           .002|         -2.000|                 .447|-3.031|-.969#
+#    Equal variances not assumed#    |     |-4.472|8.000|           .002|         -2.000|                 .447|-3.031|-.969#
+#DEP2Equal variances assumed    #.000|1.000| 4.472|    8|           .002|          2.000|                 .447|  .969|3.031#
+#    Equal variances not assumed#    |     | 4.472|8.000|           .002|          2.000|                 .447|  .969|3.031#
+#===============================#====#=====#======#=====#===============#===============#=====================#======#=====#
 EOF
 if [ $? -ne 0 ] ; then fail ; fi