Merge commit 'origin/covariance'
authorJohn Darrington <john@darrington.wattle.id.au>
Fri, 21 May 2010 10:22:51 +0000 (12:22 +0200)
committerJohn Darrington <john@darrington.wattle.id.au>
Fri, 21 May 2010 10:22:51 +0000 (12:22 +0200)
Conflicts:

src/data/dictionary.c
src/language/stats/correlations.c
src/language/stats/regression.q
src/math/automake.mk

26 files changed:
po/ca.po
po/en_GB.po
po/es.po
po/nl.po
po/pt_BR.po
src/data/automake.mk
src/data/category.c [deleted file]
src/data/category.h [deleted file]
src/data/dictionary.c
src/data/variable.c
src/data/variable.h
src/language/stats/correlations.c
src/language/stats/factor.c
src/language/stats/glm.q
src/language/stats/regression.q
src/math/automake.mk
src/math/categoricals.c [new file with mode: 0644]
src/math/categoricals.h [new file with mode: 0644]
src/math/covariance-matrix.c [deleted file]
src/math/covariance-matrix.h [deleted file]
src/math/covariance.c
src/math/covariance.h
src/math/design-matrix.c [deleted file]
src/math/design-matrix.h [deleted file]
src/math/linreg.c
src/math/linreg.h

index f0752809c87ee272df3bbc36587f1eb05dc2afb4..a0e3deb24abedc988ca01e63942ba0f4901108b3 100644 (file)
--- a/po/ca.po
+++ b/po/ca.po
@@ -10,7 +10,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pspp-0.7.2-pre1\n"
 "Report-Msgid-Bugs-To: pspp-dev@gnu.org\n"
-"POT-Creation-Date: 2010-05-09 21:32+0200\n"
+"POT-Creation-Date: 2010-05-21 12:02+0200\n"
 "PO-Revision-Date: 2010-01-24 16:28+0100\n"
 "Last-Translator: Francesc Josep Miguel Quesada <Miguel.Quesada@uab.cat>\n"
 "Language-Team: Catalan <ca@dodds.net>\n"
@@ -250,7 +250,7 @@ msgstr "sistema"
 msgid "scratch"
 msgstr "zero"
 
-#: src/data/dictionary.c:981
+#: src/data/dictionary.c:980
 msgid ""
 "At least one case in the data file had a weight value that was user-missing, "
 "system-missing, zero, or negative.  These case(s) were ignored."
@@ -258,7 +258,7 @@ msgstr ""
 "Almenys un cas a l'arxiu de dades tenia un valor de ponderació que és perdut "
 "d'usuari, de sistema, zero o negatiu. Aquest(s) cas(os) van ser ignorat(s)."
 
-#: src/data/dictionary.c:1284
+#: src/data/dictionary.c:1283
 #, c-format
 msgid "Truncating document line to %d bytes."
 msgstr "Línia de document tallada a  %d bytes."
@@ -350,20 +350,20 @@ msgstr[1] ""
 msgid "%s variables are not compatible with %s format %s."
 msgstr "Les variables %s no són compatibles amb %s format %s."
 
-#: src/data/format.c:327 src/data/sys-file-reader.c:744
+#: src/data/format.c:327 src/data/sys-file-reader.c:752
 #: src/ui/gui/psppire-var-store.c:628 src/ui/gui/psppire.ui:1960
 #: src/ui/gui/var-sheet-dialogs.ui:139
 msgid "String"
 msgstr "Cadena"
 
-#: src/data/format.c:327 src/data/sys-file-reader.c:744
+#: src/data/format.c:327 src/data/sys-file-reader.c:752
 #: src/ui/gui/psppire-var-store.c:621 src/ui/gui/psppire.ui:2040
 #: src/ui/gui/var-sheet-dialogs.ui:27
 msgid "Numeric"
 msgstr "Numèric"
 
-#: src/data/format.c:328 src/data/sys-file-reader.c:1464
-#: src/data/sys-file-reader.c:1466 src/language/xforms/recode.c:493
+#: src/data/format.c:328 src/data/sys-file-reader.c:1472
+#: src/data/sys-file-reader.c:1474 src/language/xforms/recode.c:493
 #: src/language/xforms/recode.c:494 src/language/xforms/recode.c:506
 #: src/language/xforms/recode.c:507
 #: src/language/dictionary/apply-dictionary.c:78
@@ -371,8 +371,8 @@ msgstr "Numèric"
 msgid "numeric"
 msgstr "numèric"
 
-#: src/data/format.c:328 src/data/sys-file-reader.c:1464
-#: src/data/sys-file-reader.c:1466 src/language/xforms/recode.c:493
+#: src/data/format.c:328 src/data/sys-file-reader.c:1472
+#: src/data/sys-file-reader.c:1474 src/language/xforms/recode.c:493
 #: src/language/xforms/recode.c:494 src/language/xforms/recode.c:506
 #: src/language/xforms/recode.c:507
 #: src/language/dictionary/apply-dictionary.c:78
@@ -578,7 +578,7 @@ msgstr "Amplada de la variable invàlida %d."
 msgid "Invalid variable name `%s' in position %d."
 msgstr "Nom de la variable invàlid `%s' en la posició %d."
 
-#: src/data/por-file-reader.c:685 src/data/sys-file-reader.c:602
+#: src/data/por-file-reader.c:685 src/data/sys-file-reader.c:606
 #, c-format
 msgid "Bad width %d for variable %s."
 msgstr "Amplada %d incorrecte per a la variable %s."
@@ -699,7 +699,7 @@ msgstr ""
 msgid "Variable suffix too large."
 msgstr "Sufix de la variable massa gran."
 
-#: src/data/sys-file-reader.c:222
+#: src/data/sys-file-reader.c:226
 #, c-format
 msgid "Recoded variable name duplicates an existing `%s' within system file."
 msgstr ""
@@ -708,42 +708,42 @@ msgstr ""
 
 #. TRANSLATORS: this fragment will be interpolated into
 #. messages in fh_lock() that identify types of files.
-#: src/data/sys-file-reader.c:286 src/data/sys-file-writer.c:207
+#: src/data/sys-file-reader.c:290 src/data/sys-file-writer.c:207
 msgid "system file"
 msgstr "arxiu de sistema"
 
-#: src/data/sys-file-reader.c:293
+#: src/data/sys-file-reader.c:297
 #, c-format
 msgid "Error opening \"%s\" for reading as a system file: %s."
 msgstr "Error al obrir \"%s\" per a la lectura com arxiu de sistema: %s."
 
-#: src/data/sys-file-reader.c:332 tests/dissect-sysfile.c:154
+#: src/data/sys-file-reader.c:336 tests/dissect-sysfile.c:154
 msgid "Misplaced type 4 record."
 msgstr "Registre de tipus 4 fora de lloc."
 
-#: src/data/sys-file-reader.c:343 tests/dissect-sysfile.c:165
+#: src/data/sys-file-reader.c:347 tests/dissect-sysfile.c:165
 #, c-format
 msgid "Unrecognized record type %d."
 msgstr "Tipus de registre %d no reconegut."
 
-#: src/data/sys-file-reader.c:384
+#: src/data/sys-file-reader.c:388
 #, c-format
 msgid "File header claims %d variable positions but %d were read from file."
 msgstr ""
 "Capçalera de l'arxiu requereix %d posicions de variable, però s'han llegit %"
 "d des de l'arxiu."
 
-#: src/data/sys-file-reader.c:424
+#: src/data/sys-file-reader.c:428
 #, c-format
 msgid "Error closing system file \"%s\": %s."
 msgstr "Error al tancar l'arxiu de sistema \"%s\": %s."
 
-#: src/data/sys-file-reader.c:489 src/data/sys-file-reader.c:499
+#: src/data/sys-file-reader.c:493 src/data/sys-file-reader.c:503
 #: tests/dissect-sysfile.c:202 tests/dissect-sysfile.c:212
 msgid "This is not an SPSS system file."
 msgstr "Això no és un arxiu de sistema de SPSS."
 
-#: src/data/sys-file-reader.c:521 tests/dissect-sysfile.c:227
+#: src/data/sys-file-reader.c:525 tests/dissect-sysfile.c:227
 msgid ""
 "Compression bias is not the usual value of 100, or system file uses "
 "unrecognized floating-point format."
@@ -751,78 +751,73 @@ msgstr ""
 "El biaix de compressió no és el valor habitual de 100, o l'arxiu de sistema "
 "utilitza un format de punt flotant no reconegut."
 
-#: src/data/sys-file-reader.c:598
+#: src/data/sys-file-reader.c:602
 #, c-format
 msgid "Invalid variable name `%s'."
 msgstr "Nom de variable '%s' no vàlid."
 
-#: src/data/sys-file-reader.c:606
+#: src/data/sys-file-reader.c:610
 #, c-format
 msgid "Duplicate variable name `%s' within system file."
 msgstr "Nom de variable '%s' duplicat dins de l'arxiu de sistema."
 
-#: src/data/sys-file-reader.c:614 tests/dissect-sysfile.c:356
+#: src/data/sys-file-reader.c:618 tests/dissect-sysfile.c:356
 msgid "Variable label indicator field is not 0 or 1."
 msgstr "Camp indicador d'etiqueta de variable no és 0 o 1."
 
-#: src/data/sys-file-reader.c:622 tests/dissect-sysfile.c:365
-#, c-format
-msgid "Variable %s has label of invalid length %zu."
-msgstr "Variable %s té una etiqueta de longitud no vàlida %zu."
-
-#: src/data/sys-file-reader.c:641 tests/dissect-sysfile.c:383
+#: src/data/sys-file-reader.c:649 tests/dissect-sysfile.c:387
 msgid "Numeric missing value indicator field is not -3, -2, 0, 1, 2, or 3."
 msgstr ""
 "Camp d'indicador de valors perduts numèrics  no és -3, -2, 0, 1, 2 o 3."
 
-#: src/data/sys-file-reader.c:659 tests/dissect-sysfile.c:398
+#: src/data/sys-file-reader.c:667 tests/dissect-sysfile.c:402
 msgid "String missing value indicator field is not 0, 1, 2, or 3."
 msgstr "Camp d'indicador de valors perduts de cadena no és 0, 1, 2 o 3."
 
-#: src/data/sys-file-reader.c:691
+#: src/data/sys-file-reader.c:699
 msgid "Missing string continuation record."
 msgstr "Manca de registre de continuació de cadena."
 
-#: src/data/sys-file-reader.c:725
+#: src/data/sys-file-reader.c:733
 #, c-format
 msgid "Unknown variable format %<PRIu8>."
 msgstr "Format de variable %<PRIu8> desconegut."
 
-#: src/data/sys-file-reader.c:743
+#: src/data/sys-file-reader.c:751
 #, c-format
 msgid "%s variable %s has invalid %s format %s."
 msgstr "%s variable %s amb un format %s no vàlid %s."
 
-#: src/data/sys-file-reader.c:746
+#: src/data/sys-file-reader.c:754
 msgid "print"
 msgstr "imprimir"
 
-#: src/data/sys-file-reader.c:746
+#: src/data/sys-file-reader.c:754
 msgid "write"
 msgstr "escriure"
 
-#: src/data/sys-file-reader.c:750
+#: src/data/sys-file-reader.c:758
 msgid "Suppressing further invalid format warnings."
 msgstr "Es desactiven les alertes posteriors de format no vàlid."
 
-#: src/data/sys-file-reader.c:768
+#: src/data/sys-file-reader.c:776
 msgid "Weighting variable must be numeric."
 msgstr "Variable de ponderació ha de ser numèrica."
 
-#: src/data/sys-file-reader.c:782
+#: src/data/sys-file-reader.c:790
 msgid "Multiple type 6 (document) records."
 msgstr "Múltiples registres de tipus 6 (document)."
 
-#: src/data/sys-file-reader.c:786
+#: src/data/sys-file-reader.c:794
 #, c-format
 msgid "Number of document lines (%d) must be greater than 0."
 msgstr "Nombre de línies de document (%d) ha de ser major que 0."
 
-#: src/data/sys-file-reader.c:794
+#: src/data/sys-file-reader.c:802
 msgid "Document line contains null byte."
 msgstr "Una línia del document conté un byte nul."
 
-#: src/data/sys-file-reader.c:885
+#: src/data/sys-file-reader.c:893
 #, c-format
 msgid ""
 "Unrecognized record type 7, subtype %d.  Please send a copy of this file, "
@@ -831,14 +826,14 @@ msgstr ""
 "Registre de tipus 7, subtipus %d , no reconegut. Si us plau envieu una còpia "
 "d'aquest arxiu, així com de la sintaxi que el va crear a %s"
 
-#: src/data/sys-file-reader.c:912 tests/dissect-sysfile.c:590
+#: src/data/sys-file-reader.c:920 tests/dissect-sysfile.c:594
 #, c-format
 msgid "Bad size (%zu) or count (%zu) field on record type 7, subtype 3."
 msgstr ""
 "Camp de longitud (%zu) o quantitat (%zu) invàlids en el registre tipus 7, "
 "subtipus 3."
 
-#: src/data/sys-file-reader.c:932
+#: src/data/sys-file-reader.c:940
 #, c-format
 msgid ""
 "Floating-point representation indicated by system file (%d) differs from "
@@ -847,90 +842,90 @@ msgstr ""
 "Representació del punt flotant indicat per l'arxiu de sistema (%d) difereix "
 "de l'esperat (%d)."
 
-#: src/data/sys-file-reader.c:945 src/language/dictionary/sys-file-info.c:110
+#: src/data/sys-file-reader.c:953 src/language/dictionary/sys-file-info.c:110
 #, fuzzy
 msgid "Little Endian"
 msgstr "Little Endian."
 
-#: src/data/sys-file-reader.c:945 src/language/dictionary/sys-file-info.c:109
+#: src/data/sys-file-reader.c:953 src/language/dictionary/sys-file-info.c:109
 #, fuzzy
 msgid "Big Endian"
 msgstr "Big Endian."
 
-#: src/data/sys-file-reader.c:946
+#: src/data/sys-file-reader.c:954
 #, c-format
 msgid ""
 "Integer format indicated by system file (%s) differs from expected (%s)."
 msgstr ""
 "Format enter indicat per l'arxiu de sistema  (%s) difereix de l'esperat (%s)."
 
-#: src/data/sys-file-reader.c:1003 tests/dissect-sysfile.c:621
+#: src/data/sys-file-reader.c:1011 tests/dissect-sysfile.c:625
 #, c-format
 msgid "Bad size (%zu) or count (%zu) on extension 4."
 msgstr "Longitud (%zu) o quantitat (%zu) de l'extensió 4 no vàlid."
 
-#: src/data/sys-file-reader.c:1007 src/data/sys-file-reader.c:1011
-#: src/data/sys-file-reader.c:1015 tests/dissect-sysfile.c:626
-#: tests/dissect-sysfile.c:631 tests/dissect-sysfile.c:636
+#: src/data/sys-file-reader.c:1015 src/data/sys-file-reader.c:1019
+#: src/data/sys-file-reader.c:1023 tests/dissect-sysfile.c:630
+#: tests/dissect-sysfile.c:635 tests/dissect-sysfile.c:640
 #, c-format
 msgid "File specifies unexpected value %g as %s."
 msgstr "L'arxiu especifica un valor inesperat %g com a %s."
 
-#: src/data/sys-file-reader.c:1048
+#: src/data/sys-file-reader.c:1056
 #, c-format
 msgid "Missing space following 'C' at offset %zu in MRSETS record"
 msgstr ""
 
-#: src/data/sys-file-reader.c:1066 tests/dissect-sysfile.c:687
+#: src/data/sys-file-reader.c:1074 tests/dissect-sysfile.c:691
 #, c-format
 msgid "Missing space following 'E' at offset %zu in MRSETS record"
 msgstr ""
 
-#: src/data/sys-file-reader.c:1075 tests/dissect-sysfile.c:696
+#: src/data/sys-file-reader.c:1083 tests/dissect-sysfile.c:700
 #, c-format
 msgid ""
 "Unexpected label source value \"%s\" following 'E' at offset %zu in MRSETS "
 "record"
 msgstr ""
 
-#: src/data/sys-file-reader.c:1081
+#: src/data/sys-file-reader.c:1089
 #, c-format
 msgid "Missing 'C', 'D', or 'E' at offset %zu in MRSETS record."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1110
+#: src/data/sys-file-reader.c:1118
 #, c-format
 msgid "Missing new-line parsing variable names at offset %zu in MRSETS record."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1121
+#: src/data/sys-file-reader.c:1129
 #, fuzzy, c-format
 msgid "Duplicate variable name %s at offset %zu in MRSETS record."
 msgstr "Nom de la variable %s duplicat en la posició %d."
 
-#: src/data/sys-file-reader.c:1134
+#: src/data/sys-file-reader.c:1142
 #, fuzzy, c-format
 msgid "MRSET %s contains both string and numeric variables."
 msgstr ""
 "Ignorant el registre del valor de cadena llarga per a la variable numèrica %"
 "s."
 
-#: src/data/sys-file-reader.c:1149
+#: src/data/sys-file-reader.c:1157
 #, c-format
 msgid "MRSET %s has only %zu variables."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1186 tests/dissect-sysfile.c:754
+#: src/data/sys-file-reader.c:1194 tests/dissect-sysfile.c:758
 #, c-format
 msgid "Bad size %zu on extension 11."
 msgstr "Longitud no vàlid %zu en l'extensió 11."
 
-#: src/data/sys-file-reader.c:1198 tests/dissect-sysfile.c:766
+#: src/data/sys-file-reader.c:1206 tests/dissect-sysfile.c:770
 #, c-format
 msgid "Extension 11 has bad count %zu (for %zu variables)."
 msgstr "Extensió 11 té un recompte invàlid %zu (per a %zu variables)."
 
-#: src/data/sys-file-reader.c:1219
+#: src/data/sys-file-reader.c:1227
 #, c-format
 msgid ""
 "Invalid variable display parameters for variable %zu (%s).  Default "
@@ -939,26 +934,26 @@ msgstr ""
 "Paràmetres de visualització de variable no vàlids per a la variable %zu (%"
 "s). Substitució pels paràmetres per defecte."
 
-#: src/data/sys-file-reader.c:1263
+#: src/data/sys-file-reader.c:1271
 #, c-format
 msgid "Long variable mapping from %s to invalid variable name `%s'."
 msgstr ""
 "Identificació de variable llarga des de %s cap a un nom de variable invàlid  "
 "'%s'."
 
-#: src/data/sys-file-reader.c:1273
+#: src/data/sys-file-reader.c:1281
 #, c-format
 msgid "Duplicate long variable name `%s' within system file."
 msgstr "Nom de la variable llarga '%s' duplicat dins de l'arxiu de sistema."
 
-#: src/data/sys-file-reader.c:1326
+#: src/data/sys-file-reader.c:1334
 #, c-format
 msgid "%s listed as string of invalid length %s in very length string record."
 msgstr ""
 "%s figura com a cadena de longitud no vàlida %s en un registre de cadena "
 "molt llarg."
 
-#: src/data/sys-file-reader.c:1336
+#: src/data/sys-file-reader.c:1344
 #, c-format
 msgid ""
 "%s listed in very long string record with width %s, which requires only one "
@@ -967,12 +962,12 @@ msgstr ""
 "%s figura en el registre de cadena molt llarga amb longitud %s, que "
 "requereix només un segment."
 
-#: src/data/sys-file-reader.c:1342
+#: src/data/sys-file-reader.c:1350
 #, c-format
 msgid "Very long string %s overflows dictionary."
 msgstr "Cadena molt llarga %s desborda el diccionari."
 
-#: src/data/sys-file-reader.c:1356
+#: src/data/sys-file-reader.c:1364
 #, c-format
 msgid ""
 "Very long string with width %ld has segment %d of width %d (expected %d)"
@@ -980,12 +975,12 @@ msgstr ""
 "Cadena molt llarga amb una longitud de %ld té un segment %d de longitud %d "
 "(s'espera %d)"
 
-#: src/data/sys-file-reader.c:1402
+#: src/data/sys-file-reader.c:1410
 #, c-format
 msgid "Invalid number of labels: %d.  Ignoring labels."
 msgstr "Nombre d'etiquetes invàlid: %d. Ignorant etiquetes."
 
-#: src/data/sys-file-reader.c:1433 tests/dissect-sysfile.c:464
+#: src/data/sys-file-reader.c:1441 tests/dissect-sysfile.c:468
 msgid ""
 "Variable index record (type 4) does not immediately follow value label "
 "record (type 3) as it should."
@@ -993,7 +988,7 @@ msgstr ""
 "Registre d'índex de variable (tipus 4) no és seguit immediatament pel "
 "registre d'etiquetes de valors (tipus 3) com hauria."
 
-#: src/data/sys-file-reader.c:1440
+#: src/data/sys-file-reader.c:1448
 #, c-format
 msgid ""
 "Number of variables associated with a value label (%d) is not between 1 and "
@@ -1002,7 +997,7 @@ msgstr ""
 "Nombre de variables associades amb una etiqueta de valors (%d) no està entre "
 "1 i el nombre de variables (%zu)."
 
-#: src/data/sys-file-reader.c:1451
+#: src/data/sys-file-reader.c:1459
 #, c-format
 msgid ""
 "Value labels may not be added to long string variables (e.g. %s) using "
@@ -1011,7 +1006,7 @@ msgstr ""
 "No es pot afegir etiquetes dels valors a les variables de cadena llarga (e."
 "g. %s) utilitzant els tipus de registres 3 i 4."
 
-#: src/data/sys-file-reader.c:1460
+#: src/data/sys-file-reader.c:1468
 #, c-format
 msgid ""
 "Variables associated with value label are not all of identical type.  "
@@ -1020,27 +1015,27 @@ msgstr ""
 "Les variables associades amb etiqueta de valors no són totes del mateix "
 "tipus.  La variable %s és %s, però la variable %s és %s."
 
-#: src/data/sys-file-reader.c:1494
+#: src/data/sys-file-reader.c:1502
 #, c-format
 msgid "Duplicate value label for %g on %s."
 msgstr "Etiqueta de valors duplicats per %g en %s."
 
-#: src/data/sys-file-reader.c:1497 src/data/sys-file-reader.c:1678
+#: src/data/sys-file-reader.c:1505 src/data/sys-file-reader.c:1686
 #, c-format
 msgid "Duplicate value label for \"%.*s\" on %s."
 msgstr "Etiqueta de valor duplicat per a \"%.*s\" a %s."
 
-#: src/data/sys-file-reader.c:1535
+#: src/data/sys-file-reader.c:1543
 #, c-format
 msgid "Error parsing attribute value %s[%d]"
 msgstr "Error en analitzar el valor de l'atribut %s[%d]"
 
-#: src/data/sys-file-reader.c:1549
+#: src/data/sys-file-reader.c:1557
 #, c-format
 msgid "Attribute value %s[%d] is not quoted: %s"
 msgstr "El valor de l'atribut %s[%d] no esta entre cometes: %s"
 
-#: src/data/sys-file-reader.c:1612 tests/dissect-sysfile.c:932
+#: src/data/sys-file-reader.c:1620 tests/dissect-sysfile.c:936
 #, c-format
 msgid ""
 "Variable name length in long string value label record (%d) exceeds %d-byte "
@@ -1049,21 +1044,21 @@ msgstr ""
 "La longitud del nom de la variable al registre de l'etiqueta del valor de "
 "cadena llarga (%d) supera el límit %d-byte."
 
-#: src/data/sys-file-reader.c:1622
+#: src/data/sys-file-reader.c:1630
 #, c-format
 msgid "Ignoring long string value record for unknown variable %s."
 msgstr ""
 "Ignorant el registre del valor de cadena llarga per a la variable "
 "desconeguda %s."
 
-#: src/data/sys-file-reader.c:1629
+#: src/data/sys-file-reader.c:1637
 #, c-format
 msgid "Ignoring long string value record for numeric variable %s."
 msgstr ""
 "Ignorant el registre del valor de cadena llarga per a la variable numèrica %"
 "s."
 
-#: src/data/sys-file-reader.c:1636
+#: src/data/sys-file-reader.c:1644
 #, c-format
 msgid ""
 "Ignoring long string value record for variable %s because the record's width "
@@ -1072,7 +1067,7 @@ msgstr ""
 "Ignorant el registre del valor de cadena llarga %s ja que l'amplada del "
 "registre (%d) no coincideix amb l'amplada de la variable (%d)"
 
-#: src/data/sys-file-reader.c:1658
+#: src/data/sys-file-reader.c:1666
 #, c-format
 msgid ""
 "Ignoring long string value %zu for variable %s, with width %d, that has bad "
@@ -1081,75 +1076,75 @@ msgstr ""
 "Ignorant el valor de cadena llarga %zu per a la variable %s, d'amplada %d, "
 "que té una amplada de valor incorrecta %zu."
 
-#: src/data/sys-file-reader.c:1773
+#: src/data/sys-file-reader.c:1781
 msgid "File ends in partial case."
 msgstr "L'arxiu acaba en un cas parcial."
 
-#: src/data/sys-file-reader.c:1781
+#: src/data/sys-file-reader.c:1789
 #, c-format
 msgid "Error reading case from file %s."
 msgstr "Error llegint un cas de l'arxiu %s."
 
-#: src/data/sys-file-reader.c:1882
+#: src/data/sys-file-reader.c:1890
 msgid ""
 "Possible compressed data corruption: compressed spaces appear in numeric "
 "field."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1935
+#: src/data/sys-file-reader.c:1943
 #, c-format
 msgid ""
 "Possible compressed data corruption: string contains compressed integer "
 "(opcode %d)"
 msgstr ""
 
-#: src/data/sys-file-reader.c:2027
+#: src/data/sys-file-reader.c:2035
 #, c-format
 msgid "Variable index %d not in valid range 1...%d."
 msgstr "Índex de la variable %d no en l'interval vàlid de 1...%d."
 
-#: src/data/sys-file-reader.c:2032
+#: src/data/sys-file-reader.c:2040
 #, c-format
 msgid "Variable index %d refers to long string continuation."
 msgstr ""
 "Índex de la variable %d es refereix a una continuació de cadena llarga."
 
-#: src/data/sys-file-reader.c:2100
+#: src/data/sys-file-reader.c:2108
 #, c-format
 msgid "Suppressed %d additional related warnings."
 msgstr "Suprimides %d advertències addicionals."
 
-#: src/data/sys-file-reader.c:2141
+#: src/data/sys-file-reader.c:2153 src/data/sys-file-reader.c:2170
 #, fuzzy, c-format
 msgid "Dictionary record refers to unknown variable %s."
 msgstr "Mapa de la variable es refereix a una variable desconeguda %s."
 
-#: src/data/sys-file-reader.c:2202
+#: src/data/sys-file-reader.c:2231
 #, c-format
 msgid "Expecting digit at offset %zu in MRSETS record."
 msgstr ""
 
-#: src/data/sys-file-reader.c:2209
+#: src/data/sys-file-reader.c:2238
 #, c-format
 msgid "Expecting space at offset %zu in MRSETS record."
 msgstr ""
 
-#: src/data/sys-file-reader.c:2216
+#: src/data/sys-file-reader.c:2245
 #, c-format
 msgid "%zu-byte string starting at offset %zu exceeds record length %zu."
 msgstr ""
 
-#: src/data/sys-file-reader.c:2226
+#: src/data/sys-file-reader.c:2255
 #, c-format
 msgid "Expecting space at offset %zu following %zu-byte string."
 msgstr ""
 
-#: src/data/sys-file-reader.c:2318 tests/dissect-sysfile.c:1337
+#: src/data/sys-file-reader.c:2347 tests/dissect-sysfile.c:1341
 #, c-format
 msgid "System error: %s."
 msgstr "Error de sistema: %s."
 
-#: src/data/sys-file-reader.c:2320 tests/dissect-sysfile.c:1339
+#: src/data/sys-file-reader.c:2349 tests/dissect-sysfile.c:1343
 msgid "Unexpected end of file."
 msgstr "Final d'arxiu inesperat."
 
@@ -1168,7 +1163,7 @@ msgstr "Error en obrir \"%s\" per gravar com arxiu de sistema: %s."
 msgid "An I/O error occurred writing system file \"%s\"."
 msgstr "S'ha produït un error de E/S al desar l'arxiu de sistema \"%s\"."
 
-#: src/data/variable.c:215
+#: src/data/variable.c:206
 #, c-format
 msgid ""
 "Character `%c' (in %s) may not appear as the first character in a variable "
@@ -1177,21 +1172,21 @@ msgstr ""
 "Caràcter '%c' (em %s) no pot aparèixer com el primer caràcter en un nom de "
 "variable."
 
-#: src/data/variable.c:227
+#: src/data/variable.c:218
 #, c-format
 msgid "Character `%c' (in %s) may not appear in a variable name."
 msgstr "Caràcter '%c' (em %s) no pot aparèixer en un nom de variable."
 
-#: src/data/variable.c:253
+#: src/data/variable.c:244
 msgid "Variable name cannot be empty string."
 msgstr "El nom de la variable no pot ser una cadena buida. "
 
-#: src/data/variable.c:259
+#: src/data/variable.c:250
 #, c-format
 msgid "Variable name %s exceeds %d-character limit."
 msgstr "El nom de la variable %s supera el límit de %d caràcters."
 
-#: src/data/variable.c:267
+#: src/data/variable.c:258
 #, c-format
 msgid "`%s' may not be used as a variable name because it is a reserved word."
 msgstr ""
@@ -2163,7 +2158,7 @@ msgid "IBM 390 Hex Long."
 msgstr "IBM 390 Hex Long."
 
 #: src/language/dictionary/sys-file-info.c:120 src/ui/gui/descriptives.ui:85
-#: src/ui/gui/factor.ui:161 src/ui/gui/recode.ui:960
+#: src/ui/gui/factor.ui:173 src/ui/gui/recode.ui:960
 msgid "Variables:"
 msgstr "Variables:"
 
@@ -2554,7 +2549,7 @@ msgstr "Variable de destí %s duplica una variable existent %s."
 msgid "Variable %s is not dichotomous"
 msgstr "La variable %s no és dicotòmica"
 
-#: src/language/stats/binomial.c:192
+#: src/language/stats/binomial.c:192 src/ui/gui/binomial.ui:13
 msgid "Binomial Test"
 msgstr "Prova Binomial"
 
@@ -2567,13 +2562,13 @@ msgid "Group2"
 msgstr "Grup 2"
 
 #: src/language/stats/binomial.c:224 src/language/stats/chisquare.c:177
-#: src/language/stats/chisquare.c:236 src/language/stats/factor.c:1188
+#: src/language/stats/chisquare.c:236 src/language/stats/factor.c:1462
 #: src/language/stats/sign.c:92 src/language/stats/wilcoxon.c:260
 #: src/ui/gui/crosstabs-dialog.c:60 src/language/stats/crosstabs.q:823
 #: src/language/stats/crosstabs.q:1151 src/language/stats/crosstabs.q:1528
 #: src/language/stats/examine.q:1105 src/language/stats/frequencies.q:871
 #: src/language/stats/oneway.q:302 src/language/stats/oneway.q:472
-#: src/language/stats/regression.q:306 src/language/stats/reliability.q:702
+#: src/language/stats/regression.q:291 src/language/stats/reliability.q:702
 msgid "Total"
 msgstr "Total"
 
@@ -2582,8 +2577,8 @@ msgstr "Total"
 msgid "Category"
 msgstr "Categoria"
 
-#: src/language/stats/binomial.c:258 src/language/stats/correlations.c:120
-#: src/language/stats/correlations.c:228 src/language/stats/npar-summary.c:122
+#: src/language/stats/binomial.c:258 src/language/stats/correlations.c:119
+#: src/language/stats/correlations.c:227 src/language/stats/npar-summary.c:122
 #: src/language/stats/sign.c:72 src/language/stats/wilcoxon.c:243
 #: src/language/stats/crosstabs.q:830 src/language/stats/examine.q:1176
 #: src/language/stats/frequencies.q:1034 src/language/stats/oneway.q:385
@@ -2624,7 +2619,7 @@ msgid "Expected N"
 msgstr "N esperat"
 
 #: src/language/stats/chisquare.c:163 src/language/stats/chisquare.c:202
-#: src/ui/gui/crosstabs-dialog.c:62 src/language/stats/regression.q:305
+#: src/ui/gui/crosstabs-dialog.c:62 src/language/stats/regression.q:290
 msgid "Residual"
 msgstr "Residual"
 
@@ -2644,7 +2639,7 @@ msgstr "Chi-quadrat"
 
 #: src/language/stats/chisquare.c:264 src/language/stats/crosstabs.q:1215
 #: src/language/stats/oneway.q:275 src/language/stats/oneway.q:685
-#: src/language/stats/regression.q:299 src/language/stats/t-test.q:752
+#: src/language/stats/regression.q:284 src/language/stats/t-test.q:752
 #: src/language/stats/t-test.q:923 src/language/stats/t-test.q:1010
 msgid "df"
 msgstr "df"
@@ -2653,13 +2648,13 @@ msgstr "df"
 msgid "Asymp. Sig."
 msgstr "Sig. Asimpt."
 
-#: src/language/stats/correlations.c:97 src/language/stats/factor.c:1431
+#: src/language/stats/correlations.c:96 src/language/stats/factor.c:1720
 #: src/language/stats/npar-summary.c:108
 msgid "Descriptive Statistics"
 msgstr "Estadístiques Descriptives"
 
-#: src/language/stats/correlations.c:118 src/language/stats/descriptives.c:101
-#: src/language/stats/factor.c:1452 src/language/stats/npar-summary.c:125
+#: src/language/stats/correlations.c:117 src/language/stats/descriptives.c:101
+#: src/language/stats/factor.c:1741 src/language/stats/npar-summary.c:125
 #: src/ui/gui/descriptives-dialog.c:40 src/ui/gui/frequencies-dialog.c:41
 #: src/language/stats/examine.q:1444 src/language/stats/frequencies.q:105
 #: src/language/stats/oneway.q:386 src/language/stats/t-test.q:506
@@ -2668,7 +2663,7 @@ msgstr "Estadístiques Descriptives"
 msgid "Mean"
 msgstr "Mitjana"
 
-#: src/language/stats/correlations.c:119 src/language/stats/factor.c:1453
+#: src/language/stats/correlations.c:118 src/language/stats/factor.c:1742
 #: src/language/stats/npar-summary.c:128 src/language/stats/examine.q:1479
 #: src/language/stats/oneway.q:387 src/language/stats/t-test.q:507
 #: src/language/stats/t-test.q:527 src/language/stats/t-test.q:626
@@ -2676,37 +2671,37 @@ msgstr "Mitjana"
 msgid "Std. Deviation"
 msgstr "Desviació Est."
 
-#: src/language/stats/correlations.c:191 src/language/stats/factor.c:1331
+#: src/language/stats/correlations.c:190 src/language/stats/factor.c:1620
 #, fuzzy
 msgid "Correlations"
 msgstr "Correlació"
 
-#: src/language/stats/correlations.c:217
+#: src/language/stats/correlations.c:216
 #, fuzzy
 msgid "Pearson Correlation"
 msgstr "Correlació de Spearman"
 
-#: src/language/stats/correlations.c:219 src/language/stats/oneway.q:686
+#: src/language/stats/correlations.c:218 src/language/stats/oneway.q:686
 #: src/language/stats/t-test.q:753 src/language/stats/t-test.q:924
 #: src/language/stats/t-test.q:1011
 msgid "Sig. (2-tailed)"
 msgstr "Sig. (2-cues)"
 
-#: src/language/stats/correlations.c:219
+#: src/language/stats/correlations.c:218
 #, fuzzy
 msgid "Sig. (1-tailed)"
 msgstr "Sig. (2-cues)"
 
-#: src/language/stats/correlations.c:223
+#: src/language/stats/correlations.c:222
 msgid "Cross-products"
 msgstr ""
 
-#: src/language/stats/correlations.c:224
+#: src/language/stats/correlations.c:223
 #, fuzzy
 msgid "Covariance"
 msgstr "Covariància"
 
-#: src/language/stats/correlations.c:446 src/language/stats/descriptives.c:361
+#: src/language/stats/correlations.c:454 src/language/stats/descriptives.c:361
 #: src/language/data-io/list.q:91
 msgid "No variables specified."
 msgstr "Variables no especificades."
@@ -2836,53 +2831,44 @@ msgstr "`)' esperat."
 msgid "Variable %s specified twice in sort criteria."
 msgstr "La variable %s s'especifica dues vegades als criteris d'ordenació."
 
-#: src/language/stats/factor.c:558
+#: src/language/stats/factor.c:803
 msgid "Factor analysis on a single variable is not useful."
 msgstr ""
 
-#: src/language/stats/factor.c:939
+#: src/language/stats/factor.c:1206
 #, fuzzy
 msgid "Component Number"
 msgstr "Columna Numero: 0"
 
-#: src/language/stats/factor.c:939
+#: src/language/stats/factor.c:1206
 #, fuzzy
 msgid "Factor Number"
 msgstr "Número de Cas"
 
-#: src/language/stats/factor.c:970
+#: src/language/stats/factor.c:1237
 #, fuzzy
 msgid "Communalities"
 msgstr "Comentaris:"
 
-#: src/language/stats/factor.c:976
+#: src/language/stats/factor.c:1243
 msgid "Initial"
 msgstr ""
 
-#: src/language/stats/factor.c:979
+#: src/language/stats/factor.c:1246
 msgid "Extraction"
 msgstr ""
 
-#: src/language/stats/factor.c:1029
-msgid "Component Matrix"
-msgstr ""
-
-#: src/language/stats/factor.c:1031
-#, fuzzy
-msgid "Factor Matrix"
-msgstr "Llista de Factors:"
-
-#: src/language/stats/factor.c:1039 src/language/stats/factor.c:1163
+#: src/language/stats/factor.c:1310 src/language/stats/factor.c:1437
 #, fuzzy
 msgid "Component"
 msgstr "Comentaris:"
 
-#: src/language/stats/factor.c:1044 src/language/stats/factor.c:1165
+#: src/language/stats/factor.c:1315 src/language/stats/factor.c:1439
 #, fuzzy
 msgid "Factor"
 msgstr "_Factor:"
 
-#: src/language/stats/factor.c:1076 src/language/stats/factor.c:1219
+#: src/language/stats/factor.c:1347 src/language/stats/factor.c:1495
 #: src/ui/gui/psppire-data-store.c:755 src/ui/gui/psppire-var-store.c:699
 #: src/ui/gui/psppire-var-store.c:709 src/ui/gui/psppire-var-store.c:719
 #: src/ui/gui/psppire-var-store.c:825
@@ -2890,62 +2876,80 @@ msgstr "_Factor:"
 msgid "%d"
 msgstr "%d"
 
-#: src/language/stats/factor.c:1138
+#: src/language/stats/factor.c:1412
 msgid "Total Variance Explained"
 msgstr ""
 
-#: src/language/stats/factor.c:1170
+#: src/language/stats/factor.c:1444
 msgid "Initial Eigenvalues"
 msgstr ""
 
-#: src/language/stats/factor.c:1176
+#: src/language/stats/factor.c:1450
 msgid "Extraction Sums of Squared Loadings"
 msgstr ""
 
-#: src/language/stats/factor.c:1182
+#: src/language/stats/factor.c:1456
 msgid "Rotation Sums of Squared Loadings"
 msgstr ""
 
-#: src/language/stats/factor.c:1190
+#: src/language/stats/factor.c:1464
 #, fuzzy, no-c-format
 msgid "% of Variance"
 msgstr "Variància"
 
-#: src/language/stats/factor.c:1191
+#: src/language/stats/factor.c:1465
 msgid "Cumulative %"
 msgstr ""
 
-#: src/language/stats/factor.c:1289
+#: src/language/stats/factor.c:1578
 #, fuzzy
 msgid "Correlation Matrix"
 msgstr "Correlació"
 
-#: src/language/stats/factor.c:1343
+#: src/language/stats/factor.c:1632
 #, fuzzy
 msgid "Sig. 1-tailed"
 msgstr "Sig. (2-cues)"
 
-#: src/language/stats/factor.c:1377
+#: src/language/stats/factor.c:1666
 #, fuzzy
 msgid "Determinant"
 msgstr "Dependent"
 
-#: src/language/stats/factor.c:1454
+#: src/language/stats/factor.c:1743
 msgid "Analysis N"
 msgstr ""
 
-#: src/language/stats/factor.c:1487
+#: src/language/stats/factor.c:1776
 msgid ""
 "The FACTOR criteria result in zero factors extracted. Therefore no analysis "
 "will be performed."
 msgstr ""
 
-#: src/language/stats/factor.c:1493
+#: src/language/stats/factor.c:1782
 msgid ""
 "The FACTOR criteria result in more factors than variables, which is not "
 "meaningful. No analysis will be performed."
 msgstr ""
 
+#: src/language/stats/factor.c:1865
+msgid "Component Matrix"
+msgstr ""
+
+#: src/language/stats/factor.c:1865
+#, fuzzy
+msgid "Factor Matrix"
+msgstr "Llista de Factors:"
+
+#: src/language/stats/factor.c:1871
+msgid "Rotated Component Matrix"
+msgstr ""
+
+#: src/language/stats/factor.c:1871
+#, fuzzy
+msgid "Rotated Factor Matrix"
+msgstr "Llista de Factors:"
+
 #: src/language/stats/flip.c:98
 msgid ""
 "FLIP ignores TEMPORARY.  Temporary transformations will be made permanent."
@@ -3036,7 +3040,7 @@ msgstr "Àrea"
 
 #: src/language/stats/roc.c:952 src/language/stats/examine.q:1641
 #: src/language/stats/oneway.q:388 src/language/stats/oneway.q:683
-#: src/language/stats/regression.q:201
+#: src/language/stats/regression.q:198
 msgid "Std. Error"
 msgstr "Error Est."
 
@@ -3946,7 +3950,7 @@ msgstr ""
 msgid "ascii: opening output file \"%s\""
 msgstr "ascii: obrint l'arxiu de resultats \"%s\""
 
-#: src/output/ascii.c:913 src/output/cairo.c:826
+#: src/output/ascii.c:913 src/output/cairo.c:784
 #, c-format
 msgid "%s - Page %d"
 msgstr "%s - Pàgina %d"
@@ -4064,12 +4068,12 @@ msgid ""
 msgstr ""
 "bad box: (%d+%d=%d,%d+%d=%d)-(%d+%d=%d,%d+%d=%d) en taula amb mida (%d,%d)\n"
 
-#: src/output/cairo.c:283
+#: src/output/cairo.c:295
 #, fuzzy, c-format
 msgid "error opening output file \"%s\": %s"
 msgstr "ascii: obrint l'arxiu de resultats \"%s\""
 
-#: src/output/cairo.c:301
+#: src/output/cairo.c:312
 #, fuzzy, c-format
 msgid ""
 "The defined page is not wide enough to hold at least %d characters in the "
@@ -4080,7 +4084,7 @@ msgstr ""
 "només hi ha espai per %d línies de cada font en la mida per defecte de %d.%"
 "03d punts."
 
-#: src/output/cairo.c:311
+#: src/output/cairo.c:322
 #, fuzzy, c-format
 msgid ""
 "The defined page is not long enough to hold margins and headers, plus least %"
@@ -4091,17 +4095,17 @@ msgstr ""
 "només hi ha espai per %d línies de cada font en la mida per defecte de %d.%"
 "03d punts."
 
-#: src/output/cairo.c:364
+#: src/output/cairo.c:376
 #, fuzzy, c-format
 msgid "error drawing output for %s driver: %s"
 msgstr "error de sintaxi analitzant opcions pel controlador \"%s\""
 
-#: src/output/cairo.c:906
+#: src/output/cairo.c:864
 #, c-format
 msgid "\"%s\": bad font specification"
 msgstr "\"%s\": especificació de caràcter no vàlida"
 
-#: src/output/cairo.c:1116
+#: src/output/cairo.c:1084
 #, fuzzy, c-format
 msgid "error writing output file \"%s\": %s"
 msgstr "Error en tancar l'arxiu portàtil \"%s\": %s."
@@ -4200,16 +4204,6 @@ msgstr ""
 msgid "%s: output option specified more than once"
 msgstr ""
 
-#: src/ui/gui/about.c:66
-msgid "A program for the analysis of sampled data"
-msgstr "Un programa per a l'anàlisi de dades de mostreig"
-
-#. TRANSLATORS: Use this string to list the people who have helped with
-#. translation to your language.
-#: src/ui/gui/about.c:76
-msgid "translator-credits"
-msgstr "F.J. Miguel, J. Gómez, P. Payà"
-
 #: src/ui/gui/checkbox-treeview.c:92 src/language/stats/crosstabs.q:1213
 #: src/language/stats/crosstabs.q:1240 src/language/stats/crosstabs.q:1263
 #: src/language/stats/crosstabs.q:1287 src/language/stats/examine.q:1638
@@ -4276,7 +4270,7 @@ msgstr "Corr."
 #: src/ui/gui/crosstabs-dialog.c:54 src/ui/gui/crosstabs-dialog.c:65
 #: src/ui/gui/crosstabs-dialog.c:100 src/ui/gui/crosstabs-dialog.c:108
 #: src/ui/gui/psppire-var-store.c:612 src/ui/gui/var-display.c:16
-#: src/ui/gui/variable-info-dialog.c:40
+#: src/ui/gui/variable-info-dialog.c:41
 msgid "None"
 msgstr "Cap"
 
@@ -4312,12 +4306,12 @@ msgstr "Desviació Estàndard"
 msgid "Standard error"
 msgstr "Error Estàndard"
 
-#: src/ui/gui/find-dialog.c:651
+#: src/ui/gui/find-dialog.c:649
 #, c-format
 msgid "Bad regular expression: %s"
 msgstr "Expressió regular incorrecta: %s"
 
-#: src/ui/gui/factor-dialog.c:230
+#: src/ui/gui/factor-dialog.c:344
 #, c-format
 msgid "Eigenvalues over %4.2f times the mean eigenvalue"
 msgstr ""
@@ -4343,17 +4337,35 @@ msgstr "Error estàndard en la curtosi"
 msgid "Median"
 msgstr "Mediana"
 
-#: src/ui/gui/helper.c:196
+#: src/ui/gui/helper.c:197
 msgid "Sorry. The help system hasn't yet been implemented."
 msgstr "Disculpeu. El sistema d'ajuda encara no ha estat implementat."
 
-#: src/ui/gui/helper.c:241
+#: src/ui/gui/help-menu.c:67
+msgid "A program for the analysis of sampled data"
+msgstr "Un programa per a l'anàlisi de dades de mostreig"
+
+#. TRANSLATORS: Use this string to list the people who have helped with
+#. translation to your language.
+#: src/ui/gui/help-menu.c:77
+msgid "translator-credits"
+msgstr "F.J. Miguel, J. Gómez, P. Payà"
+
+#: src/ui/gui/help-menu.c:98
 #, c-format
 msgid ""
 "Cannot open reference manual: %s.  The PSPP user manual is also available at "
 "http://www.gnu.org/software/pspp/documentation.html"
 msgstr ""
 
+#: src/ui/gui/help-menu.c:117
+msgid "_Help"
+msgstr "Ajut"
+
+#: src/ui/gui/help-menu.c:124
+msgid "_Reference Manual"
+msgstr "Manual de _Referencia"
+
 #: src/ui/gui/missing-val-dialog.c:113 src/ui/gui/missing-val-dialog.c:167
 msgid "Incorrect value for variable type"
 msgstr "Valor incorrecte pel tipus de variable"
@@ -4362,7 +4374,7 @@ msgstr "Valor incorrecte pel tipus de variable"
 msgid "Incorrect range specification"
 msgstr "Especificació d'interval incorrecte"
 
-#: src/ui/gui/oneway-anova-dialog.c:314
+#: src/ui/gui/oneway-anova-dialog.c:313
 #, c-format
 msgid "Contrast %d of %d"
 msgstr "Contrast %d de %d"
@@ -4387,58 +4399,58 @@ msgstr "Vista de Variables"
 msgid "var"
 msgstr "var"
 
-#: src/ui/gui/psppire-data-window.c:210
+#: src/ui/gui/psppire-data-window.c:212
 msgid "Transformations Pending"
 msgstr "Transformacions pendents"
 
-#: src/ui/gui/psppire-data-window.c:226
+#: src/ui/gui/psppire-data-window.c:228
 msgid "Filter off"
 msgstr "Filtre desactivat"
 
-#: src/ui/gui/psppire-data-window.c:240
+#: src/ui/gui/psppire-data-window.c:242
 #, c-format
 msgid "Filter by %s"
 msgstr "Filtrat per %s"
 
-#: src/ui/gui/psppire-data-window.c:261
+#: src/ui/gui/psppire-data-window.c:263
 msgid "No Split"
 msgstr "No dividit"
 
-#: src/ui/gui/psppire-data-window.c:270
+#: src/ui/gui/psppire-data-window.c:272
 msgid "Split by "
 msgstr "Dividit per "
 
-#: src/ui/gui/psppire-data-window.c:298
+#: src/ui/gui/psppire-data-window.c:300
 msgid "Weights off"
 msgstr "Sense Ponderar:"
 
-#: src/ui/gui/psppire-data-window.c:312
+#: src/ui/gui/psppire-data-window.c:314
 #, c-format
 msgid "Weight by %s"
 msgstr "Ponderat per %s"
 
-#: src/ui/gui/psppire-data-window.c:380
+#: src/ui/gui/psppire-data-window.c:382
 msgid "Open"
 msgstr "Obert"
 
-#: src/ui/gui/psppire-data-window.c:390
+#: src/ui/gui/psppire-data-window.c:392
 #, fuzzy
 msgid "Data and Syntax Files"
 msgstr "No es pot obrir l'arxiu de sintaxi \"%s\""
 
-#: src/ui/gui/psppire-data-window.c:400 src/ui/gui/psppire-data-window.c:611
+#: src/ui/gui/psppire-data-window.c:402 src/ui/gui/psppire-data-window.c:611
 msgid "System Files (*.sav)"
 msgstr "Arxius de Sistema (*.sav)"
 
-#: src/ui/gui/psppire-data-window.c:406 src/ui/gui/psppire-data-window.c:617
+#: src/ui/gui/psppire-data-window.c:408 src/ui/gui/psppire-data-window.c:617
 msgid "Portable Files (*.por) "
 msgstr "Arxius Portables (*.por)"
 
-#: src/ui/gui/psppire-data-window.c:412 src/ui/gui/psppire-syntax-window.c:292
+#: src/ui/gui/psppire-data-window.c:414 src/ui/gui/psppire-syntax-window.c:292
 msgid "Syntax Files (*.sps) "
 msgstr "Arxius de Sintàxi (*.sps) "
 
-#: src/ui/gui/psppire-data-window.c:418 src/ui/gui/psppire-data-window.c:623
+#: src/ui/gui/psppire-data-window.c:420 src/ui/gui/psppire-data-window.c:623
 #: src/ui/gui/psppire-syntax-window.c:298
 msgid "All Files"
 msgstr "Tots els arxius"
@@ -4451,46 +4463,46 @@ msgstr "Desar"
 msgid "Portable File"
 msgstr "Arxiu Portable"
 
-#: src/ui/gui/psppire-data-window.c:786
+#: src/ui/gui/psppire-data-window.c:773
 msgid "Font Selection"
 msgstr "Selecció de font"
 
-#: src/ui/gui/psppire-data-window.c:1581
+#: src/ui/gui/psppire-data-window.c:1261
 msgid "Data Editor"
 msgstr "Editor de Dades"
 
-#: src/ui/gui/psppire-output-window.c:441
+#: src/ui/gui/psppire-output-window.c:458
 msgid "Export Output"
 msgstr ""
 
-#: src/ui/gui/psppire-output-window.c:449
+#: src/ui/gui/psppire-output-window.c:466
 #, fuzzy
 msgid "PDF Files (*.pdf)"
 msgstr "Arxius Portables (*.por)"
 
-#: src/ui/gui/psppire-output-window.c:450
+#: src/ui/gui/psppire-output-window.c:467
 msgid "HTML Files (*.html)"
 msgstr ""
 
-#: src/ui/gui/psppire-output-window.c:451
+#: src/ui/gui/psppire-output-window.c:468
 msgid "OpenDocument Files (*.odt)"
 msgstr ""
 
-#: src/ui/gui/psppire-output-window.c:452
+#: src/ui/gui/psppire-output-window.c:469
 #, fuzzy
 msgid "Text Files (*.txt)"
 msgstr "Arxius de Sistema (*.sav)"
 
-#: src/ui/gui/psppire-output-window.c:453
+#: src/ui/gui/psppire-output-window.c:470
 #, fuzzy
 msgid "PostScript Files (*.ps)"
 msgstr "Arxius Portables (*.por)"
 
-#: src/ui/gui/psppire-output-window.c:454
+#: src/ui/gui/psppire-output-window.c:471
 msgid "Comma-Separated Value Files (*.csv)"
 msgstr ""
 
-#: src/ui/gui/psppire-output-window.c:593
+#: src/ui/gui/psppire-output-window.c:605
 msgid "Output Viewer"
 msgstr "Vista de resultats"
 
@@ -4503,11 +4515,11 @@ msgstr "Desat com a arxiu \"%s\""
 msgid "Save Syntax"
 msgstr "Desar sintaxi"
 
-#: src/ui/gui/psppire-syntax-window.c:512
+#: src/ui/gui/psppire-syntax-window.c:496
 msgid "Syntax Editor"
 msgstr "Editor de sintaxi"
 
-#: src/ui/gui/psppire-syntax-window.c:526
+#: src/ui/gui/psppire-syntax-window.c:510
 #, c-format
 msgid "Cannot load syntax file '%s'"
 msgstr "No es pot obrir l'arxiu de sintaxi \"%s\""
@@ -4590,27 +4602,27 @@ msgstr ""
 msgid "Close _without saving"
 msgstr "Tancar sense desar"
 
-#: src/ui/gui/recode-dialog.c:915
+#: src/ui/gui/recode-dialog.c:911
 msgid "Recode into Different Variables"
 msgstr "Recodifica en variables Diferents"
 
-#: src/ui/gui/recode-dialog.c:918 src/ui/gui/recode.ui:692
+#: src/ui/gui/recode-dialog.c:914 src/ui/gui/recode.ui:692
 msgid "Recode into Same Variables"
 msgstr "Recodifica en les Mateixes variables"
 
-#: src/ui/gui/recode-dialog.c:933 src/ui/gui/recode-dialog.c:1029
+#: src/ui/gui/recode-dialog.c:929 src/ui/gui/recode-dialog.c:1025
 msgid "New"
 msgstr "Nou"
 
-#: src/ui/gui/recode-dialog.c:948 src/ui/gui/recode-dialog.c:1021
+#: src/ui/gui/recode-dialog.c:944 src/ui/gui/recode-dialog.c:1017
 msgid "Old"
 msgstr "Antic"
 
-#: src/ui/gui/recode-dialog.c:1278
+#: src/ui/gui/recode-dialog.c:1274
 msgid "Recode into Different Variables: Old and New Values "
 msgstr "Recodifica en variables Diferents: Antcs y Nous valors "
 
-#: src/ui/gui/recode-dialog.c:1279
+#: src/ui/gui/recode-dialog.c:1275
 msgid "Recode into Same Variables: Old and New Values"
 msgstr "Recodifica en les mateixes variables: Antics y Nous valors"
 
@@ -4618,7 +4630,7 @@ msgstr "Recodifica en les mateixes variables: Antics y Nous valors"
 msgid "Coeff"
 msgstr "Coef."
 
-#: src/ui/gui/regression-dialog.c:43 src/language/stats/regression.q:158
+#: src/ui/gui/regression-dialog.c:43 src/language/stats/regression.q:155
 msgid "R"
 msgstr "R"
 
@@ -4737,31 +4749,31 @@ msgstr "El contingut del camp \"%.*s\" no pot ser analitzat en format %s."
 msgid "Confidence Interval: %2d %%"
 msgstr "Interval de Confiança: %2d %%"
 
-#: src/ui/gui/variable-info-dialog.c:76
+#: src/ui/gui/variable-info-dialog.c:77
 #, c-format
 msgid "Label: %s\n"
 msgstr "Etiqueta: %s\n"
 
-#: src/ui/gui/variable-info-dialog.c:83
+#: src/ui/gui/variable-info-dialog.c:84
 #, c-format
 msgid "Type: %s\n"
 msgstr "Tipus: %s\n"
 
-#: src/ui/gui/variable-info-dialog.c:87
+#: src/ui/gui/variable-info-dialog.c:88
 #, c-format
 msgid "Missing Values: %s\n"
 msgstr "Valors perduts: %s\n"
 
-#: src/ui/gui/variable-info-dialog.c:92
+#: src/ui/gui/variable-info-dialog.c:93
 #, c-format
 msgid "Measurement Level: %s\n"
 msgstr "Nivel de Mesura: %s\n"
 
-#: src/ui/gui/variable-info-dialog.c:105
+#: src/ui/gui/variable-info-dialog.c:106
 msgid "Value Labels:\n"
 msgstr "Etiqueteas de valor:\n"
 
-#: src/ui/gui/variable-info-dialog.c:115
+#: src/ui/gui/variable-info-dialog.c:116
 #, c-format
 msgid "%s %s\n"
 msgstr "%s %s\n"
@@ -4776,27 +4788,27 @@ msgstr "No ponderar casos."
 msgid "Weight cases by %s"
 msgstr "Pondera casos per %s"
 
-#: tests/dissect-sysfile.c:567
+#: tests/dissect-sysfile.c:571
 #, c-format
 msgid "Unrecognized record type 7, subtype %d."
 msgstr "Tipus de registre 7 no reconegut, subtipe %d."
 
-#: tests/dissect-sysfile.c:846
+#: tests/dissect-sysfile.c:850
 #, c-format
 msgid "%s: Error parsing attribute value %s[%d]"
 msgstr "%s: Error en analitzar valor de l'atribut %s[%d]"
 
-#: tests/dissect-sysfile.c:852
+#: tests/dissect-sysfile.c:856
 #, c-format
 msgid "%s: Attribute value %s[%d] is not quoted: %s"
 msgstr "%s: El valor de l'atribut %s[%d] no esta entre cometes: %s"
 
-#: tests/dissect-sysfile.c:876
+#: tests/dissect-sysfile.c:880
 #, fuzzy, c-format
 msgid "Bad size %zu for extended number of cases."
 msgstr "Longitud no vàlid %zu en l'extensió 11."
 
-#: tests/dissect-sysfile.c:882
+#: tests/dissect-sysfile.c:886
 #, c-format
 msgid "Bad count %zu for extended number of cases."
 msgstr ""
@@ -5271,14 +5283,10 @@ msgstr ""
 msgid "Omitting pie chart for %s, which has over 50 unique values."
 msgstr ""
 
-#: src/language/stats/glm.q:245
+#: src/language/stats/glm.q:248
 msgid "Multivariate GLM not yet supported"
 msgstr "GLM multivariable encara no disponible"
 
-#: src/language/stats/glm.q:355 src/language/stats/regression.q:998
-msgid "No valid data found. This command was skipped."
-msgstr "No s'han trobat dades vàlides. S'gnora aquesta ordre."
-
 #: src/language/stats/means.q:100
 msgid "Missing required subcommand TABLES."
 msgstr "Falta subordre requerida TABLES"
@@ -5287,18 +5295,18 @@ msgstr "Falta subordre requerida TABLES"
 msgid "TABLES subcommand may not appear more than once."
 msgstr "El subcomando TABLES no pot apareixer més d'una vegada."
 
-#: src/language/stats/npar.q:110
+#: src/language/stats/npar.q:111
 msgid "NPAR subcommand not currently implemented."
 msgstr "Actualment no está implenetat el subcomandament NPAR."
 
-#: src/language/stats/npar.q:254
+#: src/language/stats/npar.q:256
 #, c-format
 msgid ""
 "The specified value of HI (%d) is lower than the specified value of LO (%d)"
 msgstr ""
 "El valor especificatper a HI (%d) és menor que l'especificat per a LO (%d)"
 
-#: src/language/stats/npar.q:309
+#: src/language/stats/npar.q:311
 #, c-format
 msgid ""
 "%d expected values were given, but the specified range (%d-%d) requires "
@@ -5307,7 +5315,7 @@ msgstr ""
 "S'han proporcionat %d valors esperats, però l'interval especificat (%d-%d) "
 "requereix exactament %d valors."
 
-#: src/language/stats/npar.q:444 src/language/stats/t-test.q:380
+#: src/language/stats/npar.q:453 src/language/stats/t-test.q:380
 #, c-format
 msgid ""
 "PAIRED was specified but the number of variables preceding WITH (%zu) did "
@@ -5331,21 +5339,21 @@ msgstr "Els coeficients per contrastar %zu no sumen cero."
 msgid "`%s' is not a variable name"
 msgstr "`%s' no és un nom de variable"
 
-#: src/language/stats/oneway.q:274 src/language/stats/regression.q:298
+#: src/language/stats/oneway.q:274 src/language/stats/regression.q:283
 msgid "Sum of Squares"
 msgstr "Suma de Quadrats"
 
-#: src/language/stats/oneway.q:276 src/language/stats/regression.q:300
+#: src/language/stats/oneway.q:276 src/language/stats/regression.q:285
 msgid "Mean Square"
 msgstr "Rang mitjà"
 
-#: src/language/stats/oneway.q:277 src/language/stats/regression.q:301
+#: src/language/stats/oneway.q:277 src/language/stats/regression.q:286
 #: src/language/stats/t-test.q:749
 msgid "F"
 msgstr "F"
 
 #: src/language/stats/oneway.q:278 src/language/stats/oneway.q:535
-#: src/language/stats/regression.q:204 src/language/stats/regression.q:302
+#: src/language/stats/regression.q:201 src/language/stats/regression.q:287
 msgid "Significance"
 msgstr "Significativitat"
 
@@ -5357,7 +5365,7 @@ msgstr "Entre Grups"
 msgid "Within Groups"
 msgstr "Intra Grups"
 
-#: src/language/stats/oneway.q:345 src/language/stats/regression.q:327
+#: src/language/stats/oneway.q:345 src/language/stats/regression.q:312
 msgid "ANOVA"
 msgstr "ANOVA"
 
@@ -5393,7 +5401,7 @@ msgstr "Proves de contrats"
 msgid "Value of Contrast"
 msgstr "Valor de constrast"
 
-#: src/language/stats/oneway.q:684 src/language/stats/regression.q:203
+#: src/language/stats/oneway.q:684 src/language/stats/regression.q:200
 #: src/language/stats/t-test.q:751 src/language/stats/t-test.q:922
 #: src/language/stats/t-test.q:1009
 msgid "t"
@@ -5463,55 +5471,55 @@ msgstr "La variable %s ja existeix."
 msgid "Too many variables in INTO clause."
 msgstr "Massa variables a la clausula INTO."
 
-#: src/language/stats/regression.q:159
+#: src/language/stats/regression.q:156
 msgid "R Square"
 msgstr "R Quadrada"
 
-#: src/language/stats/regression.q:160
+#: src/language/stats/regression.q:157
 msgid "Adjusted R Square"
 msgstr "R Quadrada Ajustada"
 
-#: src/language/stats/regression.q:161
+#: src/language/stats/regression.q:158
 msgid "Std. Error of the Estimate"
 msgstr "Error estàndard de l'Estimador"
 
-#: src/language/stats/regression.q:166
+#: src/language/stats/regression.q:163
 msgid "Model Summary"
 msgstr "Resum del model"
 
-#: src/language/stats/regression.q:200
+#: src/language/stats/regression.q:197
 msgid "B"
 msgstr "B"
 
-#: src/language/stats/regression.q:202
+#: src/language/stats/regression.q:199
 msgid "Beta"
 msgstr "Beta"
 
-#: src/language/stats/regression.q:205
+#: src/language/stats/regression.q:202
 msgid "(Constant)"
 msgstr "(Constant)"
 
-#: src/language/stats/regression.q:269
+#: src/language/stats/regression.q:254
 msgid "Coefficients"
 msgstr "Coeficients"
 
-#: src/language/stats/regression.q:304 src/ui/gui/regression.ui:7
+#: src/language/stats/regression.q:289 src/ui/gui/regression.ui:7
 msgid "Regression"
 msgstr "Regressió"
 
-#: src/language/stats/regression.q:385
+#: src/language/stats/regression.q:370
 msgid "Model"
 msgstr "Model"
 
-#: src/language/stats/regression.q:386
+#: src/language/stats/regression.q:371
 msgid "Covariances"
 msgstr "Covariància"
 
-#: src/language/stats/regression.q:401
+#: src/language/stats/regression.q:386
 msgid "Coefficient Correlations"
 msgstr "Correlacions de Coeficients"
 
-#: src/language/stats/regression.q:808
+#: src/language/stats/regression.q:793
 msgid ""
 "The dependent variable is equal to the independent variable.The least "
 "squares line is therefore Y=X.Standard errors and related statistics may be "
@@ -5521,9 +5529,13 @@ msgstr ""
 "minimos cuadrados es por tanto Y=X. Los errores estàndard i els estadistics "
 "relacionats podríen ser irrellevants."
 
-#: src/language/stats/regression.q:900
-msgid "Dependent variable must be numeric."
-msgstr "La variable dependent ha de ser numèrica."
+#: src/language/stats/regression.q:891
+msgid "REGRESSION requires numeric variables."
+msgstr ""
+
+#: src/language/stats/regression.q:962
+msgid "No valid data found. This command was skipped."
+msgstr "No s'han trobat dades vàlides. S'gnora aquesta ordre."
 
 #: src/language/stats/reliability.q:421
 msgid "Reliability Statistics"
@@ -5788,6 +5800,28 @@ msgstr ""
 msgid "The step value %ld is less than 1.  The value is being reset to 1."
 msgstr "El valor del pas %ld es menor que 1.  el valor es retorna a 1."
 
+#: src/ui/gui/binomial.ui:57 src/ui/gui/chi-square.ui:57
+#, fuzzy
+msgid "_Test Variable List:"
+msgstr "Variable(s) de prova:"
+
+#: src/ui/gui/binomial.ui:126 src/ui/gui/chi-square.ui:126
+msgid "_Get from data"
+msgstr ""
+
+#: src/ui/gui/binomial.ui:143 src/ui/gui/t-test.ui:333
+msgid "_Cut point:"
+msgstr "Punt de tall:"
+
+#: src/ui/gui/binomial.ui:178
+msgid "Define Dichotomy"
+msgstr ""
+
+#: src/ui/gui/binomial.ui:197
+#, fuzzy
+msgid "Test _Proportion:"
+msgstr "Test Prop."
+
 #: src/ui/gui/correlation.ui:7
 #, fuzzy
 msgid "Bivariate Correlations"
@@ -5901,6 +5935,45 @@ msgstr "Proves Estad."
 msgid "Statistics"
 msgstr "Estatísticas"
 
+#: src/ui/gui/chi-square.ui:13
+#, fuzzy
+msgid "Chi-Square Test"
+msgstr "Proves Chi-quadrat."
+
+#: src/ui/gui/chi-square.ui:140
+#, fuzzy
+msgid "Use _specified range"
+msgstr "Utilitza valors especificats:"
+
+#: src/ui/gui/chi-square.ui:162
+#, fuzzy
+msgid "_Lower:"
+msgstr "Inferior"
+
+#: src/ui/gui/chi-square.ui:170
+#, fuzzy
+msgid "_Upper:"
+msgstr "Superior"
+
+#: src/ui/gui/chi-square.ui:214
+#, fuzzy
+msgid "Expected Range:"
+msgstr "N esperat"
+
+#: src/ui/gui/chi-square.ui:240
+msgid "All categor_ies equal"
+msgstr ""
+
+#: src/ui/gui/chi-square.ui:257
+#, fuzzy
+msgid "_Values"
+msgstr "Valores"
+
+#: src/ui/gui/chi-square.ui:301
+#, fuzzy
+msgid "Expected Values:"
+msgstr "Valor extrems"
+
 #: src/ui/gui/descriptives.ui:130 src/ui/gui/frequencies.ui:140
 msgid "Statistics:"
 msgstr "Estadístiques:"
@@ -5980,64 +6053,102 @@ msgstr "Llista de Factors:"
 
 #: src/ui/gui/factor.ui:47
 #, fuzzy
-msgid "Descriptives..."
+msgid "_Descriptives..."
 msgstr "Descriptives"
 
 #: src/ui/gui/factor.ui:60
 #, fuzzy
-msgid "Extraction..."
+msgid "_Extraction..."
 msgstr "Opcions..."
 
-#: src/ui/gui/factor.ui:180
+#: src/ui/gui/factor.ui:74
+#, fuzzy
+msgid "_Rotations..."
+msgstr "Opcions..."
+
+#: src/ui/gui/factor.ui:192
 msgid "Factor Analysis: Extraction"
 msgstr ""
 
-#: src/ui/gui/factor.ui:204
+#: src/ui/gui/factor.ui:216
 #, fuzzy
 msgid "Method: "
 msgstr "Mode:"
 
-#: src/ui/gui/factor.ui:254
+#: src/ui/gui/factor.ui:266
 #, fuzzy
 msgid "Correlation matrix"
 msgstr "Correlació"
 
-#: src/ui/gui/factor.ui:268
+#: src/ui/gui/factor.ui:280
 #, fuzzy
 msgid "Covariance matrix"
 msgstr "Covariància"
 
-#: src/ui/gui/factor.ui:288
+#: src/ui/gui/factor.ui:300
 #, fuzzy
 msgid "Analyse"
 msgstr "_Analitzar"
 
-#: src/ui/gui/factor.ui:312
+#: src/ui/gui/factor.ui:324
 msgid "Unrotatated factor solution"
 msgstr ""
 
-#: src/ui/gui/factor.ui:326
+#: src/ui/gui/factor.ui:338
 msgid "Scree plot"
 msgstr ""
 
-#: src/ui/gui/factor.ui:345 src/ui/gui/roc.ui:286
+#: src/ui/gui/factor.ui:357 src/ui/gui/roc.ui:286
 #, fuzzy
 msgid "Display"
 msgstr "Contingut de cel.la"
 
-#: src/ui/gui/factor.ui:418
+#: src/ui/gui/factor.ui:430
 msgid "Number of factors:"
 msgstr ""
 
-#: src/ui/gui/factor.ui:448
+#: src/ui/gui/factor.ui:460
 #, fuzzy
 msgid "Extract"
 msgstr "Eta"
 
-#: src/ui/gui/factor.ui:463
+#: src/ui/gui/factor.ui:475 src/ui/gui/factor.ui:665
 msgid "Maximum iterations for convergence:"
 msgstr ""
 
+#: src/ui/gui/factor.ui:538
+#, fuzzy
+msgid "Factor Analysis: Rotation"
+msgstr "Llista de Factors:"
+
+#: src/ui/gui/factor.ui:571
+#, fuzzy
+msgid "_None"
+msgstr "Cap"
+
+#: src/ui/gui/factor.ui:582
+#, fuzzy
+msgid "_Varimax"
+msgstr "_Variables:"
+
+#: src/ui/gui/factor.ui:598
+msgid "_Quartimax"
+msgstr ""
+
+#: src/ui/gui/factor.ui:614
+msgid "_Equimax"
+msgstr ""
+
+#: src/ui/gui/factor.ui:637
+#, fuzzy
+msgid "Method"
+msgstr "Mode:"
+
+#: src/ui/gui/factor.ui:648
+#, fuzzy
+msgid "_Display rotated solution"
+msgstr "Mostra _informació de l'arxiu de dades"
+
 #: src/ui/gui/find.ui:8
 #, fuzzy
 msgid "Find Case"
@@ -6751,10 +6862,6 @@ msgstr "Valor del grup 2:"
 msgid "Group_1 value:"
 msgstr "Valor del Grup 1:"
 
-#: src/ui/gui/t-test.ui:333
-msgid "_Cut point:"
-msgstr "Punt de tall:"
-
 #: src/ui/gui/t-test.ui:365
 msgid "_Use specified values:"
 msgstr "Utilitza valors especificats:"
@@ -7000,19 +7107,19 @@ msgstr "Ordenació ascendent"
 msgid "Sort Descending"
 msgstr "Ordenació descendent"
 
-#: src/ui/gui/data-editor.ui:26 src/ui/gui/output-viewer.glade:21
-#: src/ui/gui/syntax-editor.glade:14
+#: src/ui/gui/data-editor.ui:26 src/ui/gui/output-viewer.ui:9
+#: src/ui/gui/syntax-editor.ui:10
 msgid "_File"
 msgstr "_Arxiu"
 
-#: src/ui/gui/data-editor.ui:38 src/ui/gui/syntax-editor.glade:32
-#: src/ui/gui/syntax-editor.glade:62
+#: src/ui/gui/data-editor.ui:38 src/ui/gui/syntax-editor.ui:22
+#: src/ui/gui/syntax-editor.ui:40
 msgid "_Syntax"
 msgstr "_Sintaxi"
 
 #: src/ui/gui/data-editor.ui:44 src/ui/gui/data-editor.ui:217
-#: src/ui/gui/data-editor.ui:229 src/ui/gui/syntax-editor.glade:41
-#: src/ui/gui/syntax-editor.glade:71
+#: src/ui/gui/data-editor.ui:229 src/ui/gui/syntax-editor.ui:28
+#: src/ui/gui/syntax-editor.ui:46
 msgid "_Data"
 msgstr "_Dades"
 
@@ -7040,8 +7147,8 @@ msgstr "Dades usades recentment"
 msgid "Recently Used _Files"
 msgstr "Arxius utilitzats recentment"
 
-#: src/ui/gui/data-editor.ui:111 src/ui/gui/output-viewer.glade:43
-#: src/ui/gui/syntax-editor.glade:118
+#: src/ui/gui/data-editor.ui:111 src/ui/gui/output-viewer.ui:28
+#: src/ui/gui/syntax-editor.ui:70
 msgid "_Edit"
 msgstr "_Editar"
 
@@ -7261,13 +7368,13 @@ msgstr "Anar a la variable"
 msgid "Data File _Comments"
 msgstr "_Comentaris arxiu de dades"
 
-#: src/ui/gui/data-editor.ui:444 src/ui/gui/output-viewer.glade:66
-#: src/ui/gui/syntax-editor.glade:209
+#: src/ui/gui/data-editor.ui:444 src/ui/gui/output-viewer.ui:40
+#: src/ui/gui/syntax-editor.ui:131
 msgid "_Windows"
 msgstr "Finestres"
 
-#: src/ui/gui/data-editor.ui:450 src/ui/gui/output-viewer.glade:76
-#: src/ui/gui/syntax-editor.glade:218
+#: src/ui/gui/data-editor.ui:450 src/ui/gui/output-viewer.ui:46
+#: src/ui/gui/syntax-editor.ui:137
 msgid "_Minimize All Windows"
 msgstr "_Minimitza totes les finestres"
 
@@ -7275,69 +7382,64 @@ msgstr "_Minimitza totes les finestres"
 msgid "_Split"
 msgstr "Divideix"
 
-#: src/ui/gui/data-editor.ui:462 src/ui/gui/output-viewer.glade:87
-#: src/ui/gui/syntax-editor.glade:229
-msgid "_Help"
-msgstr "Ajut"
-
-#: src/ui/gui/data-editor.ui:468 src/ui/gui/output-viewer.glade:94
-#: src/ui/gui/syntax-editor.glade:237
-msgid "_Reference Manual"
-msgstr "Manual de _Referencia"
-
-#: src/ui/gui/data-editor.ui:652
+#: src/ui/gui/data-editor.ui:630
 msgid "Information Area"
 msgstr "Àrea d'Informació"
 
-#: src/ui/gui/data-editor.ui:674
+#: src/ui/gui/data-editor.ui:652
 msgid "Processor Area"
 msgstr "Area del processador"
 
-#: src/ui/gui/data-editor.ui:699
+#: src/ui/gui/data-editor.ui:677
 msgid "Case Counter Area"
 msgstr "Area del Recompte"
 
-#: src/ui/gui/data-editor.ui:724
+#: src/ui/gui/data-editor.ui:702
 msgid "Filter Use Status Area"
 msgstr "Area del Filtre"
 
-#: src/ui/gui/data-editor.ui:750
+#: src/ui/gui/data-editor.ui:728
 msgid "Weight Status Area"
 msgstr "Area de Ponderació"
 
-#: src/ui/gui/data-editor.ui:776
+#: src/ui/gui/data-editor.ui:754
 msgid "Split File Status Area"
 msgstr "Area de Divisió"
 
-#: src/ui/gui/output-viewer.glade:31
+#: src/ui/gui/output-viewer.ui:22
 #, fuzzy
 msgid "_Export"
 msgstr "_Explorar"
 
-#: src/ui/gui/output-viewer.glade:101 src/ui/gui/syntax-editor.glade:244
-msgid "_About"
-msgstr "Qu_ant a..."
-
-#: src/ui/gui/syntax-editor.glade:163
+#: src/ui/gui/syntax-editor.ui:100
 msgid "_Run"
 msgstr "Executa_r"
 
-#: src/ui/gui/syntax-editor.glade:172
+#: src/ui/gui/syntax-editor.ui:106
 msgid "All"
 msgstr "Tots"
 
-#: src/ui/gui/syntax-editor.glade:180
+#: src/ui/gui/syntax-editor.ui:112
 msgid "Selection"
 msgstr "Selecció"
 
-#: src/ui/gui/syntax-editor.glade:188
+#: src/ui/gui/syntax-editor.ui:118
 msgid "Current Line"
 msgstr "Linia actual"
 
-#: src/ui/gui/syntax-editor.glade:197
+#: src/ui/gui/syntax-editor.ui:125
 msgid "To End"
 msgstr "Fins al final"
 
+#~ msgid "Dependent variable must be numeric."
+#~ msgstr "La variable dependent ha de ser numèrica."
+
+#~ msgid "Variable %s has label of invalid length %zu."
+#~ msgstr "Variable %s té una etiqueta de longitud no vàlida %zu."
+
+#~ msgid "_About"
+#~ msgstr "Qu_ant a..."
+
 #~ msgid "Buttons"
 #~ msgstr "Botons"
 
index 4b1d3282bb94e5a452d30fa8763f4fb03dee57c5..4ebdd60b9dae66c1ad45f0b85bd218ac86fe39ad 100644 (file)
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PSPP 0.7.0\n"
 "Report-Msgid-Bugs-To: pspp-dev@gnu.org\n"
-"POT-Creation-Date: 2010-05-09 21:32+0200\n"
+"POT-Creation-Date: 2010-05-21 12:02+0200\n"
 "PO-Revision-Date: 2008-11-05 08:17+0900\n"
 "Last-Translator: John Darrington <john@darrington.wattle.id.au>\n"
 "Language-Team: John Darrington <john@darrington.wattle.id.au>\n"
@@ -241,13 +241,13 @@ msgstr ""
 msgid "scratch"
 msgstr ""
 
-#: src/data/dictionary.c:981
+#: src/data/dictionary.c:980
 msgid ""
 "At least one case in the data file had a weight value that was user-missing, "
 "system-missing, zero, or negative.  These case(s) were ignored."
 msgstr ""
 
-#: src/data/dictionary.c:1284
+#: src/data/dictionary.c:1283
 #, c-format
 msgid "Truncating document line to %d bytes."
 msgstr ""
@@ -330,20 +330,20 @@ msgstr[1] ""
 msgid "%s variables are not compatible with %s format %s."
 msgstr ""
 
-#: src/data/format.c:327 src/data/sys-file-reader.c:744
+#: src/data/format.c:327 src/data/sys-file-reader.c:752
 #: src/ui/gui/psppire-var-store.c:628 src/ui/gui/psppire.ui:1960
 #: src/ui/gui/var-sheet-dialogs.ui:139
 msgid "String"
 msgstr ""
 
-#: src/data/format.c:327 src/data/sys-file-reader.c:744
+#: src/data/format.c:327 src/data/sys-file-reader.c:752
 #: src/ui/gui/psppire-var-store.c:621 src/ui/gui/psppire.ui:2040
 #: src/ui/gui/var-sheet-dialogs.ui:27
 msgid "Numeric"
 msgstr ""
 
-#: src/data/format.c:328 src/data/sys-file-reader.c:1464
-#: src/data/sys-file-reader.c:1466 src/language/xforms/recode.c:493
+#: src/data/format.c:328 src/data/sys-file-reader.c:1472
+#: src/data/sys-file-reader.c:1474 src/language/xforms/recode.c:493
 #: src/language/xforms/recode.c:494 src/language/xforms/recode.c:506
 #: src/language/xforms/recode.c:507
 #: src/language/dictionary/apply-dictionary.c:78
@@ -351,8 +351,8 @@ msgstr ""
 msgid "numeric"
 msgstr ""
 
-#: src/data/format.c:328 src/data/sys-file-reader.c:1464
-#: src/data/sys-file-reader.c:1466 src/language/xforms/recode.c:493
+#: src/data/format.c:328 src/data/sys-file-reader.c:1472
+#: src/data/sys-file-reader.c:1474 src/language/xforms/recode.c:493
 #: src/language/xforms/recode.c:494 src/language/xforms/recode.c:506
 #: src/language/xforms/recode.c:507
 #: src/language/dictionary/apply-dictionary.c:78
@@ -552,7 +552,7 @@ msgstr ""
 msgid "Invalid variable name `%s' in position %d."
 msgstr ""
 
-#: src/data/por-file-reader.c:685 src/data/sys-file-reader.c:602
+#: src/data/por-file-reader.c:685 src/data/sys-file-reader.c:606
 #, c-format
 msgid "Bad width %d for variable %s."
 msgstr ""
@@ -661,47 +661,47 @@ msgstr ""
 msgid "Variable suffix too large."
 msgstr ""
 
-#: src/data/sys-file-reader.c:222
+#: src/data/sys-file-reader.c:226
 #, c-format
 msgid "Recoded variable name duplicates an existing `%s' within system file."
 msgstr ""
 
 #. TRANSLATORS: this fragment will be interpolated into
 #. messages in fh_lock() that identify types of files.
-#: src/data/sys-file-reader.c:286 src/data/sys-file-writer.c:207
+#: src/data/sys-file-reader.c:290 src/data/sys-file-writer.c:207
 msgid "system file"
 msgstr ""
 
-#: src/data/sys-file-reader.c:293
+#: src/data/sys-file-reader.c:297
 #, c-format
 msgid "Error opening \"%s\" for reading as a system file: %s."
 msgstr ""
 
-#: src/data/sys-file-reader.c:332 tests/dissect-sysfile.c:154
+#: src/data/sys-file-reader.c:336 tests/dissect-sysfile.c:154
 msgid "Misplaced type 4 record."
 msgstr ""
 
-#: src/data/sys-file-reader.c:343 tests/dissect-sysfile.c:165
+#: src/data/sys-file-reader.c:347 tests/dissect-sysfile.c:165
 #, c-format
 msgid "Unrecognized record type %d."
 msgstr "Unrecognised record type %d."
 
-#: src/data/sys-file-reader.c:384
+#: src/data/sys-file-reader.c:388
 #, c-format
 msgid "File header claims %d variable positions but %d were read from file."
 msgstr ""
 
-#: src/data/sys-file-reader.c:424
+#: src/data/sys-file-reader.c:428
 #, c-format
 msgid "Error closing system file \"%s\": %s."
 msgstr ""
 
-#: src/data/sys-file-reader.c:489 src/data/sys-file-reader.c:499
+#: src/data/sys-file-reader.c:493 src/data/sys-file-reader.c:503
 #: tests/dissect-sysfile.c:202 tests/dissect-sysfile.c:212
 msgid "This is not an SPSS system file."
 msgstr ""
 
-#: src/data/sys-file-reader.c:521 tests/dissect-sysfile.c:227
+#: src/data/sys-file-reader.c:525 tests/dissect-sysfile.c:227
 msgid ""
 "Compression bias is not the usual value of 100, or system file uses "
 "unrecognized floating-point format."
@@ -709,364 +709,359 @@ msgstr ""
 "Compression bias is not the usual value of 100, or system file uses \n"
 "unrecognised floating-point format."
 
-#: src/data/sys-file-reader.c:598
+#: src/data/sys-file-reader.c:602
 #, c-format
 msgid "Invalid variable name `%s'."
 msgstr ""
 
-#: src/data/sys-file-reader.c:606
+#: src/data/sys-file-reader.c:610
 #, c-format
 msgid "Duplicate variable name `%s' within system file."
 msgstr ""
 
-#: src/data/sys-file-reader.c:614 tests/dissect-sysfile.c:356
+#: src/data/sys-file-reader.c:618 tests/dissect-sysfile.c:356
 msgid "Variable label indicator field is not 0 or 1."
 msgstr ""
 
-#: src/data/sys-file-reader.c:622 tests/dissect-sysfile.c:365
-#, c-format
-msgid "Variable %s has label of invalid length %zu."
-msgstr ""
-
-#: src/data/sys-file-reader.c:641 tests/dissect-sysfile.c:383
+#: src/data/sys-file-reader.c:649 tests/dissect-sysfile.c:387
 msgid "Numeric missing value indicator field is not -3, -2, 0, 1, 2, or 3."
 msgstr ""
 
-#: src/data/sys-file-reader.c:659 tests/dissect-sysfile.c:398
+#: src/data/sys-file-reader.c:667 tests/dissect-sysfile.c:402
 msgid "String missing value indicator field is not 0, 1, 2, or 3."
 msgstr ""
 
-#: src/data/sys-file-reader.c:691
+#: src/data/sys-file-reader.c:699
 msgid "Missing string continuation record."
 msgstr ""
 
-#: src/data/sys-file-reader.c:725
+#: src/data/sys-file-reader.c:733
 #, c-format
 msgid "Unknown variable format %<PRIu8>."
 msgstr ""
 
-#: src/data/sys-file-reader.c:743
+#: src/data/sys-file-reader.c:751
 #, c-format
 msgid "%s variable %s has invalid %s format %s."
 msgstr ""
 
-#: src/data/sys-file-reader.c:746
+#: src/data/sys-file-reader.c:754
 msgid "print"
 msgstr ""
 
-#: src/data/sys-file-reader.c:746
+#: src/data/sys-file-reader.c:754
 msgid "write"
 msgstr ""
 
-#: src/data/sys-file-reader.c:750
+#: src/data/sys-file-reader.c:758
 msgid "Suppressing further invalid format warnings."
 msgstr ""
 
-#: src/data/sys-file-reader.c:768
+#: src/data/sys-file-reader.c:776
 msgid "Weighting variable must be numeric."
 msgstr ""
 
-#: src/data/sys-file-reader.c:782
+#: src/data/sys-file-reader.c:790
 msgid "Multiple type 6 (document) records."
 msgstr ""
 
-#: src/data/sys-file-reader.c:786
+#: src/data/sys-file-reader.c:794
 #, c-format
 msgid "Number of document lines (%d) must be greater than 0."
 msgstr ""
 
-#: src/data/sys-file-reader.c:794
+#: src/data/sys-file-reader.c:802
 msgid "Document line contains null byte."
 msgstr ""
 
-#: src/data/sys-file-reader.c:885
+#: src/data/sys-file-reader.c:893
 #, c-format
 msgid ""
 "Unrecognized record type 7, subtype %d.  Please send a copy of this file, "
 "and the syntax which created it to %s"
 msgstr ""
 
-#: src/data/sys-file-reader.c:912 tests/dissect-sysfile.c:590
+#: src/data/sys-file-reader.c:920 tests/dissect-sysfile.c:594
 #, c-format
 msgid "Bad size (%zu) or count (%zu) field on record type 7, subtype 3."
 msgstr ""
 
-#: src/data/sys-file-reader.c:932
+#: src/data/sys-file-reader.c:940
 #, c-format
 msgid ""
 "Floating-point representation indicated by system file (%d) differs from "
 "expected (%d)."
 msgstr ""
 
-#: src/data/sys-file-reader.c:945 src/language/dictionary/sys-file-info.c:110
+#: src/data/sys-file-reader.c:953 src/language/dictionary/sys-file-info.c:110
 msgid "Little Endian"
 msgstr ""
 
-#: src/data/sys-file-reader.c:945 src/language/dictionary/sys-file-info.c:109
+#: src/data/sys-file-reader.c:953 src/language/dictionary/sys-file-info.c:109
 msgid "Big Endian"
 msgstr ""
 
-#: src/data/sys-file-reader.c:946
+#: src/data/sys-file-reader.c:954
 #, c-format
 msgid ""
 "Integer format indicated by system file (%s) differs from expected (%s)."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1003 tests/dissect-sysfile.c:621
+#: src/data/sys-file-reader.c:1011 tests/dissect-sysfile.c:625
 #, c-format
 msgid "Bad size (%zu) or count (%zu) on extension 4."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1007 src/data/sys-file-reader.c:1011
-#: src/data/sys-file-reader.c:1015 tests/dissect-sysfile.c:626
-#: tests/dissect-sysfile.c:631 tests/dissect-sysfile.c:636
+#: src/data/sys-file-reader.c:1015 src/data/sys-file-reader.c:1019
+#: src/data/sys-file-reader.c:1023 tests/dissect-sysfile.c:630
+#: tests/dissect-sysfile.c:635 tests/dissect-sysfile.c:640
 #, c-format
 msgid "File specifies unexpected value %g as %s."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1048
+#: src/data/sys-file-reader.c:1056
 #, c-format
 msgid "Missing space following 'C' at offset %zu in MRSETS record"
 msgstr ""
 
-#: src/data/sys-file-reader.c:1066 tests/dissect-sysfile.c:687
+#: src/data/sys-file-reader.c:1074 tests/dissect-sysfile.c:691
 #, c-format
 msgid "Missing space following 'E' at offset %zu in MRSETS record"
 msgstr ""
 
-#: src/data/sys-file-reader.c:1075 tests/dissect-sysfile.c:696
+#: src/data/sys-file-reader.c:1083 tests/dissect-sysfile.c:700
 #, c-format
 msgid ""
 "Unexpected label source value \"%s\" following 'E' at offset %zu in MRSETS "
 "record"
 msgstr ""
 
-#: src/data/sys-file-reader.c:1081
+#: src/data/sys-file-reader.c:1089
 #, c-format
 msgid "Missing 'C', 'D', or 'E' at offset %zu in MRSETS record."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1110
+#: src/data/sys-file-reader.c:1118
 #, c-format
 msgid "Missing new-line parsing variable names at offset %zu in MRSETS record."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1121
+#: src/data/sys-file-reader.c:1129
 #, c-format
 msgid "Duplicate variable name %s at offset %zu in MRSETS record."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1134
+#: src/data/sys-file-reader.c:1142
 #, c-format
 msgid "MRSET %s contains both string and numeric variables."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1149
+#: src/data/sys-file-reader.c:1157
 #, c-format
 msgid "MRSET %s has only %zu variables."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1186 tests/dissect-sysfile.c:754
+#: src/data/sys-file-reader.c:1194 tests/dissect-sysfile.c:758
 #, c-format
 msgid "Bad size %zu on extension 11."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1198 tests/dissect-sysfile.c:766
+#: src/data/sys-file-reader.c:1206 tests/dissect-sysfile.c:770
 #, c-format
 msgid "Extension 11 has bad count %zu (for %zu variables)."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1219
+#: src/data/sys-file-reader.c:1227
 #, c-format
 msgid ""
 "Invalid variable display parameters for variable %zu (%s).  Default "
 "parameters substituted."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1263
+#: src/data/sys-file-reader.c:1271
 #, c-format
 msgid "Long variable mapping from %s to invalid variable name `%s'."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1273
+#: src/data/sys-file-reader.c:1281
 #, c-format
 msgid "Duplicate long variable name `%s' within system file."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1326
+#: src/data/sys-file-reader.c:1334
 #, c-format
 msgid "%s listed as string of invalid length %s in very length string record."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1336
+#: src/data/sys-file-reader.c:1344
 #, c-format
 msgid ""
 "%s listed in very long string record with width %s, which requires only one "
 "segment."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1342
+#: src/data/sys-file-reader.c:1350
 #, c-format
 msgid "Very long string %s overflows dictionary."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1356
+#: src/data/sys-file-reader.c:1364
 #, c-format
 msgid ""
 "Very long string with width %ld has segment %d of width %d (expected %d)"
 msgstr ""
 
-#: src/data/sys-file-reader.c:1402
+#: src/data/sys-file-reader.c:1410
 #, c-format
 msgid "Invalid number of labels: %d.  Ignoring labels."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1433 tests/dissect-sysfile.c:464
+#: src/data/sys-file-reader.c:1441 tests/dissect-sysfile.c:468
 msgid ""
 "Variable index record (type 4) does not immediately follow value label "
 "record (type 3) as it should."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1440
+#: src/data/sys-file-reader.c:1448
 #, c-format
 msgid ""
 "Number of variables associated with a value label (%d) is not between 1 and "
 "the number of variables (%zu)."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1451
+#: src/data/sys-file-reader.c:1459
 #, c-format
 msgid ""
 "Value labels may not be added to long string variables (e.g. %s) using "
 "records types 3 and 4."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1460
+#: src/data/sys-file-reader.c:1468
 #, c-format
 msgid ""
 "Variables associated with value label are not all of identical type.  "
 "Variable %s is %s, but variable %s is %s."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1494
+#: src/data/sys-file-reader.c:1502
 #, c-format
 msgid "Duplicate value label for %g on %s."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1497 src/data/sys-file-reader.c:1678
+#: src/data/sys-file-reader.c:1505 src/data/sys-file-reader.c:1686
 #, c-format
 msgid "Duplicate value label for \"%.*s\" on %s."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1535
+#: src/data/sys-file-reader.c:1543
 #, c-format
 msgid "Error parsing attribute value %s[%d]"
 msgstr ""
 
-#: src/data/sys-file-reader.c:1549
+#: src/data/sys-file-reader.c:1557
 #, c-format
 msgid "Attribute value %s[%d] is not quoted: %s"
 msgstr ""
 
-#: src/data/sys-file-reader.c:1612 tests/dissect-sysfile.c:932
+#: src/data/sys-file-reader.c:1620 tests/dissect-sysfile.c:936
 #, c-format
 msgid ""
 "Variable name length in long string value label record (%d) exceeds %d-byte "
 "limit."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1622
+#: src/data/sys-file-reader.c:1630
 #, c-format
 msgid "Ignoring long string value record for unknown variable %s."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1629
+#: src/data/sys-file-reader.c:1637
 #, c-format
 msgid "Ignoring long string value record for numeric variable %s."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1636
+#: src/data/sys-file-reader.c:1644
 #, c-format
 msgid ""
 "Ignoring long string value record for variable %s because the record's width "
 "(%d) does not match the variable's width (%d)"
 msgstr ""
 
-#: src/data/sys-file-reader.c:1658
+#: src/data/sys-file-reader.c:1666
 #, c-format
 msgid ""
 "Ignoring long string value %zu for variable %s, with width %d, that has bad "
 "value width %zu."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1773
+#: src/data/sys-file-reader.c:1781
 msgid "File ends in partial case."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1781
+#: src/data/sys-file-reader.c:1789
 #, c-format
 msgid "Error reading case from file %s."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1882
+#: src/data/sys-file-reader.c:1890
 msgid ""
 "Possible compressed data corruption: compressed spaces appear in numeric "
 "field."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1935
+#: src/data/sys-file-reader.c:1943
 #, c-format
 msgid ""
 "Possible compressed data corruption: string contains compressed integer "
 "(opcode %d)"
 msgstr ""
 
-#: src/data/sys-file-reader.c:2027
+#: src/data/sys-file-reader.c:2035
 #, c-format
 msgid "Variable index %d not in valid range 1...%d."
 msgstr ""
 
-#: src/data/sys-file-reader.c:2032
+#: src/data/sys-file-reader.c:2040
 #, c-format
 msgid "Variable index %d refers to long string continuation."
 msgstr ""
 
-#: src/data/sys-file-reader.c:2100
+#: src/data/sys-file-reader.c:2108
 #, c-format
 msgid "Suppressed %d additional related warnings."
 msgstr ""
 
-#: src/data/sys-file-reader.c:2141
+#: src/data/sys-file-reader.c:2153 src/data/sys-file-reader.c:2170
 #, c-format
 msgid "Dictionary record refers to unknown variable %s."
 msgstr ""
 
-#: src/data/sys-file-reader.c:2202
+#: src/data/sys-file-reader.c:2231
 #, c-format
 msgid "Expecting digit at offset %zu in MRSETS record."
 msgstr ""
 
-#: src/data/sys-file-reader.c:2209
+#: src/data/sys-file-reader.c:2238
 #, c-format
 msgid "Expecting space at offset %zu in MRSETS record."
 msgstr ""
 
-#: src/data/sys-file-reader.c:2216
+#: src/data/sys-file-reader.c:2245
 #, c-format
 msgid "%zu-byte string starting at offset %zu exceeds record length %zu."
 msgstr ""
 
-#: src/data/sys-file-reader.c:2226
+#: src/data/sys-file-reader.c:2255
 #, c-format
 msgid "Expecting space at offset %zu following %zu-byte string."
 msgstr ""
 
-#: src/data/sys-file-reader.c:2318 tests/dissect-sysfile.c:1337
+#: src/data/sys-file-reader.c:2347 tests/dissect-sysfile.c:1341
 #, c-format
 msgid "System error: %s."
 msgstr ""
 
-#: src/data/sys-file-reader.c:2320 tests/dissect-sysfile.c:1339
+#: src/data/sys-file-reader.c:2349 tests/dissect-sysfile.c:1343
 msgid "Unexpected end of file."
 msgstr ""
 
@@ -1085,28 +1080,28 @@ msgstr ""
 msgid "An I/O error occurred writing system file \"%s\"."
 msgstr ""
 
-#: src/data/variable.c:215
+#: src/data/variable.c:206
 #, c-format
 msgid ""
 "Character `%c' (in %s) may not appear as the first character in a variable "
 "name."
 msgstr ""
 
-#: src/data/variable.c:227
+#: src/data/variable.c:218
 #, c-format
 msgid "Character `%c' (in %s) may not appear in a variable name."
 msgstr ""
 
-#: src/data/variable.c:253
+#: src/data/variable.c:244
 msgid "Variable name cannot be empty string."
 msgstr ""
 
-#: src/data/variable.c:259
+#: src/data/variable.c:250
 #, c-format
 msgid "Variable name %s exceeds %d-character limit."
 msgstr ""
 
-#: src/data/variable.c:267
+#: src/data/variable.c:258
 #, c-format
 msgid "`%s' may not be used as a variable name because it is a reserved word."
 msgstr ""
@@ -2002,7 +1997,7 @@ msgid "IBM 390 Hex Long."
 msgstr ""
 
 #: src/language/dictionary/sys-file-info.c:120 src/ui/gui/descriptives.ui:85
-#: src/ui/gui/factor.ui:161 src/ui/gui/recode.ui:960
+#: src/ui/gui/factor.ui:173 src/ui/gui/recode.ui:960
 msgid "Variables:"
 msgstr ""
 
@@ -2376,7 +2371,7 @@ msgstr ""
 msgid "Variable %s is not dichotomous"
 msgstr ""
 
-#: src/language/stats/binomial.c:192
+#: src/language/stats/binomial.c:192 src/ui/gui/binomial.ui:13
 msgid "Binomial Test"
 msgstr ""
 
@@ -2389,13 +2384,13 @@ msgid "Group2"
 msgstr ""
 
 #: src/language/stats/binomial.c:224 src/language/stats/chisquare.c:177
-#: src/language/stats/chisquare.c:236 src/language/stats/factor.c:1188
+#: src/language/stats/chisquare.c:236 src/language/stats/factor.c:1462
 #: src/language/stats/sign.c:92 src/language/stats/wilcoxon.c:260
 #: src/ui/gui/crosstabs-dialog.c:60 src/language/stats/crosstabs.q:823
 #: src/language/stats/crosstabs.q:1151 src/language/stats/crosstabs.q:1528
 #: src/language/stats/examine.q:1105 src/language/stats/frequencies.q:871
 #: src/language/stats/oneway.q:302 src/language/stats/oneway.q:472
-#: src/language/stats/regression.q:306 src/language/stats/reliability.q:702
+#: src/language/stats/regression.q:291 src/language/stats/reliability.q:702
 msgid "Total"
 msgstr ""
 
@@ -2404,8 +2399,8 @@ msgstr ""
 msgid "Category"
 msgstr ""
 
-#: src/language/stats/binomial.c:258 src/language/stats/correlations.c:120
-#: src/language/stats/correlations.c:228 src/language/stats/npar-summary.c:122
+#: src/language/stats/binomial.c:258 src/language/stats/correlations.c:119
+#: src/language/stats/correlations.c:227 src/language/stats/npar-summary.c:122
 #: src/language/stats/sign.c:72 src/language/stats/wilcoxon.c:243
 #: src/language/stats/crosstabs.q:830 src/language/stats/examine.q:1176
 #: src/language/stats/frequencies.q:1034 src/language/stats/oneway.q:385
@@ -2444,7 +2439,7 @@ msgid "Expected N"
 msgstr ""
 
 #: src/language/stats/chisquare.c:163 src/language/stats/chisquare.c:202
-#: src/ui/gui/crosstabs-dialog.c:62 src/language/stats/regression.q:305
+#: src/ui/gui/crosstabs-dialog.c:62 src/language/stats/regression.q:290
 msgid "Residual"
 msgstr ""
 
@@ -2464,7 +2459,7 @@ msgstr ""
 
 #: src/language/stats/chisquare.c:264 src/language/stats/crosstabs.q:1215
 #: src/language/stats/oneway.q:275 src/language/stats/oneway.q:685
-#: src/language/stats/regression.q:299 src/language/stats/t-test.q:752
+#: src/language/stats/regression.q:284 src/language/stats/t-test.q:752
 #: src/language/stats/t-test.q:923 src/language/stats/t-test.q:1010
 msgid "df"
 msgstr ""
@@ -2473,13 +2468,13 @@ msgstr ""
 msgid "Asymp. Sig."
 msgstr ""
 
-#: src/language/stats/correlations.c:97 src/language/stats/factor.c:1431
+#: src/language/stats/correlations.c:96 src/language/stats/factor.c:1720
 #: src/language/stats/npar-summary.c:108
 msgid "Descriptive Statistics"
 msgstr ""
 
-#: src/language/stats/correlations.c:118 src/language/stats/descriptives.c:101
-#: src/language/stats/factor.c:1452 src/language/stats/npar-summary.c:125
+#: src/language/stats/correlations.c:117 src/language/stats/descriptives.c:101
+#: src/language/stats/factor.c:1741 src/language/stats/npar-summary.c:125
 #: src/ui/gui/descriptives-dialog.c:40 src/ui/gui/frequencies-dialog.c:41
 #: src/language/stats/examine.q:1444 src/language/stats/frequencies.q:105
 #: src/language/stats/oneway.q:386 src/language/stats/t-test.q:506
@@ -2488,7 +2483,7 @@ msgstr ""
 msgid "Mean"
 msgstr ""
 
-#: src/language/stats/correlations.c:119 src/language/stats/factor.c:1453
+#: src/language/stats/correlations.c:118 src/language/stats/factor.c:1742
 #: src/language/stats/npar-summary.c:128 src/language/stats/examine.q:1479
 #: src/language/stats/oneway.q:387 src/language/stats/t-test.q:507
 #: src/language/stats/t-test.q:527 src/language/stats/t-test.q:626
@@ -2496,33 +2491,33 @@ msgstr ""
 msgid "Std. Deviation"
 msgstr ""
 
-#: src/language/stats/correlations.c:191 src/language/stats/factor.c:1331
+#: src/language/stats/correlations.c:190 src/language/stats/factor.c:1620
 msgid "Correlations"
 msgstr ""
 
-#: src/language/stats/correlations.c:217
+#: src/language/stats/correlations.c:216
 msgid "Pearson Correlation"
 msgstr ""
 
-#: src/language/stats/correlations.c:219 src/language/stats/oneway.q:686
+#: src/language/stats/correlations.c:218 src/language/stats/oneway.q:686
 #: src/language/stats/t-test.q:753 src/language/stats/t-test.q:924
 #: src/language/stats/t-test.q:1011
 msgid "Sig. (2-tailed)"
 msgstr ""
 
-#: src/language/stats/correlations.c:219
+#: src/language/stats/correlations.c:218
 msgid "Sig. (1-tailed)"
 msgstr ""
 
-#: src/language/stats/correlations.c:223
+#: src/language/stats/correlations.c:222
 msgid "Cross-products"
 msgstr ""
 
-#: src/language/stats/correlations.c:224
+#: src/language/stats/correlations.c:223
 msgid "Covariance"
 msgstr ""
 
-#: src/language/stats/correlations.c:446 src/language/stats/descriptives.c:361
+#: src/language/stats/correlations.c:454 src/language/stats/descriptives.c:361
 #: src/language/data-io/list.q:91
 msgid "No variables specified."
 msgstr ""
@@ -2650,47 +2645,39 @@ msgstr ""
 msgid "Variable %s specified twice in sort criteria."
 msgstr ""
 
-#: src/language/stats/factor.c:558
+#: src/language/stats/factor.c:803
 msgid "Factor analysis on a single variable is not useful."
 msgstr ""
 
-#: src/language/stats/factor.c:939
+#: src/language/stats/factor.c:1206
 msgid "Component Number"
 msgstr ""
 
-#: src/language/stats/factor.c:939
+#: src/language/stats/factor.c:1206
 msgid "Factor Number"
 msgstr ""
 
-#: src/language/stats/factor.c:970
+#: src/language/stats/factor.c:1237
 msgid "Communalities"
 msgstr ""
 
-#: src/language/stats/factor.c:976
+#: src/language/stats/factor.c:1243
 msgid "Initial"
 msgstr ""
 
-#: src/language/stats/factor.c:979
+#: src/language/stats/factor.c:1246
 msgid "Extraction"
 msgstr ""
 
-#: src/language/stats/factor.c:1029
-msgid "Component Matrix"
-msgstr ""
-
-#: src/language/stats/factor.c:1031
-msgid "Factor Matrix"
-msgstr ""
-
-#: src/language/stats/factor.c:1039 src/language/stats/factor.c:1163
+#: src/language/stats/factor.c:1310 src/language/stats/factor.c:1437
 msgid "Component"
 msgstr ""
 
-#: src/language/stats/factor.c:1044 src/language/stats/factor.c:1165
+#: src/language/stats/factor.c:1315 src/language/stats/factor.c:1439
 msgid "Factor"
 msgstr ""
 
-#: src/language/stats/factor.c:1076 src/language/stats/factor.c:1219
+#: src/language/stats/factor.c:1347 src/language/stats/factor.c:1495
 #: src/ui/gui/psppire-data-store.c:755 src/ui/gui/psppire-var-store.c:699
 #: src/ui/gui/psppire-var-store.c:709 src/ui/gui/psppire-var-store.c:719
 #: src/ui/gui/psppire-var-store.c:825
@@ -2698,59 +2685,75 @@ msgstr ""
 msgid "%d"
 msgstr ""
 
-#: src/language/stats/factor.c:1138
+#: src/language/stats/factor.c:1412
 msgid "Total Variance Explained"
 msgstr ""
 
-#: src/language/stats/factor.c:1170
+#: src/language/stats/factor.c:1444
 msgid "Initial Eigenvalues"
 msgstr ""
 
-#: src/language/stats/factor.c:1176
+#: src/language/stats/factor.c:1450
 msgid "Extraction Sums of Squared Loadings"
 msgstr ""
 
-#: src/language/stats/factor.c:1182
+#: src/language/stats/factor.c:1456
 msgid "Rotation Sums of Squared Loadings"
 msgstr ""
 
-#: src/language/stats/factor.c:1190
+#: src/language/stats/factor.c:1464
 #, no-c-format
 msgid "% of Variance"
 msgstr ""
 
-#: src/language/stats/factor.c:1191
+#: src/language/stats/factor.c:1465
 msgid "Cumulative %"
 msgstr ""
 
-#: src/language/stats/factor.c:1289
+#: src/language/stats/factor.c:1578
 msgid "Correlation Matrix"
 msgstr ""
 
-#: src/language/stats/factor.c:1343
+#: src/language/stats/factor.c:1632
 msgid "Sig. 1-tailed"
 msgstr ""
 
-#: src/language/stats/factor.c:1377
+#: src/language/stats/factor.c:1666
 msgid "Determinant"
 msgstr ""
 
-#: src/language/stats/factor.c:1454
+#: src/language/stats/factor.c:1743
 msgid "Analysis N"
 msgstr ""
 
-#: src/language/stats/factor.c:1487
+#: src/language/stats/factor.c:1776
 msgid ""
 "The FACTOR criteria result in zero factors extracted. Therefore no analysis "
 "will be performed."
 msgstr ""
 
-#: src/language/stats/factor.c:1493
+#: src/language/stats/factor.c:1782
 msgid ""
 "The FACTOR criteria result in more factors than variables, which is not "
 "meaningful. No analysis will be performed."
 msgstr ""
 
+#: src/language/stats/factor.c:1865
+msgid "Component Matrix"
+msgstr ""
+
+#: src/language/stats/factor.c:1865
+msgid "Factor Matrix"
+msgstr ""
+
+#: src/language/stats/factor.c:1871
+msgid "Rotated Component Matrix"
+msgstr ""
+
+#: src/language/stats/factor.c:1871
+msgid "Rotated Factor Matrix"
+msgstr ""
+
 #: src/language/stats/flip.c:98
 msgid ""
 "FLIP ignores TEMPORARY.  Temporary transformations will be made permanent."
@@ -2840,7 +2843,7 @@ msgstr ""
 
 #: src/language/stats/roc.c:952 src/language/stats/examine.q:1641
 #: src/language/stats/oneway.q:388 src/language/stats/oneway.q:683
-#: src/language/stats/regression.q:201
+#: src/language/stats/regression.q:198
 msgid "Std. Error"
 msgstr ""
 
@@ -3671,7 +3674,7 @@ msgstr ""
 msgid "ascii: opening output file \"%s\""
 msgstr ""
 
-#: src/output/ascii.c:913 src/output/cairo.c:826
+#: src/output/ascii.c:913 src/output/cairo.c:784
 #, c-format
 msgid "%s - Page %d"
 msgstr ""
@@ -3788,36 +3791,36 @@ msgid ""
 "bad box: (%d+%d=%d,%d+%d=%d)-(%d+%d=%d,%d+%d=%d) in table size (%d,%d)\n"
 msgstr ""
 
-#: src/output/cairo.c:283
+#: src/output/cairo.c:295
 #, c-format
 msgid "error opening output file \"%s\": %s"
 msgstr ""
 
-#: src/output/cairo.c:301
+#: src/output/cairo.c:312
 #, c-format
 msgid ""
 "The defined page is not wide enough to hold at least %d characters in the "
 "default font.  In fact, there's only room for %d characters."
 msgstr ""
 
-#: src/output/cairo.c:311
+#: src/output/cairo.c:322
 #, c-format
 msgid ""
 "The defined page is not long enough to hold margins and headers, plus least %"
 "d lines of the default fonts.  In fact, there's only room for %d lines."
 msgstr ""
 
-#: src/output/cairo.c:364
+#: src/output/cairo.c:376
 #, c-format
 msgid "error drawing output for %s driver: %s"
 msgstr ""
 
-#: src/output/cairo.c:906
+#: src/output/cairo.c:864
 #, c-format
 msgid "\"%s\": bad font specification"
 msgstr ""
 
-#: src/output/cairo.c:1116
+#: src/output/cairo.c:1084
 #, c-format
 msgid "error writing output file \"%s\": %s"
 msgstr ""
@@ -3913,16 +3916,6 @@ msgstr ""
 msgid "%s: output option specified more than once"
 msgstr ""
 
-#: src/ui/gui/about.c:66
-msgid "A program for the analysis of sampled data"
-msgstr ""
-
-#. TRANSLATORS: Use this string to list the people who have helped with
-#. translation to your language.
-#: src/ui/gui/about.c:76
-msgid "translator-credits"
-msgstr "John Darrington"
-
 #: src/ui/gui/checkbox-treeview.c:92 src/language/stats/crosstabs.q:1213
 #: src/language/stats/crosstabs.q:1240 src/language/stats/crosstabs.q:1263
 #: src/language/stats/crosstabs.q:1287 src/language/stats/examine.q:1638
@@ -3989,7 +3982,7 @@ msgstr ""
 #: src/ui/gui/crosstabs-dialog.c:54 src/ui/gui/crosstabs-dialog.c:65
 #: src/ui/gui/crosstabs-dialog.c:100 src/ui/gui/crosstabs-dialog.c:108
 #: src/ui/gui/psppire-var-store.c:612 src/ui/gui/var-display.c:16
-#: src/ui/gui/variable-info-dialog.c:40
+#: src/ui/gui/variable-info-dialog.c:41
 msgid "None"
 msgstr ""
 
@@ -4025,12 +4018,12 @@ msgstr ""
 msgid "Standard error"
 msgstr ""
 
-#: src/ui/gui/find-dialog.c:651
+#: src/ui/gui/find-dialog.c:649
 #, c-format
 msgid "Bad regular expression: %s"
 msgstr ""
 
-#: src/ui/gui/factor-dialog.c:230
+#: src/ui/gui/factor-dialog.c:344
 #, c-format
 msgid "Eigenvalues over %4.2f times the mean eigenvalue"
 msgstr ""
@@ -4056,17 +4049,35 @@ msgstr ""
 msgid "Median"
 msgstr ""
 
-#: src/ui/gui/helper.c:196
+#: src/ui/gui/helper.c:197
 msgid "Sorry. The help system hasn't yet been implemented."
 msgstr ""
 
-#: src/ui/gui/helper.c:241
+#: src/ui/gui/help-menu.c:67
+msgid "A program for the analysis of sampled data"
+msgstr ""
+
+#. TRANSLATORS: Use this string to list the people who have helped with
+#. translation to your language.
+#: src/ui/gui/help-menu.c:77
+msgid "translator-credits"
+msgstr "John Darrington"
+
+#: src/ui/gui/help-menu.c:98
 #, c-format
 msgid ""
 "Cannot open reference manual: %s.  The PSPP user manual is also available at "
 "http://www.gnu.org/software/pspp/documentation.html"
 msgstr ""
 
+#: src/ui/gui/help-menu.c:117
+msgid "_Help"
+msgstr ""
+
+#: src/ui/gui/help-menu.c:124
+msgid "_Reference Manual"
+msgstr ""
+
 #: src/ui/gui/missing-val-dialog.c:113 src/ui/gui/missing-val-dialog.c:167
 msgid "Incorrect value for variable type"
 msgstr ""
@@ -4075,7 +4086,7 @@ msgstr ""
 msgid "Incorrect range specification"
 msgstr ""
 
-#: src/ui/gui/oneway-anova-dialog.c:314
+#: src/ui/gui/oneway-anova-dialog.c:313
 #, c-format
 msgid "Contrast %d of %d"
 msgstr ""
@@ -4100,57 +4111,57 @@ msgstr ""
 msgid "var"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:210
+#: src/ui/gui/psppire-data-window.c:212
 msgid "Transformations Pending"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:226
+#: src/ui/gui/psppire-data-window.c:228
 msgid "Filter off"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:240
+#: src/ui/gui/psppire-data-window.c:242
 #, c-format
 msgid "Filter by %s"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:261
+#: src/ui/gui/psppire-data-window.c:263
 msgid "No Split"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:270
+#: src/ui/gui/psppire-data-window.c:272
 msgid "Split by "
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:298
+#: src/ui/gui/psppire-data-window.c:300
 msgid "Weights off"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:312
+#: src/ui/gui/psppire-data-window.c:314
 #, c-format
 msgid "Weight by %s"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:380
+#: src/ui/gui/psppire-data-window.c:382
 msgid "Open"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:390
+#: src/ui/gui/psppire-data-window.c:392
 msgid "Data and Syntax Files"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:400 src/ui/gui/psppire-data-window.c:611
+#: src/ui/gui/psppire-data-window.c:402 src/ui/gui/psppire-data-window.c:611
 msgid "System Files (*.sav)"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:406 src/ui/gui/psppire-data-window.c:617
+#: src/ui/gui/psppire-data-window.c:408 src/ui/gui/psppire-data-window.c:617
 msgid "Portable Files (*.por) "
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:412 src/ui/gui/psppire-syntax-window.c:292
+#: src/ui/gui/psppire-data-window.c:414 src/ui/gui/psppire-syntax-window.c:292
 msgid "Syntax Files (*.sps) "
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:418 src/ui/gui/psppire-data-window.c:623
+#: src/ui/gui/psppire-data-window.c:420 src/ui/gui/psppire-data-window.c:623
 #: src/ui/gui/psppire-syntax-window.c:298
 msgid "All Files"
 msgstr ""
@@ -4163,43 +4174,43 @@ msgstr ""
 msgid "Portable File"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:786
+#: src/ui/gui/psppire-data-window.c:773
 msgid "Font Selection"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:1581
+#: src/ui/gui/psppire-data-window.c:1261
 msgid "Data Editor"
 msgstr ""
 
-#: src/ui/gui/psppire-output-window.c:441
+#: src/ui/gui/psppire-output-window.c:458
 msgid "Export Output"
 msgstr ""
 
-#: src/ui/gui/psppire-output-window.c:449
+#: src/ui/gui/psppire-output-window.c:466
 msgid "PDF Files (*.pdf)"
 msgstr ""
 
-#: src/ui/gui/psppire-output-window.c:450
+#: src/ui/gui/psppire-output-window.c:467
 msgid "HTML Files (*.html)"
 msgstr ""
 
-#: src/ui/gui/psppire-output-window.c:451
+#: src/ui/gui/psppire-output-window.c:468
 msgid "OpenDocument Files (*.odt)"
 msgstr ""
 
-#: src/ui/gui/psppire-output-window.c:452
+#: src/ui/gui/psppire-output-window.c:469
 msgid "Text Files (*.txt)"
 msgstr ""
 
-#: src/ui/gui/psppire-output-window.c:453
+#: src/ui/gui/psppire-output-window.c:470
 msgid "PostScript Files (*.ps)"
 msgstr ""
 
-#: src/ui/gui/psppire-output-window.c:454
+#: src/ui/gui/psppire-output-window.c:471
 msgid "Comma-Separated Value Files (*.csv)"
 msgstr ""
 
-#: src/ui/gui/psppire-output-window.c:593
+#: src/ui/gui/psppire-output-window.c:605
 msgid "Output Viewer"
 msgstr ""
 
@@ -4212,11 +4223,11 @@ msgstr ""
 msgid "Save Syntax"
 msgstr ""
 
-#: src/ui/gui/psppire-syntax-window.c:512
+#: src/ui/gui/psppire-syntax-window.c:496
 msgid "Syntax Editor"
 msgstr ""
 
-#: src/ui/gui/psppire-syntax-window.c:526
+#: src/ui/gui/psppire-syntax-window.c:510
 #, c-format
 msgid "Cannot load syntax file '%s'"
 msgstr ""
@@ -4298,27 +4309,27 @@ msgstr ""
 msgid "Close _without saving"
 msgstr ""
 
-#: src/ui/gui/recode-dialog.c:915
+#: src/ui/gui/recode-dialog.c:911
 msgid "Recode into Different Variables"
 msgstr ""
 
-#: src/ui/gui/recode-dialog.c:918 src/ui/gui/recode.ui:692
+#: src/ui/gui/recode-dialog.c:914 src/ui/gui/recode.ui:692
 msgid "Recode into Same Variables"
 msgstr ""
 
-#: src/ui/gui/recode-dialog.c:933 src/ui/gui/recode-dialog.c:1029
+#: src/ui/gui/recode-dialog.c:929 src/ui/gui/recode-dialog.c:1025
 msgid "New"
 msgstr ""
 
-#: src/ui/gui/recode-dialog.c:948 src/ui/gui/recode-dialog.c:1021
+#: src/ui/gui/recode-dialog.c:944 src/ui/gui/recode-dialog.c:1017
 msgid "Old"
 msgstr ""
 
-#: src/ui/gui/recode-dialog.c:1278
+#: src/ui/gui/recode-dialog.c:1274
 msgid "Recode into Different Variables: Old and New Values "
 msgstr ""
 
-#: src/ui/gui/recode-dialog.c:1279
+#: src/ui/gui/recode-dialog.c:1275
 msgid "Recode into Same Variables: Old and New Values"
 msgstr ""
 
@@ -4326,7 +4337,7 @@ msgstr ""
 msgid "Coeff"
 msgstr ""
 
-#: src/ui/gui/regression-dialog.c:43 src/language/stats/regression.q:158
+#: src/ui/gui/regression-dialog.c:43 src/language/stats/regression.q:155
 msgid "R"
 msgstr ""
 
@@ -4435,31 +4446,31 @@ msgstr ""
 msgid "Confidence Interval: %2d %%"
 msgstr ""
 
-#: src/ui/gui/variable-info-dialog.c:76
+#: src/ui/gui/variable-info-dialog.c:77
 #, c-format
 msgid "Label: %s\n"
 msgstr ""
 
-#: src/ui/gui/variable-info-dialog.c:83
+#: src/ui/gui/variable-info-dialog.c:84
 #, c-format
 msgid "Type: %s\n"
 msgstr ""
 
-#: src/ui/gui/variable-info-dialog.c:87
+#: src/ui/gui/variable-info-dialog.c:88
 #, c-format
 msgid "Missing Values: %s\n"
 msgstr ""
 
-#: src/ui/gui/variable-info-dialog.c:92
+#: src/ui/gui/variable-info-dialog.c:93
 #, c-format
 msgid "Measurement Level: %s\n"
 msgstr ""
 
-#: src/ui/gui/variable-info-dialog.c:105
+#: src/ui/gui/variable-info-dialog.c:106
 msgid "Value Labels:\n"
 msgstr ""
 
-#: src/ui/gui/variable-info-dialog.c:115
+#: src/ui/gui/variable-info-dialog.c:116
 #, c-format
 msgid "%s %s\n"
 msgstr ""
@@ -4474,27 +4485,27 @@ msgstr ""
 msgid "Weight cases by %s"
 msgstr ""
 
-#: tests/dissect-sysfile.c:567
+#: tests/dissect-sysfile.c:571
 #, c-format
 msgid "Unrecognized record type 7, subtype %d."
 msgstr "Unrecognised record type 7, subtype %d."
 
-#: tests/dissect-sysfile.c:846
+#: tests/dissect-sysfile.c:850
 #, c-format
 msgid "%s: Error parsing attribute value %s[%d]"
 msgstr ""
 
-#: tests/dissect-sysfile.c:852
+#: tests/dissect-sysfile.c:856
 #, c-format
 msgid "%s: Attribute value %s[%d] is not quoted: %s"
 msgstr ""
 
-#: tests/dissect-sysfile.c:876
+#: tests/dissect-sysfile.c:880
 #, c-format
 msgid "Bad size %zu for extended number of cases."
 msgstr ""
 
-#: tests/dissect-sysfile.c:882
+#: tests/dissect-sysfile.c:886
 #, c-format
 msgid "Bad count %zu for extended number of cases."
 msgstr ""
@@ -4956,14 +4967,10 @@ msgstr ""
 msgid "Omitting pie chart for %s, which has over 50 unique values."
 msgstr ""
 
-#: src/language/stats/glm.q:245
+#: src/language/stats/glm.q:248
 msgid "Multivariate GLM not yet supported"
 msgstr ""
 
-#: src/language/stats/glm.q:355 src/language/stats/regression.q:998
-msgid "No valid data found. This command was skipped."
-msgstr ""
-
 #: src/language/stats/means.q:100
 msgid "Missing required subcommand TABLES."
 msgstr ""
@@ -4972,24 +4979,24 @@ msgstr ""
 msgid "TABLES subcommand may not appear more than once."
 msgstr ""
 
-#: src/language/stats/npar.q:110
+#: src/language/stats/npar.q:111
 msgid "NPAR subcommand not currently implemented."
 msgstr ""
 
-#: src/language/stats/npar.q:254
+#: src/language/stats/npar.q:256
 #, c-format
 msgid ""
 "The specified value of HI (%d) is lower than the specified value of LO (%d)"
 msgstr ""
 
-#: src/language/stats/npar.q:309
+#: src/language/stats/npar.q:311
 #, c-format
 msgid ""
 "%d expected values were given, but the specified range (%d-%d) requires "
 "exactly %d values."
 msgstr ""
 
-#: src/language/stats/npar.q:444 src/language/stats/t-test.q:380
+#: src/language/stats/npar.q:453 src/language/stats/t-test.q:380
 #, c-format
 msgid ""
 "PAIRED was specified but the number of variables preceding WITH (%zu) did "
@@ -5010,21 +5017,21 @@ msgstr ""
 msgid "`%s' is not a variable name"
 msgstr ""
 
-#: src/language/stats/oneway.q:274 src/language/stats/regression.q:298
+#: src/language/stats/oneway.q:274 src/language/stats/regression.q:283
 msgid "Sum of Squares"
 msgstr ""
 
-#: src/language/stats/oneway.q:276 src/language/stats/regression.q:300
+#: src/language/stats/oneway.q:276 src/language/stats/regression.q:285
 msgid "Mean Square"
 msgstr ""
 
-#: src/language/stats/oneway.q:277 src/language/stats/regression.q:301
+#: src/language/stats/oneway.q:277 src/language/stats/regression.q:286
 #: src/language/stats/t-test.q:749
 msgid "F"
 msgstr ""
 
 #: src/language/stats/oneway.q:278 src/language/stats/oneway.q:535
-#: src/language/stats/regression.q:204 src/language/stats/regression.q:302
+#: src/language/stats/regression.q:201 src/language/stats/regression.q:287
 msgid "Significance"
 msgstr ""
 
@@ -5036,7 +5043,7 @@ msgstr ""
 msgid "Within Groups"
 msgstr ""
 
-#: src/language/stats/oneway.q:345 src/language/stats/regression.q:327
+#: src/language/stats/oneway.q:345 src/language/stats/regression.q:312
 msgid "ANOVA"
 msgstr ""
 
@@ -5072,7 +5079,7 @@ msgstr ""
 msgid "Value of Contrast"
 msgstr ""
 
-#: src/language/stats/oneway.q:684 src/language/stats/regression.q:203
+#: src/language/stats/oneway.q:684 src/language/stats/regression.q:200
 #: src/language/stats/t-test.q:751 src/language/stats/t-test.q:922
 #: src/language/stats/t-test.q:1009
 msgid "t"
@@ -5139,63 +5146,67 @@ msgstr ""
 msgid "Too many variables in INTO clause."
 msgstr ""
 
-#: src/language/stats/regression.q:159
+#: src/language/stats/regression.q:156
 msgid "R Square"
 msgstr ""
 
-#: src/language/stats/regression.q:160
+#: src/language/stats/regression.q:157
 msgid "Adjusted R Square"
 msgstr ""
 
-#: src/language/stats/regression.q:161
+#: src/language/stats/regression.q:158
 msgid "Std. Error of the Estimate"
 msgstr ""
 
-#: src/language/stats/regression.q:166
+#: src/language/stats/regression.q:163
 msgid "Model Summary"
 msgstr ""
 
-#: src/language/stats/regression.q:200
+#: src/language/stats/regression.q:197
 msgid "B"
 msgstr ""
 
-#: src/language/stats/regression.q:202
+#: src/language/stats/regression.q:199
 msgid "Beta"
 msgstr ""
 
-#: src/language/stats/regression.q:205
+#: src/language/stats/regression.q:202
 msgid "(Constant)"
 msgstr ""
 
-#: src/language/stats/regression.q:269
+#: src/language/stats/regression.q:254
 msgid "Coefficients"
 msgstr ""
 
-#: src/language/stats/regression.q:304 src/ui/gui/regression.ui:7
+#: src/language/stats/regression.q:289 src/ui/gui/regression.ui:7
 msgid "Regression"
 msgstr ""
 
-#: src/language/stats/regression.q:385
+#: src/language/stats/regression.q:370
 msgid "Model"
 msgstr ""
 
-#: src/language/stats/regression.q:386
+#: src/language/stats/regression.q:371
 msgid "Covariances"
 msgstr ""
 
-#: src/language/stats/regression.q:401
+#: src/language/stats/regression.q:386
 msgid "Coefficient Correlations"
 msgstr ""
 
-#: src/language/stats/regression.q:808
+#: src/language/stats/regression.q:793
 msgid ""
 "The dependent variable is equal to the independent variable.The least "
 "squares line is therefore Y=X.Standard errors and related statistics may be "
 "meaningless."
 msgstr ""
 
-#: src/language/stats/regression.q:900
-msgid "Dependent variable must be numeric."
+#: src/language/stats/regression.q:891
+msgid "REGRESSION requires numeric variables."
+msgstr ""
+
+#: src/language/stats/regression.q:962
+msgid "No valid data found. This command was skipped."
 msgstr ""
 
 #: src/language/stats/reliability.q:421
@@ -5447,6 +5458,26 @@ msgstr ""
 msgid "The step value %ld is less than 1.  The value is being reset to 1."
 msgstr ""
 
+#: src/ui/gui/binomial.ui:57 src/ui/gui/chi-square.ui:57
+msgid "_Test Variable List:"
+msgstr ""
+
+#: src/ui/gui/binomial.ui:126 src/ui/gui/chi-square.ui:126
+msgid "_Get from data"
+msgstr ""
+
+#: src/ui/gui/binomial.ui:143 src/ui/gui/t-test.ui:333
+msgid "_Cut point:"
+msgstr ""
+
+#: src/ui/gui/binomial.ui:178
+msgid "Define Dichotomy"
+msgstr ""
+
+#: src/ui/gui/binomial.ui:197
+msgid "Test _Proportion:"
+msgstr ""
+
 #: src/ui/gui/correlation.ui:7
 msgid "Bivariate Correlations"
 msgstr ""
@@ -5549,6 +5580,38 @@ msgstr ""
 msgid "Statistics"
 msgstr ""
 
+#: src/ui/gui/chi-square.ui:13
+msgid "Chi-Square Test"
+msgstr ""
+
+#: src/ui/gui/chi-square.ui:140
+msgid "Use _specified range"
+msgstr ""
+
+#: src/ui/gui/chi-square.ui:162
+msgid "_Lower:"
+msgstr ""
+
+#: src/ui/gui/chi-square.ui:170
+msgid "_Upper:"
+msgstr ""
+
+#: src/ui/gui/chi-square.ui:214
+msgid "Expected Range:"
+msgstr ""
+
+#: src/ui/gui/chi-square.ui:240
+msgid "All categor_ies equal"
+msgstr ""
+
+#: src/ui/gui/chi-square.ui:257
+msgid "_Values"
+msgstr ""
+
+#: src/ui/gui/chi-square.ui:301
+msgid "Expected Values:"
+msgstr ""
+
 #: src/ui/gui/descriptives.ui:130 src/ui/gui/frequencies.ui:140
 msgid "Statistics:"
 msgstr ""
@@ -5624,58 +5687,90 @@ msgid "Factor Analysis"
 msgstr ""
 
 #: src/ui/gui/factor.ui:47
-msgid "Descriptives..."
+msgid "_Descriptives..."
 msgstr ""
 
 #: src/ui/gui/factor.ui:60
-msgid "Extraction..."
+msgid "_Extraction..."
+msgstr ""
+
+#: src/ui/gui/factor.ui:74
+msgid "_Rotations..."
 msgstr ""
 
-#: src/ui/gui/factor.ui:180
+#: src/ui/gui/factor.ui:192
 msgid "Factor Analysis: Extraction"
 msgstr ""
 
-#: src/ui/gui/factor.ui:204
+#: src/ui/gui/factor.ui:216
 msgid "Method: "
 msgstr ""
 
-#: src/ui/gui/factor.ui:254
+#: src/ui/gui/factor.ui:266
 msgid "Correlation matrix"
 msgstr ""
 
-#: src/ui/gui/factor.ui:268
+#: src/ui/gui/factor.ui:280
 msgid "Covariance matrix"
 msgstr ""
 
-#: src/ui/gui/factor.ui:288
+#: src/ui/gui/factor.ui:300
 #, fuzzy
 msgid "Analyse"
 msgstr "_Analyse"
 
-#: src/ui/gui/factor.ui:312
+#: src/ui/gui/factor.ui:324
 msgid "Unrotatated factor solution"
 msgstr ""
 
-#: src/ui/gui/factor.ui:326
+#: src/ui/gui/factor.ui:338
 msgid "Scree plot"
 msgstr ""
 
-#: src/ui/gui/factor.ui:345 src/ui/gui/roc.ui:286
+#: src/ui/gui/factor.ui:357 src/ui/gui/roc.ui:286
 msgid "Display"
 msgstr ""
 
-#: src/ui/gui/factor.ui:418
+#: src/ui/gui/factor.ui:430
 msgid "Number of factors:"
 msgstr ""
 
-#: src/ui/gui/factor.ui:448
+#: src/ui/gui/factor.ui:460
 msgid "Extract"
 msgstr ""
 
-#: src/ui/gui/factor.ui:463
+#: src/ui/gui/factor.ui:475 src/ui/gui/factor.ui:665
 msgid "Maximum iterations for convergence:"
 msgstr ""
 
+#: src/ui/gui/factor.ui:538
+msgid "Factor Analysis: Rotation"
+msgstr ""
+
+#: src/ui/gui/factor.ui:571
+msgid "_None"
+msgstr ""
+
+#: src/ui/gui/factor.ui:582
+msgid "_Varimax"
+msgstr ""
+
+#: src/ui/gui/factor.ui:598
+msgid "_Quartimax"
+msgstr ""
+
+#: src/ui/gui/factor.ui:614
+msgid "_Equimax"
+msgstr ""
+
+#: src/ui/gui/factor.ui:637
+msgid "Method"
+msgstr ""
+
+#: src/ui/gui/factor.ui:648
+msgid "_Display rotated solution"
+msgstr ""
+
 #: src/ui/gui/find.ui:8
 msgid "Find Case"
 msgstr ""
@@ -6347,10 +6442,6 @@ msgstr ""
 msgid "Group_1 value:"
 msgstr ""
 
-#: src/ui/gui/t-test.ui:333
-msgid "_Cut point:"
-msgstr ""
-
 #: src/ui/gui/t-test.ui:365
 msgid "_Use specified values:"
 msgstr ""
@@ -6584,19 +6675,19 @@ msgstr ""
 msgid "Sort Descending"
 msgstr ""
 
-#: src/ui/gui/data-editor.ui:26 src/ui/gui/output-viewer.glade:21
-#: src/ui/gui/syntax-editor.glade:14
+#: src/ui/gui/data-editor.ui:26 src/ui/gui/output-viewer.ui:9
+#: src/ui/gui/syntax-editor.ui:10
 msgid "_File"
 msgstr ""
 
-#: src/ui/gui/data-editor.ui:38 src/ui/gui/syntax-editor.glade:32
-#: src/ui/gui/syntax-editor.glade:62
+#: src/ui/gui/data-editor.ui:38 src/ui/gui/syntax-editor.ui:22
+#: src/ui/gui/syntax-editor.ui:40
 msgid "_Syntax"
 msgstr ""
 
 #: src/ui/gui/data-editor.ui:44 src/ui/gui/data-editor.ui:217
-#: src/ui/gui/data-editor.ui:229 src/ui/gui/syntax-editor.glade:41
-#: src/ui/gui/syntax-editor.glade:71
+#: src/ui/gui/data-editor.ui:229 src/ui/gui/syntax-editor.ui:28
+#: src/ui/gui/syntax-editor.ui:46
 msgid "_Data"
 msgstr ""
 
@@ -6624,8 +6715,8 @@ msgstr ""
 msgid "Recently Used _Files"
 msgstr ""
 
-#: src/ui/gui/data-editor.ui:111 src/ui/gui/output-viewer.glade:43
-#: src/ui/gui/syntax-editor.glade:118
+#: src/ui/gui/data-editor.ui:111 src/ui/gui/output-viewer.ui:28
+#: src/ui/gui/syntax-editor.ui:70
 msgid "_Edit"
 msgstr ""
 
@@ -6841,13 +6932,13 @@ msgstr ""
 msgid "Data File _Comments"
 msgstr ""
 
-#: src/ui/gui/data-editor.ui:444 src/ui/gui/output-viewer.glade:66
-#: src/ui/gui/syntax-editor.glade:209
+#: src/ui/gui/data-editor.ui:444 src/ui/gui/output-viewer.ui:40
+#: src/ui/gui/syntax-editor.ui:131
 msgid "_Windows"
 msgstr ""
 
-#: src/ui/gui/data-editor.ui:450 src/ui/gui/output-viewer.glade:76
-#: src/ui/gui/syntax-editor.glade:218
+#: src/ui/gui/data-editor.ui:450 src/ui/gui/output-viewer.ui:46
+#: src/ui/gui/syntax-editor.ui:137
 msgid "_Minimize All Windows"
 msgstr "_Minimise All Windows"
 
@@ -6855,65 +6946,51 @@ msgstr "_Minimise All Windows"
 msgid "_Split"
 msgstr ""
 
-#: src/ui/gui/data-editor.ui:462 src/ui/gui/output-viewer.glade:87
-#: src/ui/gui/syntax-editor.glade:229
-msgid "_Help"
-msgstr ""
-
-#: src/ui/gui/data-editor.ui:468 src/ui/gui/output-viewer.glade:94
-#: src/ui/gui/syntax-editor.glade:237
-msgid "_Reference Manual"
-msgstr ""
-
-#: src/ui/gui/data-editor.ui:652
+#: src/ui/gui/data-editor.ui:630
 msgid "Information Area"
 msgstr ""
 
-#: src/ui/gui/data-editor.ui:674
+#: src/ui/gui/data-editor.ui:652
 msgid "Processor Area"
 msgstr ""
 
-#: src/ui/gui/data-editor.ui:699
+#: src/ui/gui/data-editor.ui:677
 msgid "Case Counter Area"
 msgstr ""
 
-#: src/ui/gui/data-editor.ui:724
+#: src/ui/gui/data-editor.ui:702
 msgid "Filter Use Status Area"
 msgstr ""
 
-#: src/ui/gui/data-editor.ui:750
+#: src/ui/gui/data-editor.ui:728
 msgid "Weight Status Area"
 msgstr ""
 
-#: src/ui/gui/data-editor.ui:776
+#: src/ui/gui/data-editor.ui:754
 msgid "Split File Status Area"
 msgstr ""
 
-#: src/ui/gui/output-viewer.glade:31
+#: src/ui/gui/output-viewer.ui:22
 msgid "_Export"
 msgstr ""
 
-#: src/ui/gui/output-viewer.glade:101 src/ui/gui/syntax-editor.glade:244
-msgid "_About"
-msgstr ""
-
-#: src/ui/gui/syntax-editor.glade:163
+#: src/ui/gui/syntax-editor.ui:100
 msgid "_Run"
 msgstr ""
 
-#: src/ui/gui/syntax-editor.glade:172
+#: src/ui/gui/syntax-editor.ui:106
 msgid "All"
 msgstr ""
 
-#: src/ui/gui/syntax-editor.glade:180
+#: src/ui/gui/syntax-editor.ui:112
 msgid "Selection"
 msgstr ""
 
-#: src/ui/gui/syntax-editor.glade:188
+#: src/ui/gui/syntax-editor.ui:118
 msgid "Current Line"
 msgstr ""
 
-#: src/ui/gui/syntax-editor.glade:197
+#: src/ui/gui/syntax-editor.ui:125
 msgid "To End"
 msgstr ""
 
index 49a9be7c62e2ec37e15006231ec2ac5669ddac4a..b00f742dd4d9bd071b513b21503abf97d391c145 100644 (file)
--- a/po/es.po
+++ b/po/es.po
@@ -10,7 +10,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pspp-0.7.2-pre1\n"
 "Report-Msgid-Bugs-To: pspp-dev@gnu.org\n"
-"POT-Creation-Date: 2010-05-09 21:32+0200\n"
+"POT-Creation-Date: 2010-05-21 12:02+0200\n"
 "PO-Revision-Date: 2010-02-03 20:19+0100\n"
 "Last-Translator: Francesc Josep Miguel Quesada <Miguel.Quesada@uab.cat>\n"
 "Language-Team: Spanish <es@li.org>\n"
@@ -250,7 +250,7 @@ msgstr "sistema"
 msgid "scratch"
 msgstr "cero"
 
-#: src/data/dictionary.c:981
+#: src/data/dictionary.c:980
 msgid ""
 "At least one case in the data file had a weight value that was user-missing, "
 "system-missing, zero, or negative.  These case(s) were ignored."
@@ -258,7 +258,7 @@ msgstr ""
 "Al menos un caso del archivo de datos tenía un valor de ponderación perdido "
 "de usuario, de sistema, cero o negativo. Estos caso(s) fueron ignorado(s)."
 
-#: src/data/dictionary.c:1284
+#: src/data/dictionary.c:1283
 #, c-format
 msgid "Truncating document line to %d bytes."
 msgstr "Linea de documento truncada a  %d bytes."
@@ -355,20 +355,20 @@ msgstr[1] ""
 msgid "%s variables are not compatible with %s format %s."
 msgstr "Las variables %s no son compatibles con %s formato %s."
 
-#: src/data/format.c:327 src/data/sys-file-reader.c:744
+#: src/data/format.c:327 src/data/sys-file-reader.c:752
 #: src/ui/gui/psppire-var-store.c:628 src/ui/gui/psppire.ui:1960
 #: src/ui/gui/var-sheet-dialogs.ui:139
 msgid "String"
 msgstr "Cadena"
 
-#: src/data/format.c:327 src/data/sys-file-reader.c:744
+#: src/data/format.c:327 src/data/sys-file-reader.c:752
 #: src/ui/gui/psppire-var-store.c:621 src/ui/gui/psppire.ui:2040
 #: src/ui/gui/var-sheet-dialogs.ui:27
 msgid "Numeric"
 msgstr "Numérico"
 
-#: src/data/format.c:328 src/data/sys-file-reader.c:1464
-#: src/data/sys-file-reader.c:1466 src/language/xforms/recode.c:493
+#: src/data/format.c:328 src/data/sys-file-reader.c:1472
+#: src/data/sys-file-reader.c:1474 src/language/xforms/recode.c:493
 #: src/language/xforms/recode.c:494 src/language/xforms/recode.c:506
 #: src/language/xforms/recode.c:507
 #: src/language/dictionary/apply-dictionary.c:78
@@ -376,8 +376,8 @@ msgstr "Numérico"
 msgid "numeric"
 msgstr "numérico"
 
-#: src/data/format.c:328 src/data/sys-file-reader.c:1464
-#: src/data/sys-file-reader.c:1466 src/language/xforms/recode.c:493
+#: src/data/format.c:328 src/data/sys-file-reader.c:1472
+#: src/data/sys-file-reader.c:1474 src/language/xforms/recode.c:493
 #: src/language/xforms/recode.c:494 src/language/xforms/recode.c:506
 #: src/language/xforms/recode.c:507
 #: src/language/dictionary/apply-dictionary.c:78
@@ -587,7 +587,7 @@ msgstr "Ancho de variable inválida %d."
 msgid "Invalid variable name `%s' in position %d."
 msgstr "Nombre de la variable inválido `%s' en la posición %d."
 
-#: src/data/por-file-reader.c:685 src/data/sys-file-reader.c:602
+#: src/data/por-file-reader.c:685 src/data/sys-file-reader.c:606
 #, c-format
 msgid "Bad width %d for variable %s."
 msgstr "Ancho %d incorrecto para la variable %s."
@@ -709,7 +709,7 @@ msgstr ""
 msgid "Variable suffix too large."
 msgstr "Sufijo de la variable demasiado grande."
 
-#: src/data/sys-file-reader.c:222
+#: src/data/sys-file-reader.c:226
 #, c-format
 msgid "Recoded variable name duplicates an existing `%s' within system file."
 msgstr ""
@@ -718,42 +718,42 @@ msgstr ""
 
 #. TRANSLATORS: this fragment will be interpolated into
 #. messages in fh_lock() that identify types of files.
-#: src/data/sys-file-reader.c:286 src/data/sys-file-writer.c:207
+#: src/data/sys-file-reader.c:290 src/data/sys-file-writer.c:207
 msgid "system file"
 msgstr "archivo de sistema"
 
-#: src/data/sys-file-reader.c:293
+#: src/data/sys-file-reader.c:297
 #, c-format
 msgid "Error opening \"%s\" for reading as a system file: %s."
 msgstr "Error en abrir \"%s\" para la lectura como archivo de sistema: %s."
 
-#: src/data/sys-file-reader.c:332 tests/dissect-sysfile.c:154
+#: src/data/sys-file-reader.c:336 tests/dissect-sysfile.c:154
 msgid "Misplaced type 4 record."
 msgstr "Registro de tipo 4 fuera de lugar."
 
-#: src/data/sys-file-reader.c:343 tests/dissect-sysfile.c:165
+#: src/data/sys-file-reader.c:347 tests/dissect-sysfile.c:165
 #, c-format
 msgid "Unrecognized record type %d."
 msgstr "Tipo de registro %d no reconocido."
 
-#: src/data/sys-file-reader.c:384
+#: src/data/sys-file-reader.c:388
 #, c-format
 msgid "File header claims %d variable positions but %d were read from file."
 msgstr ""
 "Cabecera del archivo requiere %d posiciones de variable, per se han leído %d "
 "desde el archivo."
 
-#: src/data/sys-file-reader.c:424
+#: src/data/sys-file-reader.c:428
 #, c-format
 msgid "Error closing system file \"%s\": %s."
 msgstr "Error en cerrar el archivo de sistema \"%s\": %s."
 
-#: src/data/sys-file-reader.c:489 src/data/sys-file-reader.c:499
+#: src/data/sys-file-reader.c:493 src/data/sys-file-reader.c:503
 #: tests/dissect-sysfile.c:202 tests/dissect-sysfile.c:212
 msgid "This is not an SPSS system file."
 msgstr "Esto no es un archivo de sistema de SPSS."
 
-#: src/data/sys-file-reader.c:521 tests/dissect-sysfile.c:227
+#: src/data/sys-file-reader.c:525 tests/dissect-sysfile.c:227
 msgid ""
 "Compression bias is not the usual value of 100, or system file uses "
 "unrecognized floating-point format."
@@ -761,78 +761,73 @@ msgstr ""
 "El sesgo de compresión no es el valor habitual de 100, o el archivo de "
 "sistema utiliza un formato de punto flotante no reconocido."
 
-#: src/data/sys-file-reader.c:598
+#: src/data/sys-file-reader.c:602
 #, c-format
 msgid "Invalid variable name `%s'."
 msgstr "Nombre de variable '%s' no válido."
 
-#: src/data/sys-file-reader.c:606
+#: src/data/sys-file-reader.c:610
 #, c-format
 msgid "Duplicate variable name `%s' within system file."
 msgstr "Nombre de variable '%s' duplicado dentro del archivo de sistema."
 
-#: src/data/sys-file-reader.c:614 tests/dissect-sysfile.c:356
+#: src/data/sys-file-reader.c:618 tests/dissect-sysfile.c:356
 msgid "Variable label indicator field is not 0 or 1."
 msgstr "Campo indicador de etiqueta de variable no es 0 o 1."
 
-#: src/data/sys-file-reader.c:622 tests/dissect-sysfile.c:365
-#, c-format
-msgid "Variable %s has label of invalid length %zu."
-msgstr "Variable %s tiene una etiqueta de longitud no válida %zu."
-
-#: src/data/sys-file-reader.c:641 tests/dissect-sysfile.c:383
+#: src/data/sys-file-reader.c:649 tests/dissect-sysfile.c:387
 msgid "Numeric missing value indicator field is not -3, -2, 0, 1, 2, or 3."
 msgstr ""
 "Campo de indicador de valores perdidos numéricos no es -3, -2, 0, 1, 2 o 3."
 
-#: src/data/sys-file-reader.c:659 tests/dissect-sysfile.c:398
+#: src/data/sys-file-reader.c:667 tests/dissect-sysfile.c:402
 msgid "String missing value indicator field is not 0, 1, 2, or 3."
 msgstr "Campo de indicador de valores perdidos de cadena no es 0, 1, 2 o 3."
 
-#: src/data/sys-file-reader.c:691
+#: src/data/sys-file-reader.c:699
 msgid "Missing string continuation record."
 msgstr "Falta de registro de continuación de cadena."
 
-#: src/data/sys-file-reader.c:725
+#: src/data/sys-file-reader.c:733
 #, c-format
 msgid "Unknown variable format %<PRIu8>."
 msgstr "Formato de variable %<PRIu8> desconocido."
 
-#: src/data/sys-file-reader.c:743
+#: src/data/sys-file-reader.c:751
 #, c-format
 msgid "%s variable %s has invalid %s format %s."
 msgstr "%s variable %s con formato %s no válido %s."
 
-#: src/data/sys-file-reader.c:746
+#: src/data/sys-file-reader.c:754
 msgid "print"
 msgstr "imprimir"
 
-#: src/data/sys-file-reader.c:746
+#: src/data/sys-file-reader.c:754
 msgid "write"
 msgstr "escribir"
 
-#: src/data/sys-file-reader.c:750
+#: src/data/sys-file-reader.c:758
 msgid "Suppressing further invalid format warnings."
 msgstr "Se desactivan las alertas posteriores de formato no válido."
 
-#: src/data/sys-file-reader.c:768
+#: src/data/sys-file-reader.c:776
 msgid "Weighting variable must be numeric."
 msgstr "Variable de ponderación tiene que ser numérica."
 
-#: src/data/sys-file-reader.c:782
+#: src/data/sys-file-reader.c:790
 msgid "Multiple type 6 (document) records."
 msgstr "Múltiples registros de tipo 6 (document)."
 
-#: src/data/sys-file-reader.c:786
+#: src/data/sys-file-reader.c:794
 #, c-format
 msgid "Number of document lines (%d) must be greater than 0."
 msgstr "Número de líneas de documento (%d) tiene que ser mayor que 0."
 
-#: src/data/sys-file-reader.c:794
+#: src/data/sys-file-reader.c:802
 msgid "Document line contains null byte."
 msgstr "Una línea del documento contiene un byte nulo."
 
-#: src/data/sys-file-reader.c:885
+#: src/data/sys-file-reader.c:893
 #, c-format
 msgid ""
 "Unrecognized record type 7, subtype %d.  Please send a copy of this file, "
@@ -841,14 +836,14 @@ msgstr ""
 "Registro de tipo 7, subtipo %d , no reconocido. Por favor envíe una copia de "
 "este archivo, así como de la sintaxis que lo creó en %s"
 
-#: src/data/sys-file-reader.c:912 tests/dissect-sysfile.c:590
+#: src/data/sys-file-reader.c:920 tests/dissect-sysfile.c:594
 #, c-format
 msgid "Bad size (%zu) or count (%zu) field on record type 7, subtype 3."
 msgstr ""
 "Campo de longitud (%zu) o cantidad (%zu) inválidos en el registro tipo 7, "
 "subtipo 3."
 
-#: src/data/sys-file-reader.c:932
+#: src/data/sys-file-reader.c:940
 #, c-format
 msgid ""
 "Floating-point representation indicated by system file (%d) differs from "
@@ -857,17 +852,17 @@ msgstr ""
 "Representación del punto flotante indicado por el archivo de sistema (%d) "
 "difiere de lo esperado (%d)."
 
-#: src/data/sys-file-reader.c:945 src/language/dictionary/sys-file-info.c:110
+#: src/data/sys-file-reader.c:953 src/language/dictionary/sys-file-info.c:110
 #, fuzzy
 msgid "Little Endian"
 msgstr "Little Endian."
 
-#: src/data/sys-file-reader.c:945 src/language/dictionary/sys-file-info.c:109
+#: src/data/sys-file-reader.c:953 src/language/dictionary/sys-file-info.c:109
 #, fuzzy
 msgid "Big Endian"
 msgstr "Big Endian."
 
-#: src/data/sys-file-reader.c:946
+#: src/data/sys-file-reader.c:954
 #, c-format
 msgid ""
 "Integer format indicated by system file (%s) differs from expected (%s)."
@@ -875,72 +870,72 @@ msgstr ""
 "Formato entero indicado por el archivo de sistema  (%s) difiere de lo "
 "esperado (%s)."
 
-#: src/data/sys-file-reader.c:1003 tests/dissect-sysfile.c:621
+#: src/data/sys-file-reader.c:1011 tests/dissect-sysfile.c:625
 #, c-format
 msgid "Bad size (%zu) or count (%zu) on extension 4."
 msgstr "Longitud (%zu) o cantidad (%zu) de la extensión 4 no válida."
 
-#: src/data/sys-file-reader.c:1007 src/data/sys-file-reader.c:1011
-#: src/data/sys-file-reader.c:1015 tests/dissect-sysfile.c:626
-#: tests/dissect-sysfile.c:631 tests/dissect-sysfile.c:636
+#: src/data/sys-file-reader.c:1015 src/data/sys-file-reader.c:1019
+#: src/data/sys-file-reader.c:1023 tests/dissect-sysfile.c:630
+#: tests/dissect-sysfile.c:635 tests/dissect-sysfile.c:640
 #, c-format
 msgid "File specifies unexpected value %g as %s."
 msgstr "El archivo especifica un valor inesperado %g como %s."
 
-#: src/data/sys-file-reader.c:1048
+#: src/data/sys-file-reader.c:1056
 #, c-format
 msgid "Missing space following 'C' at offset %zu in MRSETS record"
 msgstr ""
 
-#: src/data/sys-file-reader.c:1066 tests/dissect-sysfile.c:687
+#: src/data/sys-file-reader.c:1074 tests/dissect-sysfile.c:691
 #, c-format
 msgid "Missing space following 'E' at offset %zu in MRSETS record"
 msgstr ""
 
-#: src/data/sys-file-reader.c:1075 tests/dissect-sysfile.c:696
+#: src/data/sys-file-reader.c:1083 tests/dissect-sysfile.c:700
 #, c-format
 msgid ""
 "Unexpected label source value \"%s\" following 'E' at offset %zu in MRSETS "
 "record"
 msgstr ""
 
-#: src/data/sys-file-reader.c:1081
+#: src/data/sys-file-reader.c:1089
 #, c-format
 msgid "Missing 'C', 'D', or 'E' at offset %zu in MRSETS record."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1110
+#: src/data/sys-file-reader.c:1118
 #, c-format
 msgid "Missing new-line parsing variable names at offset %zu in MRSETS record."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1121
+#: src/data/sys-file-reader.c:1129
 #, fuzzy, c-format
 msgid "Duplicate variable name %s at offset %zu in MRSETS record."
 msgstr "Nombre de la variable %s duplicado en la posición %d."
 
-#: src/data/sys-file-reader.c:1134
+#: src/data/sys-file-reader.c:1142
 #, fuzzy, c-format
 msgid "MRSET %s contains both string and numeric variables."
 msgstr ""
 "Ignorando el registro del valor de cadena larga para la variable numérica %s."
 
-#: src/data/sys-file-reader.c:1149
+#: src/data/sys-file-reader.c:1157
 #, c-format
 msgid "MRSET %s has only %zu variables."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1186 tests/dissect-sysfile.c:754
+#: src/data/sys-file-reader.c:1194 tests/dissect-sysfile.c:758
 #, c-format
 msgid "Bad size %zu on extension 11."
 msgstr "Longitud no válida %zu en la extensión 11."
 
-#: src/data/sys-file-reader.c:1198 tests/dissect-sysfile.c:766
+#: src/data/sys-file-reader.c:1206 tests/dissect-sysfile.c:770
 #, c-format
 msgid "Extension 11 has bad count %zu (for %zu variables)."
 msgstr "Extensión 11 tiene un recuento inválido %zu (para %zu variables)."
 
-#: src/data/sys-file-reader.c:1219
+#: src/data/sys-file-reader.c:1227
 #, c-format
 msgid ""
 "Invalid variable display parameters for variable %zu (%s).  Default "
@@ -949,27 +944,27 @@ msgstr ""
 "Parámetros de visualización de variable no válidos para la variable %zu (%"
 "s). Sustitución de parámetros por defecto."
 
-#: src/data/sys-file-reader.c:1263
+#: src/data/sys-file-reader.c:1271
 #, c-format
 msgid "Long variable mapping from %s to invalid variable name `%s'."
 msgstr ""
 "Identificación de variable larga desde %s hacia un nombre de variable "
 "inválido '%s'."
 
-#: src/data/sys-file-reader.c:1273
+#: src/data/sys-file-reader.c:1281
 #, c-format
 msgid "Duplicate long variable name `%s' within system file."
 msgstr ""
 "Nombre de la variable larga '%s' duplicada dentro del archivo de sistema."
 
-#: src/data/sys-file-reader.c:1326
+#: src/data/sys-file-reader.c:1334
 #, c-format
 msgid "%s listed as string of invalid length %s in very length string record."
 msgstr ""
 "%s figura como cadena de longitud no válida %s en un registro de cadena muy "
 "largo."
 
-#: src/data/sys-file-reader.c:1336
+#: src/data/sys-file-reader.c:1344
 #, c-format
 msgid ""
 "%s listed in very long string record with width %s, which requires only one "
@@ -978,12 +973,12 @@ msgstr ""
 "%s figura en el registro de cadena muy larga con longitud %s, que requiere "
 "solo un segmento."
 
-#: src/data/sys-file-reader.c:1342
+#: src/data/sys-file-reader.c:1350
 #, c-format
 msgid "Very long string %s overflows dictionary."
 msgstr "Cadena muy larga %s desborda el diccionario."
 
-#: src/data/sys-file-reader.c:1356
+#: src/data/sys-file-reader.c:1364
 #, c-format
 msgid ""
 "Very long string with width %ld has segment %d of width %d (expected %d)"
@@ -991,12 +986,12 @@ msgstr ""
 "Cadena muy larga con una longitud de %ld tiene un segmento %d de longitud %d "
 "(se espera %d)"
 
-#: src/data/sys-file-reader.c:1402
+#: src/data/sys-file-reader.c:1410
 #, c-format
 msgid "Invalid number of labels: %d.  Ignoring labels."
 msgstr "Número de etiquetas inválido: %d. Ignorando etiquetas."
 
-#: src/data/sys-file-reader.c:1433 tests/dissect-sysfile.c:464
+#: src/data/sys-file-reader.c:1441 tests/dissect-sysfile.c:468
 msgid ""
 "Variable index record (type 4) does not immediately follow value label "
 "record (type 3) as it should."
@@ -1004,7 +999,7 @@ msgstr ""
 "Registro de índice de variable (tipo 4) no está seguido inmediatament, como "
 "debería, por el registro de etiquetas de valores (tipo 3) ."
 
-#: src/data/sys-file-reader.c:1440
+#: src/data/sys-file-reader.c:1448
 #, c-format
 msgid ""
 "Number of variables associated with a value label (%d) is not between 1 and "
@@ -1013,7 +1008,7 @@ msgstr ""
 "Número de variables asociadas con una etiqueta de valores (%d) no está entre "
 "1 y el número de variables (%zu)."
 
-#: src/data/sys-file-reader.c:1451
+#: src/data/sys-file-reader.c:1459
 #, c-format
 msgid ""
 "Value labels may not be added to long string variables (e.g. %s) using "
@@ -1022,7 +1017,7 @@ msgstr ""
 "No se pueden añadir etiquetas de valor a las variables de cadena larga (e.g. "
 "%s) utilizando los tipos de registro 3 y 4."
 
-#: src/data/sys-file-reader.c:1460
+#: src/data/sys-file-reader.c:1468
 #, c-format
 msgid ""
 "Variables associated with value label are not all of identical type.  "
@@ -1031,27 +1026,27 @@ msgstr ""
 "Las variables asociadas con etiqueta de valores no son todas del mismo "
 "tipo.  La variable %s es %s, pero la variable %s es %s."
 
-#: src/data/sys-file-reader.c:1494
+#: src/data/sys-file-reader.c:1502
 #, c-format
 msgid "Duplicate value label for %g on %s."
 msgstr "Etiqueta de valor duplicad para %g en %s."
 
-#: src/data/sys-file-reader.c:1497 src/data/sys-file-reader.c:1678
+#: src/data/sys-file-reader.c:1505 src/data/sys-file-reader.c:1686
 #, c-format
 msgid "Duplicate value label for \"%.*s\" on %s."
 msgstr "Etiqueta de valor duplicada para \"%.*s\" en %s."
 
-#: src/data/sys-file-reader.c:1535
+#: src/data/sys-file-reader.c:1543
 #, c-format
 msgid "Error parsing attribute value %s[%d]"
 msgstr "Error al analizar el valor del atributo %s[%d]"
 
-#: src/data/sys-file-reader.c:1549
+#: src/data/sys-file-reader.c:1557
 #, c-format
 msgid "Attribute value %s[%d] is not quoted: %s"
 msgstr "El valor del atributo %s[%d] no está entre comillas: %s"
 
-#: src/data/sys-file-reader.c:1612 tests/dissect-sysfile.c:932
+#: src/data/sys-file-reader.c:1620 tests/dissect-sysfile.c:936
 #, c-format
 msgid ""
 "Variable name length in long string value label record (%d) exceeds %d-byte "
@@ -1060,20 +1055,20 @@ msgstr ""
 "La longitud del nombre de la variable en el registro de la etiqueta del "
 "valor de cadena larga (%d) supera el límite %d-byte."
 
-#: src/data/sys-file-reader.c:1622
+#: src/data/sys-file-reader.c:1630
 #, c-format
 msgid "Ignoring long string value record for unknown variable %s."
 msgstr ""
 "Ignorando el registro del valor de cadena larga para la variable desconocida "
 "%s."
 
-#: src/data/sys-file-reader.c:1629
+#: src/data/sys-file-reader.c:1637
 #, c-format
 msgid "Ignoring long string value record for numeric variable %s."
 msgstr ""
 "Ignorando el registro del valor de cadena larga para la variable numérica %s."
 
-#: src/data/sys-file-reader.c:1636
+#: src/data/sys-file-reader.c:1644
 #, c-format
 msgid ""
 "Ignoring long string value record for variable %s because the record's width "
@@ -1082,7 +1077,7 @@ msgstr ""
 "Ignorando el registro del valor de cadena larga %s ya que el ancho del "
 "registro (%d) no coincide con el ancho de la variable (%d)"
 
-#: src/data/sys-file-reader.c:1658
+#: src/data/sys-file-reader.c:1666
 #, c-format
 msgid ""
 "Ignoring long string value %zu for variable %s, with width %d, that has bad "
@@ -1091,75 +1086,75 @@ msgstr ""
 "Ignorando el valor de cadena larga %zu para la variable %s, de ancho %d, que "
 "tiene un ancho de valor incorrecto %zu."
 
-#: src/data/sys-file-reader.c:1773
+#: src/data/sys-file-reader.c:1781
 msgid "File ends in partial case."
 msgstr "El archivo acaba en un caso parcial."
 
-#: src/data/sys-file-reader.c:1781
+#: src/data/sys-file-reader.c:1789
 #, c-format
 msgid "Error reading case from file %s."
 msgstr "Error leyendo un caso del archivo %s."
 
-#: src/data/sys-file-reader.c:1882
+#: src/data/sys-file-reader.c:1890
 msgid ""
 "Possible compressed data corruption: compressed spaces appear in numeric "
 "field."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1935
+#: src/data/sys-file-reader.c:1943
 #, c-format
 msgid ""
 "Possible compressed data corruption: string contains compressed integer "
 "(opcode %d)"
 msgstr ""
 
-#: src/data/sys-file-reader.c:2027
+#: src/data/sys-file-reader.c:2035
 #, c-format
 msgid "Variable index %d not in valid range 1...%d."
 msgstr "Índice de la variable %d no en el intervalo válido de 1...%d."
 
-#: src/data/sys-file-reader.c:2032
+#: src/data/sys-file-reader.c:2040
 #, c-format
 msgid "Variable index %d refers to long string continuation."
 msgstr ""
 "Índice de la variable %d se refiere a una continuación de cadena larga."
 
-#: src/data/sys-file-reader.c:2100
+#: src/data/sys-file-reader.c:2108
 #, c-format
 msgid "Suppressed %d additional related warnings."
 msgstr "Suprimidas %d advertencias adicionales."
 
-#: src/data/sys-file-reader.c:2141
+#: src/data/sys-file-reader.c:2153 src/data/sys-file-reader.c:2170
 #, fuzzy, c-format
 msgid "Dictionary record refers to unknown variable %s."
 msgstr "Mapa de la variable se refiere a una variable desconocida %s."
 
-#: src/data/sys-file-reader.c:2202
+#: src/data/sys-file-reader.c:2231
 #, c-format
 msgid "Expecting digit at offset %zu in MRSETS record."
 msgstr ""
 
-#: src/data/sys-file-reader.c:2209
+#: src/data/sys-file-reader.c:2238
 #, c-format
 msgid "Expecting space at offset %zu in MRSETS record."
 msgstr ""
 
-#: src/data/sys-file-reader.c:2216
+#: src/data/sys-file-reader.c:2245
 #, c-format
 msgid "%zu-byte string starting at offset %zu exceeds record length %zu."
 msgstr ""
 
-#: src/data/sys-file-reader.c:2226
+#: src/data/sys-file-reader.c:2255
 #, c-format
 msgid "Expecting space at offset %zu following %zu-byte string."
 msgstr ""
 
-#: src/data/sys-file-reader.c:2318 tests/dissect-sysfile.c:1337
+#: src/data/sys-file-reader.c:2347 tests/dissect-sysfile.c:1341
 #, c-format
 msgid "System error: %s."
 msgstr "Error de sistema: %s."
 
-#: src/data/sys-file-reader.c:2320 tests/dissect-sysfile.c:1339
+#: src/data/sys-file-reader.c:2349 tests/dissect-sysfile.c:1343
 msgid "Unexpected end of file."
 msgstr "Final de archivo inesperado."
 
@@ -1179,7 +1174,7 @@ msgstr "Error al abrir \"%s\" para grabar com archivo de sistema: %s."
 msgid "An I/O error occurred writing system file \"%s\"."
 msgstr "Error de E/S al guardar el archivo de sistema \"%s\"."
 
-#: src/data/variable.c:215
+#: src/data/variable.c:206
 #, c-format
 msgid ""
 "Character `%c' (in %s) may not appear as the first character in a variable "
@@ -1188,21 +1183,21 @@ msgstr ""
 "Carácter '%c' (en %s) no puede aparecer como el primer carácter en un nombre "
 "de variable."
 
-#: src/data/variable.c:227
+#: src/data/variable.c:218
 #, c-format
 msgid "Character `%c' (in %s) may not appear in a variable name."
 msgstr "Carácter '%c' (en %s) no puede aparecer en un nombre de variable."
 
-#: src/data/variable.c:253
+#: src/data/variable.c:244
 msgid "Variable name cannot be empty string."
 msgstr "El nombre de la variable no puede ser una cadena vacía."
 
-#: src/data/variable.c:259
+#: src/data/variable.c:250
 #, c-format
 msgid "Variable name %s exceeds %d-character limit."
 msgstr "El nombre de la variable %s supera el límite de %d caracteres."
 
-#: src/data/variable.c:267
+#: src/data/variable.c:258
 #, c-format
 msgid "`%s' may not be used as a variable name because it is a reserved word."
 msgstr ""
@@ -2184,7 +2179,7 @@ msgid "IBM 390 Hex Long."
 msgstr "IBM 390 Hex Long."
 
 #: src/language/dictionary/sys-file-info.c:120 src/ui/gui/descriptives.ui:85
-#: src/ui/gui/factor.ui:161 src/ui/gui/recode.ui:960
+#: src/ui/gui/factor.ui:173 src/ui/gui/recode.ui:960
 msgid "Variables:"
 msgstr "Variables:"
 
@@ -2575,7 +2570,7 @@ msgstr "Variable de destino %s duplica una variable existente %s."
 msgid "Variable %s is not dichotomous"
 msgstr "La variable %s no es dicotómica"
 
-#: src/language/stats/binomial.c:192
+#: src/language/stats/binomial.c:192 src/ui/gui/binomial.ui:13
 msgid "Binomial Test"
 msgstr "Prueba Binomial"
 
@@ -2588,13 +2583,13 @@ msgid "Group2"
 msgstr "Grupo 2"
 
 #: src/language/stats/binomial.c:224 src/language/stats/chisquare.c:177
-#: src/language/stats/chisquare.c:236 src/language/stats/factor.c:1188
+#: src/language/stats/chisquare.c:236 src/language/stats/factor.c:1462
 #: src/language/stats/sign.c:92 src/language/stats/wilcoxon.c:260
 #: src/ui/gui/crosstabs-dialog.c:60 src/language/stats/crosstabs.q:823
 #: src/language/stats/crosstabs.q:1151 src/language/stats/crosstabs.q:1528
 #: src/language/stats/examine.q:1105 src/language/stats/frequencies.q:871
 #: src/language/stats/oneway.q:302 src/language/stats/oneway.q:472
-#: src/language/stats/regression.q:306 src/language/stats/reliability.q:702
+#: src/language/stats/regression.q:291 src/language/stats/reliability.q:702
 msgid "Total"
 msgstr "Total"
 
@@ -2603,8 +2598,8 @@ msgstr "Total"
 msgid "Category"
 msgstr "Categoría"
 
-#: src/language/stats/binomial.c:258 src/language/stats/correlations.c:120
-#: src/language/stats/correlations.c:228 src/language/stats/npar-summary.c:122
+#: src/language/stats/binomial.c:258 src/language/stats/correlations.c:119
+#: src/language/stats/correlations.c:227 src/language/stats/npar-summary.c:122
 #: src/language/stats/sign.c:72 src/language/stats/wilcoxon.c:243
 #: src/language/stats/crosstabs.q:830 src/language/stats/examine.q:1176
 #: src/language/stats/frequencies.q:1034 src/language/stats/oneway.q:385
@@ -2645,7 +2640,7 @@ msgid "Expected N"
 msgstr "N esperado"
 
 #: src/language/stats/chisquare.c:163 src/language/stats/chisquare.c:202
-#: src/ui/gui/crosstabs-dialog.c:62 src/language/stats/regression.q:305
+#: src/ui/gui/crosstabs-dialog.c:62 src/language/stats/regression.q:290
 msgid "Residual"
 msgstr "Residual"
 
@@ -2665,7 +2660,7 @@ msgstr "Chi-cuadrado"
 
 #: src/language/stats/chisquare.c:264 src/language/stats/crosstabs.q:1215
 #: src/language/stats/oneway.q:275 src/language/stats/oneway.q:685
-#: src/language/stats/regression.q:299 src/language/stats/t-test.q:752
+#: src/language/stats/regression.q:284 src/language/stats/t-test.q:752
 #: src/language/stats/t-test.q:923 src/language/stats/t-test.q:1010
 msgid "df"
 msgstr "df"
@@ -2674,13 +2669,13 @@ msgstr "df"
 msgid "Asymp. Sig."
 msgstr "Sign. Asint."
 
-#: src/language/stats/correlations.c:97 src/language/stats/factor.c:1431
+#: src/language/stats/correlations.c:96 src/language/stats/factor.c:1720
 #: src/language/stats/npar-summary.c:108
 msgid "Descriptive Statistics"
 msgstr "Estadísticos Descriptivos"
 
-#: src/language/stats/correlations.c:118 src/language/stats/descriptives.c:101
-#: src/language/stats/factor.c:1452 src/language/stats/npar-summary.c:125
+#: src/language/stats/correlations.c:117 src/language/stats/descriptives.c:101
+#: src/language/stats/factor.c:1741 src/language/stats/npar-summary.c:125
 #: src/ui/gui/descriptives-dialog.c:40 src/ui/gui/frequencies-dialog.c:41
 #: src/language/stats/examine.q:1444 src/language/stats/frequencies.q:105
 #: src/language/stats/oneway.q:386 src/language/stats/t-test.q:506
@@ -2689,7 +2684,7 @@ msgstr "Estadísticos Descriptivos"
 msgid "Mean"
 msgstr "Media"
 
-#: src/language/stats/correlations.c:119 src/language/stats/factor.c:1453
+#: src/language/stats/correlations.c:118 src/language/stats/factor.c:1742
 #: src/language/stats/npar-summary.c:128 src/language/stats/examine.q:1479
 #: src/language/stats/oneway.q:387 src/language/stats/t-test.q:507
 #: src/language/stats/t-test.q:527 src/language/stats/t-test.q:626
@@ -2697,37 +2692,37 @@ msgstr "Media"
 msgid "Std. Deviation"
 msgstr "Desviación Estándar"
 
-#: src/language/stats/correlations.c:191 src/language/stats/factor.c:1331
+#: src/language/stats/correlations.c:190 src/language/stats/factor.c:1620
 #, fuzzy
 msgid "Correlations"
 msgstr "Correlación"
 
-#: src/language/stats/correlations.c:217
+#: src/language/stats/correlations.c:216
 #, fuzzy
 msgid "Pearson Correlation"
 msgstr "Correlación de Spearman"
 
-#: src/language/stats/correlations.c:219 src/language/stats/oneway.q:686
+#: src/language/stats/correlations.c:218 src/language/stats/oneway.q:686
 #: src/language/stats/t-test.q:753 src/language/stats/t-test.q:924
 #: src/language/stats/t-test.q:1011
 msgid "Sig. (2-tailed)"
 msgstr "Sign. (2-colas)"
 
-#: src/language/stats/correlations.c:219
+#: src/language/stats/correlations.c:218
 #, fuzzy
 msgid "Sig. (1-tailed)"
 msgstr "Sign. (2-colas)"
 
-#: src/language/stats/correlations.c:223
+#: src/language/stats/correlations.c:222
 msgid "Cross-products"
 msgstr ""
 
-#: src/language/stats/correlations.c:224
+#: src/language/stats/correlations.c:223
 #, fuzzy
 msgid "Covariance"
 msgstr "Covarianza"
 
-#: src/language/stats/correlations.c:446 src/language/stats/descriptives.c:361
+#: src/language/stats/correlations.c:454 src/language/stats/descriptives.c:361
 #: src/language/data-io/list.q:91
 msgid "No variables specified."
 msgstr "Variables no especificadas."
@@ -2858,53 +2853,44 @@ msgstr "`)' esperado."
 msgid "Variable %s specified twice in sort criteria."
 msgstr "La variable %s se especifica dos veces en los criterios de ordenación."
 
-#: src/language/stats/factor.c:558
+#: src/language/stats/factor.c:803
 msgid "Factor analysis on a single variable is not useful."
 msgstr ""
 
-#: src/language/stats/factor.c:939
+#: src/language/stats/factor.c:1206
 #, fuzzy
 msgid "Component Number"
 msgstr "Columna Número: 0"
 
-#: src/language/stats/factor.c:939
+#: src/language/stats/factor.c:1206
 #, fuzzy
 msgid "Factor Number"
 msgstr "Número de Caso"
 
-#: src/language/stats/factor.c:970
+#: src/language/stats/factor.c:1237
 #, fuzzy
 msgid "Communalities"
 msgstr "Comentarios:"
 
-#: src/language/stats/factor.c:976
+#: src/language/stats/factor.c:1243
 msgid "Initial"
 msgstr ""
 
-#: src/language/stats/factor.c:979
+#: src/language/stats/factor.c:1246
 msgid "Extraction"
 msgstr ""
 
-#: src/language/stats/factor.c:1029
-msgid "Component Matrix"
-msgstr ""
-
-#: src/language/stats/factor.c:1031
-#, fuzzy
-msgid "Factor Matrix"
-msgstr "Lista de Factores:"
-
-#: src/language/stats/factor.c:1039 src/language/stats/factor.c:1163
+#: src/language/stats/factor.c:1310 src/language/stats/factor.c:1437
 #, fuzzy
 msgid "Component"
 msgstr "Comentarios:"
 
-#: src/language/stats/factor.c:1044 src/language/stats/factor.c:1165
+#: src/language/stats/factor.c:1315 src/language/stats/factor.c:1439
 #, fuzzy
 msgid "Factor"
 msgstr "_Factor:"
 
-#: src/language/stats/factor.c:1076 src/language/stats/factor.c:1219
+#: src/language/stats/factor.c:1347 src/language/stats/factor.c:1495
 #: src/ui/gui/psppire-data-store.c:755 src/ui/gui/psppire-var-store.c:699
 #: src/ui/gui/psppire-var-store.c:709 src/ui/gui/psppire-var-store.c:719
 #: src/ui/gui/psppire-var-store.c:825
@@ -2912,62 +2898,80 @@ msgstr "_Factor:"
 msgid "%d"
 msgstr "%d"
 
-#: src/language/stats/factor.c:1138
+#: src/language/stats/factor.c:1412
 msgid "Total Variance Explained"
 msgstr ""
 
-#: src/language/stats/factor.c:1170
+#: src/language/stats/factor.c:1444
 msgid "Initial Eigenvalues"
 msgstr ""
 
-#: src/language/stats/factor.c:1176
+#: src/language/stats/factor.c:1450
 msgid "Extraction Sums of Squared Loadings"
 msgstr ""
 
-#: src/language/stats/factor.c:1182
+#: src/language/stats/factor.c:1456
 msgid "Rotation Sums of Squared Loadings"
 msgstr ""
 
-#: src/language/stats/factor.c:1190
+#: src/language/stats/factor.c:1464
 #, fuzzy, no-c-format
 msgid "% of Variance"
 msgstr "Varianza"
 
-#: src/language/stats/factor.c:1191
+#: src/language/stats/factor.c:1465
 msgid "Cumulative %"
 msgstr ""
 
-#: src/language/stats/factor.c:1289
+#: src/language/stats/factor.c:1578
 #, fuzzy
 msgid "Correlation Matrix"
 msgstr "Correlación"
 
-#: src/language/stats/factor.c:1343
+#: src/language/stats/factor.c:1632
 #, fuzzy
 msgid "Sig. 1-tailed"
 msgstr "Sign. (2-colas)"
 
-#: src/language/stats/factor.c:1377
+#: src/language/stats/factor.c:1666
 #, fuzzy
 msgid "Determinant"
 msgstr "Dependiente"
 
-#: src/language/stats/factor.c:1454
+#: src/language/stats/factor.c:1743
 msgid "Analysis N"
 msgstr ""
 
-#: src/language/stats/factor.c:1487
+#: src/language/stats/factor.c:1776
 msgid ""
 "The FACTOR criteria result in zero factors extracted. Therefore no analysis "
 "will be performed."
 msgstr ""
 
-#: src/language/stats/factor.c:1493
+#: src/language/stats/factor.c:1782
 msgid ""
 "The FACTOR criteria result in more factors than variables, which is not "
 "meaningful. No analysis will be performed."
 msgstr ""
 
+#: src/language/stats/factor.c:1865
+msgid "Component Matrix"
+msgstr ""
+
+#: src/language/stats/factor.c:1865
+#, fuzzy
+msgid "Factor Matrix"
+msgstr "Lista de Factores:"
+
+#: src/language/stats/factor.c:1871
+msgid "Rotated Component Matrix"
+msgstr ""
+
+#: src/language/stats/factor.c:1871
+#, fuzzy
+msgid "Rotated Factor Matrix"
+msgstr "Lista de Factores:"
+
 #: src/language/stats/flip.c:98
 msgid ""
 "FLIP ignores TEMPORARY.  Temporary transformations will be made permanent."
@@ -3058,7 +3062,7 @@ msgstr "Área"
 
 #: src/language/stats/roc.c:952 src/language/stats/examine.q:1641
 #: src/language/stats/oneway.q:388 src/language/stats/oneway.q:683
-#: src/language/stats/regression.q:201
+#: src/language/stats/regression.q:198
 msgid "Std. Error"
 msgstr "Error Estándar"
 
@@ -3973,7 +3977,7 @@ msgstr ""
 msgid "ascii: opening output file \"%s\""
 msgstr "ascii: abriendo el archivo de resultados \"%s\""
 
-#: src/output/ascii.c:913 src/output/cairo.c:826
+#: src/output/ascii.c:913 src/output/cairo.c:784
 #, c-format
 msgid "%s - Page %d"
 msgstr "%s - Página %d"
@@ -4091,12 +4095,12 @@ msgid ""
 msgstr ""
 "bad box: (%d+%d=%d,%d+%d=%d)-(%d+%d=%d,%d+%d=%d) en taula amb mida (%d,%d)\n"
 
-#: src/output/cairo.c:283
+#: src/output/cairo.c:295
 #, fuzzy, c-format
 msgid "error opening output file \"%s\": %s"
 msgstr "ascii: abriendo el archivo de resultados \"%s\""
 
-#: src/output/cairo.c:301
+#: src/output/cairo.c:312
 #, fuzzy, c-format
 msgid ""
 "The defined page is not wide enough to hold at least %d characters in the "
@@ -4107,7 +4111,7 @@ msgstr ""
 "fuentes por defecto.  De hecho, únicamente hay espacio para %d líneas de "
 "cada fuente en la medida por defecto de %d.%03d puntos."
 
-#: src/output/cairo.c:311
+#: src/output/cairo.c:322
 #, fuzzy, c-format
 msgid ""
 "The defined page is not long enough to hold margins and headers, plus least %"
@@ -4118,17 +4122,17 @@ msgstr ""
 "fuentes por defecto.  De hecho, únicamente hay espacio para %d líneas de "
 "cada fuente en la medida por defecto de %d.%03d puntos."
 
-#: src/output/cairo.c:364
+#: src/output/cairo.c:376
 #, fuzzy, c-format
 msgid "error drawing output for %s driver: %s"
 msgstr "error de sintaxis analitzando opciones para el controlador \"%s\""
 
-#: src/output/cairo.c:906
+#: src/output/cairo.c:864
 #, c-format
 msgid "\"%s\": bad font specification"
 msgstr "\"%s\": especificación de carácter no válida"
 
-#: src/output/cairo.c:1116
+#: src/output/cairo.c:1084
 #, fuzzy, c-format
 msgid "error writing output file \"%s\": %s"
 msgstr "Error en cerrar el archivo portátil \"%s\": %s."
@@ -4227,16 +4231,6 @@ msgstr ""
 msgid "%s: output option specified more than once"
 msgstr ""
 
-#: src/ui/gui/about.c:66
-msgid "A program for the analysis of sampled data"
-msgstr "Un programa para el análisis de datos de muestreo"
-
-#. TRANSLATORS: Use this string to list the people who have helped with
-#. translation to your language.
-#: src/ui/gui/about.c:76
-msgid "translator-credits"
-msgstr "F.J. Miguel, J. Gómez, P. Payà"
-
 #: src/ui/gui/checkbox-treeview.c:92 src/language/stats/crosstabs.q:1213
 #: src/language/stats/crosstabs.q:1240 src/language/stats/crosstabs.q:1263
 #: src/language/stats/crosstabs.q:1287 src/language/stats/examine.q:1638
@@ -4303,7 +4297,7 @@ msgstr "Corr"
 #: src/ui/gui/crosstabs-dialog.c:54 src/ui/gui/crosstabs-dialog.c:65
 #: src/ui/gui/crosstabs-dialog.c:100 src/ui/gui/crosstabs-dialog.c:108
 #: src/ui/gui/psppire-var-store.c:612 src/ui/gui/var-display.c:16
-#: src/ui/gui/variable-info-dialog.c:40
+#: src/ui/gui/variable-info-dialog.c:41
 msgid "None"
 msgstr "Ninguno"
 
@@ -4339,12 +4333,12 @@ msgstr "Desviación Estándar"
 msgid "Standard error"
 msgstr "Error Estándar"
 
-#: src/ui/gui/find-dialog.c:651
+#: src/ui/gui/find-dialog.c:649
 #, c-format
 msgid "Bad regular expression: %s"
 msgstr "Expresión regular incorrecta: %s"
 
-#: src/ui/gui/factor-dialog.c:230
+#: src/ui/gui/factor-dialog.c:344
 #, c-format
 msgid "Eigenvalues over %4.2f times the mean eigenvalue"
 msgstr ""
@@ -4370,17 +4364,35 @@ msgstr "Error estándar en la curtosis"
 msgid "Median"
 msgstr "Mediana"
 
-#: src/ui/gui/helper.c:196
+#: src/ui/gui/helper.c:197
 msgid "Sorry. The help system hasn't yet been implemented."
 msgstr "Disculpen. El sistema de ayuda todavía no ha sido implementado."
 
-#: src/ui/gui/helper.c:241
+#: src/ui/gui/help-menu.c:67
+msgid "A program for the analysis of sampled data"
+msgstr "Un programa para el análisis de datos de muestreo"
+
+#. TRANSLATORS: Use this string to list the people who have helped with
+#. translation to your language.
+#: src/ui/gui/help-menu.c:77
+msgid "translator-credits"
+msgstr "F.J. Miguel, J. Gómez, P. Payà"
+
+#: src/ui/gui/help-menu.c:98
 #, c-format
 msgid ""
 "Cannot open reference manual: %s.  The PSPP user manual is also available at "
 "http://www.gnu.org/software/pspp/documentation.html"
 msgstr ""
 
+#: src/ui/gui/help-menu.c:117
+msgid "_Help"
+msgstr "Ayuda"
+
+#: src/ui/gui/help-menu.c:124
+msgid "_Reference Manual"
+msgstr "Manual de _Referencia"
+
 #: src/ui/gui/missing-val-dialog.c:113 src/ui/gui/missing-val-dialog.c:167
 msgid "Incorrect value for variable type"
 msgstr "Valor incorrecto para el tipo de variable"
@@ -4389,7 +4401,7 @@ msgstr "Valor incorrecto para el tipo de variable"
 msgid "Incorrect range specification"
 msgstr "Especificación de intervalo incorrecta"
 
-#: src/ui/gui/oneway-anova-dialog.c:314
+#: src/ui/gui/oneway-anova-dialog.c:313
 #, c-format
 msgid "Contrast %d of %d"
 msgstr "Contraste %d de %d"
@@ -4414,58 +4426,58 @@ msgstr "Vista de Variables"
 msgid "var"
 msgstr "var"
 
-#: src/ui/gui/psppire-data-window.c:210
+#: src/ui/gui/psppire-data-window.c:212
 msgid "Transformations Pending"
 msgstr "Transformaciones pendientes"
 
-#: src/ui/gui/psppire-data-window.c:226
+#: src/ui/gui/psppire-data-window.c:228
 msgid "Filter off"
 msgstr "SIN Filtro"
 
-#: src/ui/gui/psppire-data-window.c:240
+#: src/ui/gui/psppire-data-window.c:242
 #, c-format
 msgid "Filter by %s"
 msgstr "Filtrado por %s"
 
-#: src/ui/gui/psppire-data-window.c:261
+#: src/ui/gui/psppire-data-window.c:263
 msgid "No Split"
 msgstr "NO Dividido"
 
-#: src/ui/gui/psppire-data-window.c:270
+#: src/ui/gui/psppire-data-window.c:272
 msgid "Split by "
 msgstr "Dividido por "
 
-#: src/ui/gui/psppire-data-window.c:298
+#: src/ui/gui/psppire-data-window.c:300
 msgid "Weights off"
 msgstr "SIN Ponderar"
 
-#: src/ui/gui/psppire-data-window.c:312
+#: src/ui/gui/psppire-data-window.c:314
 #, c-format
 msgid "Weight by %s"
 msgstr "Ponderado por %s"
 
-#: src/ui/gui/psppire-data-window.c:380
+#: src/ui/gui/psppire-data-window.c:382
 msgid "Open"
 msgstr "Abrir"
 
-#: src/ui/gui/psppire-data-window.c:390
+#: src/ui/gui/psppire-data-window.c:392
 #, fuzzy
 msgid "Data and Syntax Files"
 msgstr "No se puede abrir el archivo de sintaxis \"%s\""
 
-#: src/ui/gui/psppire-data-window.c:400 src/ui/gui/psppire-data-window.c:611
+#: src/ui/gui/psppire-data-window.c:402 src/ui/gui/psppire-data-window.c:611
 msgid "System Files (*.sav)"
 msgstr "Archivos de Sistema (*.sav)"
 
-#: src/ui/gui/psppire-data-window.c:406 src/ui/gui/psppire-data-window.c:617
+#: src/ui/gui/psppire-data-window.c:408 src/ui/gui/psppire-data-window.c:617
 msgid "Portable Files (*.por) "
 msgstr "Archivos Portátiles (*.por)"
 
-#: src/ui/gui/psppire-data-window.c:412 src/ui/gui/psppire-syntax-window.c:292
+#: src/ui/gui/psppire-data-window.c:414 src/ui/gui/psppire-syntax-window.c:292
 msgid "Syntax Files (*.sps) "
 msgstr "Archivos de Sintàxis (*.sps) "
 
-#: src/ui/gui/psppire-data-window.c:418 src/ui/gui/psppire-data-window.c:623
+#: src/ui/gui/psppire-data-window.c:420 src/ui/gui/psppire-data-window.c:623
 #: src/ui/gui/psppire-syntax-window.c:298
 msgid "All Files"
 msgstr "Todos los archivos"
@@ -4478,46 +4490,46 @@ msgstr "Guardar"
 msgid "Portable File"
 msgstr "Archivo Portátil"
 
-#: src/ui/gui/psppire-data-window.c:786
+#: src/ui/gui/psppire-data-window.c:773
 msgid "Font Selection"
 msgstr "Selección de fuente"
 
-#: src/ui/gui/psppire-data-window.c:1581
+#: src/ui/gui/psppire-data-window.c:1261
 msgid "Data Editor"
 msgstr "Editor de Datos"
 
-#: src/ui/gui/psppire-output-window.c:441
+#: src/ui/gui/psppire-output-window.c:458
 msgid "Export Output"
 msgstr ""
 
-#: src/ui/gui/psppire-output-window.c:449
+#: src/ui/gui/psppire-output-window.c:466
 #, fuzzy
 msgid "PDF Files (*.pdf)"
 msgstr "Archivos Portátiles (*.por)"
 
-#: src/ui/gui/psppire-output-window.c:450
+#: src/ui/gui/psppire-output-window.c:467
 msgid "HTML Files (*.html)"
 msgstr ""
 
-#: src/ui/gui/psppire-output-window.c:451
+#: src/ui/gui/psppire-output-window.c:468
 msgid "OpenDocument Files (*.odt)"
 msgstr ""
 
-#: src/ui/gui/psppire-output-window.c:452
+#: src/ui/gui/psppire-output-window.c:469
 #, fuzzy
 msgid "Text Files (*.txt)"
 msgstr "Archivos de Sistema (*.sav)"
 
-#: src/ui/gui/psppire-output-window.c:453
+#: src/ui/gui/psppire-output-window.c:470
 #, fuzzy
 msgid "PostScript Files (*.ps)"
 msgstr "Archivos Portátiles (*.por)"
 
-#: src/ui/gui/psppire-output-window.c:454
+#: src/ui/gui/psppire-output-window.c:471
 msgid "Comma-Separated Value Files (*.csv)"
 msgstr ""
 
-#: src/ui/gui/psppire-output-window.c:593
+#: src/ui/gui/psppire-output-window.c:605
 msgid "Output Viewer"
 msgstr "Visor de resultados"
 
@@ -4530,11 +4542,11 @@ msgstr "Guardado archivo \"%s\""
 msgid "Save Syntax"
 msgstr "Guardar sintaxis"
 
-#: src/ui/gui/psppire-syntax-window.c:512
+#: src/ui/gui/psppire-syntax-window.c:496
 msgid "Syntax Editor"
 msgstr "Editor de sintaxis"
 
-#: src/ui/gui/psppire-syntax-window.c:526
+#: src/ui/gui/psppire-syntax-window.c:510
 #, c-format
 msgid "Cannot load syntax file '%s'"
 msgstr "No se puede abrir el archivo de sintaxis \"%s\""
@@ -4618,27 +4630,27 @@ msgstr ""
 msgid "Close _without saving"
 msgstr "Cerrar sin guardar"
 
-#: src/ui/gui/recode-dialog.c:915
+#: src/ui/gui/recode-dialog.c:911
 msgid "Recode into Different Variables"
 msgstr "Recodificar en variables Diferentes"
 
-#: src/ui/gui/recode-dialog.c:918 src/ui/gui/recode.ui:692
+#: src/ui/gui/recode-dialog.c:914 src/ui/gui/recode.ui:692
 msgid "Recode into Same Variables"
 msgstr "Recodificar en las Mismas variables"
 
-#: src/ui/gui/recode-dialog.c:933 src/ui/gui/recode-dialog.c:1029
+#: src/ui/gui/recode-dialog.c:929 src/ui/gui/recode-dialog.c:1025
 msgid "New"
 msgstr "Nuevo"
 
-#: src/ui/gui/recode-dialog.c:948 src/ui/gui/recode-dialog.c:1021
+#: src/ui/gui/recode-dialog.c:944 src/ui/gui/recode-dialog.c:1017
 msgid "Old"
 msgstr "Anterior"
 
-#: src/ui/gui/recode-dialog.c:1278
+#: src/ui/gui/recode-dialog.c:1274
 msgid "Recode into Different Variables: Old and New Values "
 msgstr "Recodifica en variables Diferentes: Anteriores y Nuevos valores "
 
-#: src/ui/gui/recode-dialog.c:1279
+#: src/ui/gui/recode-dialog.c:1275
 msgid "Recode into Same Variables: Old and New Values"
 msgstr "Recodifica en las mismas variables: Anteriores y Nuevos valores"
 
@@ -4646,7 +4658,7 @@ msgstr "Recodifica en las mismas variables: Anteriores y Nuevos valores"
 msgid "Coeff"
 msgstr "Coef"
 
-#: src/ui/gui/regression-dialog.c:43 src/language/stats/regression.q:158
+#: src/ui/gui/regression-dialog.c:43 src/language/stats/regression.q:155
 msgid "R"
 msgstr "R"
 
@@ -4769,31 +4781,31 @@ msgstr "El contenido del campo \"%.*s\" no puede ser analizado en formato %s."
 msgid "Confidence Interval: %2d %%"
 msgstr "Intervalo de Confianza: %2d %%"
 
-#: src/ui/gui/variable-info-dialog.c:76
+#: src/ui/gui/variable-info-dialog.c:77
 #, c-format
 msgid "Label: %s\n"
 msgstr "Etiqueta: %s\n"
 
-#: src/ui/gui/variable-info-dialog.c:83
+#: src/ui/gui/variable-info-dialog.c:84
 #, c-format
 msgid "Type: %s\n"
 msgstr "Tipo: %s\n"
 
-#: src/ui/gui/variable-info-dialog.c:87
+#: src/ui/gui/variable-info-dialog.c:88
 #, c-format
 msgid "Missing Values: %s\n"
 msgstr "Valores perdidos: %s\n"
 
-#: src/ui/gui/variable-info-dialog.c:92
+#: src/ui/gui/variable-info-dialog.c:93
 #, c-format
 msgid "Measurement Level: %s\n"
 msgstr "Nivel de Medida: %s\n"
 
-#: src/ui/gui/variable-info-dialog.c:105
+#: src/ui/gui/variable-info-dialog.c:106
 msgid "Value Labels:\n"
 msgstr "Etiquetas de valor:\n"
 
-#: src/ui/gui/variable-info-dialog.c:115
+#: src/ui/gui/variable-info-dialog.c:116
 #, c-format
 msgid "%s %s\n"
 msgstr "%s %s\n"
@@ -4808,27 +4820,27 @@ msgstr "No ponderar los casos"
 msgid "Weight cases by %s"
 msgstr "Ponderar los casos por %s"
 
-#: tests/dissect-sysfile.c:567
+#: tests/dissect-sysfile.c:571
 #, c-format
 msgid "Unrecognized record type 7, subtype %d."
 msgstr "Tipo de registro 7 no reconocido, subtipo %d."
 
-#: tests/dissect-sysfile.c:846
+#: tests/dissect-sysfile.c:850
 #, c-format
 msgid "%s: Error parsing attribute value %s[%d]"
 msgstr "%s: Error al analizar el valor del atributo %s[%d]"
 
-#: tests/dissect-sysfile.c:852
+#: tests/dissect-sysfile.c:856
 #, c-format
 msgid "%s: Attribute value %s[%d] is not quoted: %s"
 msgstr "%s: El valor del atributo %s[%d] no está entre comillas: %s"
 
-#: tests/dissect-sysfile.c:876
+#: tests/dissect-sysfile.c:880
 #, fuzzy, c-format
 msgid "Bad size %zu for extended number of cases."
 msgstr "Longitud no válida %zu en la extensión 11."
 
-#: tests/dissect-sysfile.c:882
+#: tests/dissect-sysfile.c:886
 #, c-format
 msgid "Bad count %zu for extended number of cases."
 msgstr ""
@@ -5304,14 +5316,10 @@ msgstr ""
 msgid "Omitting pie chart for %s, which has over 50 unique values."
 msgstr ""
 
-#: src/language/stats/glm.q:245
+#: src/language/stats/glm.q:248
 msgid "Multivariate GLM not yet supported"
 msgstr "GLM multivariable todavía no disponible"
 
-#: src/language/stats/glm.q:355 src/language/stats/regression.q:998
-msgid "No valid data found. This command was skipped."
-msgstr "No se han encontrado datos válidos. Se ignora esta orden."
-
 #: src/language/stats/means.q:100
 msgid "Missing required subcommand TABLES."
 msgstr "Falta el subcomando requerido TABLES."
@@ -5320,18 +5328,18 @@ msgstr "Falta el subcomando requerido TABLES."
 msgid "TABLES subcommand may not appear more than once."
 msgstr "El subcomando TABLES no puede aparecer más de una vez."
 
-#: src/language/stats/npar.q:110
+#: src/language/stats/npar.q:111
 msgid "NPAR subcommand not currently implemented."
 msgstr "Actualmente no está implementado el subcomando NPAR."
 
-#: src/language/stats/npar.q:254
+#: src/language/stats/npar.q:256
 #, c-format
 msgid ""
 "The specified value of HI (%d) is lower than the specified value of LO (%d)"
 msgstr ""
 "El valor especificado para HI (%d) es menor que el especificado para LO (%d)"
 
-#: src/language/stats/npar.q:309
+#: src/language/stats/npar.q:311
 #, c-format
 msgid ""
 "%d expected values were given, but the specified range (%d-%d) requires "
@@ -5340,7 +5348,7 @@ msgstr ""
 "Se han proporcionado %d valores esperados, pero el intervalo especificado (%"
 "d-%d) requiere exactamente %d valores."
 
-#: src/language/stats/npar.q:444 src/language/stats/t-test.q:380
+#: src/language/stats/npar.q:453 src/language/stats/t-test.q:380
 #, c-format
 msgid ""
 "PAIRED was specified but the number of variables preceding WITH (%zu) did "
@@ -5364,21 +5372,21 @@ msgstr "Los coeficientes para contrastar %zu no suman cero"
 msgid "`%s' is not a variable name"
 msgstr "`%s' no es un nombre de variable"
 
-#: src/language/stats/oneway.q:274 src/language/stats/regression.q:298
+#: src/language/stats/oneway.q:274 src/language/stats/regression.q:283
 msgid "Sum of Squares"
 msgstr "Suma de Cuadrados"
 
-#: src/language/stats/oneway.q:276 src/language/stats/regression.q:300
+#: src/language/stats/oneway.q:276 src/language/stats/regression.q:285
 msgid "Mean Square"
 msgstr "Cuadrado medio"
 
-#: src/language/stats/oneway.q:277 src/language/stats/regression.q:301
+#: src/language/stats/oneway.q:277 src/language/stats/regression.q:286
 #: src/language/stats/t-test.q:749
 msgid "F"
 msgstr "F"
 
 #: src/language/stats/oneway.q:278 src/language/stats/oneway.q:535
-#: src/language/stats/regression.q:204 src/language/stats/regression.q:302
+#: src/language/stats/regression.q:201 src/language/stats/regression.q:287
 msgid "Significance"
 msgstr "Significatividad"
 
@@ -5390,7 +5398,7 @@ msgstr "Entre Grupos"
 msgid "Within Groups"
 msgstr "Intra Grupos"
 
-#: src/language/stats/oneway.q:345 src/language/stats/regression.q:327
+#: src/language/stats/oneway.q:345 src/language/stats/regression.q:312
 msgid "ANOVA"
 msgstr "ANOVA"
 
@@ -5426,7 +5434,7 @@ msgstr "Pruebas de contrate"
 msgid "Value of Contrast"
 msgstr "Valor de constraste"
 
-#: src/language/stats/oneway.q:684 src/language/stats/regression.q:203
+#: src/language/stats/oneway.q:684 src/language/stats/regression.q:200
 #: src/language/stats/t-test.q:751 src/language/stats/t-test.q:922
 #: src/language/stats/t-test.q:1009
 msgid "t"
@@ -5497,55 +5505,55 @@ msgstr "La variable %s ya existe."
 msgid "Too many variables in INTO clause."
 msgstr "Demasiadas variables a la cláusula INTO."
 
-#: src/language/stats/regression.q:159
+#: src/language/stats/regression.q:156
 msgid "R Square"
 msgstr "R Cuadrada"
 
-#: src/language/stats/regression.q:160
+#: src/language/stats/regression.q:157
 msgid "Adjusted R Square"
 msgstr "R Cuadrada Ajustada"
 
-#: src/language/stats/regression.q:161
+#: src/language/stats/regression.q:158
 msgid "Std. Error of the Estimate"
 msgstr "Error estándard del Estimador"
 
-#: src/language/stats/regression.q:166
+#: src/language/stats/regression.q:163
 msgid "Model Summary"
 msgstr "Resumen del modelo"
 
-#: src/language/stats/regression.q:200
+#: src/language/stats/regression.q:197
 msgid "B"
 msgstr "B"
 
-#: src/language/stats/regression.q:202
+#: src/language/stats/regression.q:199
 msgid "Beta"
 msgstr "Beta"
 
-#: src/language/stats/regression.q:205
+#: src/language/stats/regression.q:202
 msgid "(Constant)"
 msgstr "(Constant)"
 
-#: src/language/stats/regression.q:269
+#: src/language/stats/regression.q:254
 msgid "Coefficients"
 msgstr "Coeficientes"
 
-#: src/language/stats/regression.q:304 src/ui/gui/regression.ui:7
+#: src/language/stats/regression.q:289 src/ui/gui/regression.ui:7
 msgid "Regression"
 msgstr "Regresión"
 
-#: src/language/stats/regression.q:385
+#: src/language/stats/regression.q:370
 msgid "Model"
 msgstr "Modelo"
 
-#: src/language/stats/regression.q:386
+#: src/language/stats/regression.q:371
 msgid "Covariances"
 msgstr "Covarianza"
 
-#: src/language/stats/regression.q:401
+#: src/language/stats/regression.q:386
 msgid "Coefficient Correlations"
 msgstr "Correlaciones de Coeficientes"
 
-#: src/language/stats/regression.q:808
+#: src/language/stats/regression.q:793
 msgid ""
 "The dependent variable is equal to the independent variable.The least "
 "squares line is therefore Y=X.Standard errors and related statistics may be "
@@ -5555,9 +5563,13 @@ msgstr ""
 "minimos cuadrados es por tanto Y=X. Los errores estándard y los estadísticos "
 "relacionados podrian ser irrelevantes."
 
-#: src/language/stats/regression.q:900
-msgid "Dependent variable must be numeric."
-msgstr "La variable dependiente debe ser numérica."
+#: src/language/stats/regression.q:891
+msgid "REGRESSION requires numeric variables."
+msgstr ""
+
+#: src/language/stats/regression.q:962
+msgid "No valid data found. This command was skipped."
+msgstr "No se han encontrado datos válidos. Se ignora esta orden."
 
 #: src/language/stats/reliability.q:421
 msgid "Reliability Statistics"
@@ -5820,6 +5832,28 @@ msgstr "El último caso (%ld) a listar es menor que 1.  El valor se ajusta a 1."
 msgid "The step value %ld is less than 1.  The value is being reset to 1."
 msgstr "El valor de paso %ld es menor que 1.  El valor se ajusta a 1."
 
+#: src/ui/gui/binomial.ui:57 src/ui/gui/chi-square.ui:57
+#, fuzzy
+msgid "_Test Variable List:"
+msgstr "Variable(s) de contraste:"
+
+#: src/ui/gui/binomial.ui:126 src/ui/gui/chi-square.ui:126
+msgid "_Get from data"
+msgstr ""
+
+#: src/ui/gui/binomial.ui:143 src/ui/gui/t-test.ui:333
+msgid "_Cut point:"
+msgstr "Punto de corte:"
+
+#: src/ui/gui/binomial.ui:178
+msgid "Define Dichotomy"
+msgstr ""
+
+#: src/ui/gui/binomial.ui:197
+#, fuzzy
+msgid "Test _Proportion:"
+msgstr "Prop. Test"
+
 #: src/ui/gui/correlation.ui:7
 #, fuzzy
 msgid "Bivariate Correlations"
@@ -5933,6 +5967,45 @@ msgstr "Pruebas Estadísticas"
 msgid "Statistics"
 msgstr "Estadísticas"
 
+#: src/ui/gui/chi-square.ui:13
+#, fuzzy
+msgid "Chi-Square Test"
+msgstr "Pruebas Chi-cuadrado."
+
+#: src/ui/gui/chi-square.ui:140
+#, fuzzy
+msgid "Use _specified range"
+msgstr "Utiliza valores especificados:"
+
+#: src/ui/gui/chi-square.ui:162
+#, fuzzy
+msgid "_Lower:"
+msgstr "Inferior"
+
+#: src/ui/gui/chi-square.ui:170
+#, fuzzy
+msgid "_Upper:"
+msgstr "Superior"
+
+#: src/ui/gui/chi-square.ui:214
+#, fuzzy
+msgid "Expected Range:"
+msgstr "N esperado"
+
+#: src/ui/gui/chi-square.ui:240
+msgid "All categor_ies equal"
+msgstr ""
+
+#: src/ui/gui/chi-square.ui:257
+#, fuzzy
+msgid "_Values"
+msgstr "Valores"
+
+#: src/ui/gui/chi-square.ui:301
+#, fuzzy
+msgid "Expected Values:"
+msgstr "Valores extremos"
+
 #: src/ui/gui/descriptives.ui:130 src/ui/gui/frequencies.ui:140
 msgid "Statistics:"
 msgstr "Estadísticas:"
@@ -6013,64 +6086,102 @@ msgstr "Lista de Factores:"
 
 #: src/ui/gui/factor.ui:47
 #, fuzzy
-msgid "Descriptives..."
+msgid "_Descriptives..."
 msgstr "Descriptivos"
 
 #: src/ui/gui/factor.ui:60
 #, fuzzy
-msgid "Extraction..."
+msgid "_Extraction..."
 msgstr "Opciones..."
 
-#: src/ui/gui/factor.ui:180
+#: src/ui/gui/factor.ui:74
+#, fuzzy
+msgid "_Rotations..."
+msgstr "Opciones..."
+
+#: src/ui/gui/factor.ui:192
 msgid "Factor Analysis: Extraction"
 msgstr ""
 
-#: src/ui/gui/factor.ui:204
+#: src/ui/gui/factor.ui:216
 #, fuzzy
 msgid "Method: "
 msgstr "Modo:"
 
-#: src/ui/gui/factor.ui:254
+#: src/ui/gui/factor.ui:266
 #, fuzzy
 msgid "Correlation matrix"
 msgstr "Correlación"
 
-#: src/ui/gui/factor.ui:268
+#: src/ui/gui/factor.ui:280
 #, fuzzy
 msgid "Covariance matrix"
 msgstr "Covarianza"
 
-#: src/ui/gui/factor.ui:288
+#: src/ui/gui/factor.ui:300
 #, fuzzy
 msgid "Analyse"
 msgstr "_Analizar"
 
-#: src/ui/gui/factor.ui:312
+#: src/ui/gui/factor.ui:324
 msgid "Unrotatated factor solution"
 msgstr ""
 
-#: src/ui/gui/factor.ui:326
+#: src/ui/gui/factor.ui:338
 msgid "Scree plot"
 msgstr ""
 
-#: src/ui/gui/factor.ui:345 src/ui/gui/roc.ui:286
+#: src/ui/gui/factor.ui:357 src/ui/gui/roc.ui:286
 #, fuzzy
 msgid "Display"
 msgstr "Contenido de celda"
 
-#: src/ui/gui/factor.ui:418
+#: src/ui/gui/factor.ui:430
 msgid "Number of factors:"
 msgstr ""
 
-#: src/ui/gui/factor.ui:448
+#: src/ui/gui/factor.ui:460
 #, fuzzy
 msgid "Extract"
 msgstr "Eta"
 
-#: src/ui/gui/factor.ui:463
+#: src/ui/gui/factor.ui:475 src/ui/gui/factor.ui:665
 msgid "Maximum iterations for convergence:"
 msgstr ""
 
+#: src/ui/gui/factor.ui:538
+#, fuzzy
+msgid "Factor Analysis: Rotation"
+msgstr "Lista de Factores:"
+
+#: src/ui/gui/factor.ui:571
+#, fuzzy
+msgid "_None"
+msgstr "Ninguno"
+
+#: src/ui/gui/factor.ui:582
+#, fuzzy
+msgid "_Varimax"
+msgstr "_Variables"
+
+#: src/ui/gui/factor.ui:598
+msgid "_Quartimax"
+msgstr ""
+
+#: src/ui/gui/factor.ui:614
+msgid "_Equimax"
+msgstr ""
+
+#: src/ui/gui/factor.ui:637
+#, fuzzy
+msgid "Method"
+msgstr "Modo:"
+
+#: src/ui/gui/factor.ui:648
+#, fuzzy
+msgid "_Display rotated solution"
+msgstr "Muestra _información del archivo de datos"
+
 #: src/ui/gui/find.ui:8
 #, fuzzy
 msgid "Find Case"
@@ -6784,10 +6895,6 @@ msgstr "Valor del grupo 2:"
 msgid "Group_1 value:"
 msgstr "Valor del Grupo 1:"
 
-#: src/ui/gui/t-test.ui:333
-msgid "_Cut point:"
-msgstr "Punto de corte:"
-
 #: src/ui/gui/t-test.ui:365
 msgid "_Use specified values:"
 msgstr "Utiliza valores especificados:"
@@ -7035,19 +7142,19 @@ msgstr "Ordenación Ascendente"
 msgid "Sort Descending"
 msgstr "Ordenación Descendente"
 
-#: src/ui/gui/data-editor.ui:26 src/ui/gui/output-viewer.glade:21
-#: src/ui/gui/syntax-editor.glade:14
+#: src/ui/gui/data-editor.ui:26 src/ui/gui/output-viewer.ui:9
+#: src/ui/gui/syntax-editor.ui:10
 msgid "_File"
 msgstr "_Archivo"
 
-#: src/ui/gui/data-editor.ui:38 src/ui/gui/syntax-editor.glade:32
-#: src/ui/gui/syntax-editor.glade:62
+#: src/ui/gui/data-editor.ui:38 src/ui/gui/syntax-editor.ui:22
+#: src/ui/gui/syntax-editor.ui:40
 msgid "_Syntax"
 msgstr "_Sintaxis"
 
 #: src/ui/gui/data-editor.ui:44 src/ui/gui/data-editor.ui:217
-#: src/ui/gui/data-editor.ui:229 src/ui/gui/syntax-editor.glade:41
-#: src/ui/gui/syntax-editor.glade:71
+#: src/ui/gui/data-editor.ui:229 src/ui/gui/syntax-editor.ui:28
+#: src/ui/gui/syntax-editor.ui:46
 msgid "_Data"
 msgstr "_Datos"
 
@@ -7075,8 +7182,8 @@ msgstr "Datos utilizados recientemente"
 msgid "Recently Used _Files"
 msgstr "Archivos utilizados recientemente"
 
-#: src/ui/gui/data-editor.ui:111 src/ui/gui/output-viewer.glade:43
-#: src/ui/gui/syntax-editor.glade:118
+#: src/ui/gui/data-editor.ui:111 src/ui/gui/output-viewer.ui:28
+#: src/ui/gui/syntax-editor.ui:70
 msgid "_Edit"
 msgstr "_Editar"
 
@@ -7296,13 +7403,13 @@ msgstr "Ir a la variable"
 msgid "Data File _Comments"
 msgstr "_Comentarios al archivo de datos"
 
-#: src/ui/gui/data-editor.ui:444 src/ui/gui/output-viewer.glade:66
-#: src/ui/gui/syntax-editor.glade:209
+#: src/ui/gui/data-editor.ui:444 src/ui/gui/output-viewer.ui:40
+#: src/ui/gui/syntax-editor.ui:131
 msgid "_Windows"
 msgstr "_Ventanas"
 
-#: src/ui/gui/data-editor.ui:450 src/ui/gui/output-viewer.glade:76
-#: src/ui/gui/syntax-editor.glade:218
+#: src/ui/gui/data-editor.ui:450 src/ui/gui/output-viewer.ui:46
+#: src/ui/gui/syntax-editor.ui:137
 msgid "_Minimize All Windows"
 msgstr "_Minimizar todas las ventanas"
 
@@ -7310,69 +7417,64 @@ msgstr "_Minimizar todas las ventanas"
 msgid "_Split"
 msgstr "Dividir"
 
-#: src/ui/gui/data-editor.ui:462 src/ui/gui/output-viewer.glade:87
-#: src/ui/gui/syntax-editor.glade:229
-msgid "_Help"
-msgstr "Ayuda"
-
-#: src/ui/gui/data-editor.ui:468 src/ui/gui/output-viewer.glade:94
-#: src/ui/gui/syntax-editor.glade:237
-msgid "_Reference Manual"
-msgstr "Manual de _Referencia"
-
-#: src/ui/gui/data-editor.ui:652
+#: src/ui/gui/data-editor.ui:630
 msgid "Information Area"
 msgstr "Área de Información"
 
-#: src/ui/gui/data-editor.ui:674
+#: src/ui/gui/data-editor.ui:652
 msgid "Processor Area"
 msgstr "Área del procesador"
 
-#: src/ui/gui/data-editor.ui:699
+#: src/ui/gui/data-editor.ui:677
 msgid "Case Counter Area"
 msgstr "Área de Recuento"
 
-#: src/ui/gui/data-editor.ui:724
+#: src/ui/gui/data-editor.ui:702
 msgid "Filter Use Status Area"
 msgstr "Área de uso de Filtro"
 
-#: src/ui/gui/data-editor.ui:750
+#: src/ui/gui/data-editor.ui:728
 msgid "Weight Status Area"
 msgstr "Área de Ponderación"
 
-#: src/ui/gui/data-editor.ui:776
+#: src/ui/gui/data-editor.ui:754
 msgid "Split File Status Area"
 msgstr "Área de División de Archivo"
 
-#: src/ui/gui/output-viewer.glade:31
+#: src/ui/gui/output-viewer.ui:22
 #, fuzzy
 msgid "_Export"
 msgstr "_Explorar"
 
-#: src/ui/gui/output-viewer.glade:101 src/ui/gui/syntax-editor.glade:244
-msgid "_About"
-msgstr "Sobre..."
-
-#: src/ui/gui/syntax-editor.glade:163
+#: src/ui/gui/syntax-editor.ui:100
 msgid "_Run"
 msgstr "Ejecuta_r"
 
-#: src/ui/gui/syntax-editor.glade:172
+#: src/ui/gui/syntax-editor.ui:106
 msgid "All"
 msgstr "Todos"
 
-#: src/ui/gui/syntax-editor.glade:180
+#: src/ui/gui/syntax-editor.ui:112
 msgid "Selection"
 msgstr "Selección"
 
-#: src/ui/gui/syntax-editor.glade:188
+#: src/ui/gui/syntax-editor.ui:118
 msgid "Current Line"
 msgstr "Línea actual"
 
-#: src/ui/gui/syntax-editor.glade:197
+#: src/ui/gui/syntax-editor.ui:125
 msgid "To End"
 msgstr "Hasta el final"
 
+#~ msgid "Dependent variable must be numeric."
+#~ msgstr "La variable dependiente debe ser numérica."
+
+#~ msgid "Variable %s has label of invalid length %zu."
+#~ msgstr "Variable %s tiene una etiqueta de longitud no válida %zu."
+
+#~ msgid "_About"
+#~ msgstr "Sobre..."
+
 #~ msgid "Buttons"
 #~ msgstr "Botones"
 
index b83e112000a7a06bd5ebc319ee81db04b72b1f6b..e8bcc632f62c57b1d8294fa02d734bf9d57008ba 100644 (file)
--- a/po/nl.po
+++ b/po/nl.po
@@ -30,7 +30,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pspp-0.7.4-pre1\n"
 "Report-Msgid-Bugs-To: pspp-dev@gnu.org\n"
-"POT-Creation-Date: 2010-05-15 11:14+0200\n"
+"POT-Creation-Date: 2010-05-21 12:02+0200\n"
 "PO-Revision-Date: 2010-05-11 11:54+0200\n"
 "Last-Translator: Harry Thijssen <pspp@sjpaes.nl>\n"
 "Language-Team: Dutch <vertaling@vrijschrift.org>\n"
@@ -270,7 +270,7 @@ msgstr "systeem"
 msgid "scratch"
 msgstr "scratch"
 
-#: src/data/dictionary.c:981
+#: src/data/dictionary.c:980
 msgid ""
 "At least one case in the data file had a weight value that was user-missing, "
 "system-missing, zero, or negative.  These case(s) were ignored."
@@ -278,7 +278,7 @@ msgstr ""
 "Op zijn minst een case in het gegevensbestand heeft een gewichtwaarde user-"
 "missing, system-missing, nul, of negatief.  Deze case(s) zijn genegeerd."
 
-#: src/data/dictionary.c:1284
+#: src/data/dictionary.c:1283
 #, c-format
 msgid "Truncating document line to %d bytes."
 msgstr "Documentregel afgekapt tot %d bytes."
@@ -373,20 +373,20 @@ msgstr[1] ""
 msgid "%s variables are not compatible with %s format %s."
 msgstr "%s variabelen zijn niet overeenkomstig met %s opmaak %s."
 
-#: src/data/format.c:327 src/data/sys-file-reader.c:744
+#: src/data/format.c:327 src/data/sys-file-reader.c:752
 #: src/ui/gui/psppire-var-store.c:628 src/ui/gui/psppire.ui:1960
 #: src/ui/gui/var-sheet-dialogs.ui:139
 msgid "String"
 msgstr "Tekenreeks"
 
-#: src/data/format.c:327 src/data/sys-file-reader.c:744
+#: src/data/format.c:327 src/data/sys-file-reader.c:752
 #: src/ui/gui/psppire-var-store.c:621 src/ui/gui/psppire.ui:2040
 #: src/ui/gui/var-sheet-dialogs.ui:27
 msgid "Numeric"
 msgstr "Numeriek"
 
-#: src/data/format.c:328 src/data/sys-file-reader.c:1464
-#: src/data/sys-file-reader.c:1466 src/language/xforms/recode.c:493
+#: src/data/format.c:328 src/data/sys-file-reader.c:1472
+#: src/data/sys-file-reader.c:1474 src/language/xforms/recode.c:493
 #: src/language/xforms/recode.c:494 src/language/xforms/recode.c:506
 #: src/language/xforms/recode.c:507
 #: src/language/dictionary/apply-dictionary.c:78
@@ -394,8 +394,8 @@ msgstr "Numeriek"
 msgid "numeric"
 msgstr "numeriek"
 
-#: src/data/format.c:328 src/data/sys-file-reader.c:1464
-#: src/data/sys-file-reader.c:1466 src/language/xforms/recode.c:493
+#: src/data/format.c:328 src/data/sys-file-reader.c:1472
+#: src/data/sys-file-reader.c:1474 src/language/xforms/recode.c:493
 #: src/language/xforms/recode.c:494 src/language/xforms/recode.c:506
 #: src/language/xforms/recode.c:507
 #: src/language/dictionary/apply-dictionary.c:78
@@ -603,7 +603,7 @@ msgstr "Ongeldige variabelenbreedte %d."
 msgid "Invalid variable name `%s' in position %d."
 msgstr "Ongeldige variabelennaam '%s' op positie %d."
 
-#: src/data/por-file-reader.c:685 src/data/sys-file-reader.c:602
+#: src/data/por-file-reader.c:685 src/data/sys-file-reader.c:606
 #, c-format
 msgid "Bad width %d for variable %s."
 msgstr "Onjuiste breedte %d voor variabele %s."
@@ -726,7 +726,7 @@ msgstr ""
 msgid "Variable suffix too large."
 msgstr "Variabelen-achtervoegsel te lang."
 
-#: src/data/sys-file-reader.c:222
+#: src/data/sys-file-reader.c:226
 #, c-format
 msgid "Recoded variable name duplicates an existing `%s' within system file."
 msgstr ""
@@ -735,120 +735,115 @@ msgstr ""
 
 #. TRANSLATORS: this fragment will be interpolated into
 #. messages in fh_lock() that identify types of files.
-#: src/data/sys-file-reader.c:286 src/data/sys-file-writer.c:207
+#: src/data/sys-file-reader.c:290 src/data/sys-file-writer.c:207
 msgid "system file"
 msgstr "systeembestand"
 
-#: src/data/sys-file-reader.c:293
+#: src/data/sys-file-reader.c:297
 #, c-format
 msgid "Error opening \"%s\" for reading as a system file: %s."
 msgstr ""
 "Fout bij het openen van \"%s\" voor het lezen als een systeembestand: %s."
 
-#: src/data/sys-file-reader.c:332 tests/dissect-sysfile.c:154
+#: src/data/sys-file-reader.c:336 tests/dissect-sysfile.c:154
 msgid "Misplaced type 4 record."
 msgstr "Verkeerd geplaatst type 4 record."
 
-#: src/data/sys-file-reader.c:343 tests/dissect-sysfile.c:165
+#: src/data/sys-file-reader.c:347 tests/dissect-sysfile.c:165
 #, c-format
 msgid "Unrecognized record type %d."
 msgstr "Niet-herkend recordtype %d."
 
-#: src/data/sys-file-reader.c:384
+#: src/data/sys-file-reader.c:388
 #, c-format
 msgid "File header claims %d variable positions but %d were read from file."
 msgstr ""
 "Bestandskop claimt %d variabelenposities maar er zijn er %d gelezen van het "
 "bestand."
 
-#: src/data/sys-file-reader.c:424
+#: src/data/sys-file-reader.c:428
 #, c-format
 msgid "Error closing system file \"%s\": %s."
 msgstr "Fout bij het sluiten van systeembestand \"%s\": %s."
 
-#: src/data/sys-file-reader.c:489 src/data/sys-file-reader.c:499
+#: src/data/sys-file-reader.c:493 src/data/sys-file-reader.c:503
 #: tests/dissect-sysfile.c:202 tests/dissect-sysfile.c:212
 msgid "This is not an SPSS system file."
 msgstr "Dit is geen SPSS-systeembestand."
 
-#: src/data/sys-file-reader.c:521 tests/dissect-sysfile.c:227
+#: src/data/sys-file-reader.c:525 tests/dissect-sysfile.c:227
 msgid ""
 "Compression bias is not the usual value of 100, or system file uses "
 "unrecognized floating-point format."
 msgstr ""
 
-#: src/data/sys-file-reader.c:598
+#: src/data/sys-file-reader.c:602
 #, c-format
 msgid "Invalid variable name `%s'."
 msgstr "Ongeldige variabelennaam '%s'."
 
-#: src/data/sys-file-reader.c:606
+#: src/data/sys-file-reader.c:610
 #, c-format
 msgid "Duplicate variable name `%s' within system file."
 msgstr "Dubbele variabelennaam '%s' binnen systeembestand."
 
-#: src/data/sys-file-reader.c:614 tests/dissect-sysfile.c:356
+#: src/data/sys-file-reader.c:618 tests/dissect-sysfile.c:356
 msgid "Variable label indicator field is not 0 or 1."
 msgstr "Variabelen-labelindicatorveld is niet 0 of 1."
 
-#: src/data/sys-file-reader.c:622 tests/dissect-sysfile.c:365
-#, c-format
-msgid "Variable %s has label of invalid length %zu."
-msgstr "Variabele %s heeft label van ongeldige lengte %zu."
-
-#: src/data/sys-file-reader.c:641 tests/dissect-sysfile.c:383
+#: src/data/sys-file-reader.c:649 tests/dissect-sysfile.c:387
 msgid "Numeric missing value indicator field is not -3, -2, 0, 1, 2, or 3."
 msgstr ""
 "Numeriek ontbrekende-waarde indicatorveld is niet -3, -2, 0, 1, 2, of 3."
 
-#: src/data/sys-file-reader.c:659 tests/dissect-sysfile.c:398
+#: src/data/sys-file-reader.c:667 tests/dissect-sysfile.c:402
 msgid "String missing value indicator field is not 0, 1, 2, or 3."
 msgstr "Tekenreeks ontbrekende-waarde indicatorveld is niet 0, 1, 2, of 3."
 
-#: src/data/sys-file-reader.c:691
+#: src/data/sys-file-reader.c:699
 msgid "Missing string continuation record."
 msgstr "Mis tekenreeks continuering record."
 
-#: src/data/sys-file-reader.c:725
+#: src/data/sys-file-reader.c:733
 #, c-format
 msgid "Unknown variable format %<PRIu8>."
 msgstr "Onbekend variabelenopmaak %<PRIu8>."
 
-#: src/data/sys-file-reader.c:743
+#: src/data/sys-file-reader.c:751
 #, c-format
 msgid "%s variable %s has invalid %s format %s."
 msgstr "%s variabele %s heeft ongeldig %s opmaak %s."
 
-#: src/data/sys-file-reader.c:746
+#: src/data/sys-file-reader.c:754
 msgid "print"
 msgstr "afdrukken"
 
-#: src/data/sys-file-reader.c:746
+#: src/data/sys-file-reader.c:754
 msgid "write"
 msgstr "schrijf"
 
-#: src/data/sys-file-reader.c:750
+#: src/data/sys-file-reader.c:758
 msgid "Suppressing further invalid format warnings."
 msgstr "Onderdrukt verdere ongeldig indelingswaarschuwingen."
 
-#: src/data/sys-file-reader.c:768
+#: src/data/sys-file-reader.c:776
 msgid "Weighting variable must be numeric."
 msgstr "Wegingvariabele moet numeriek zijn."
 
-#: src/data/sys-file-reader.c:782
+#: src/data/sys-file-reader.c:790
 msgid "Multiple type 6 (document) records."
 msgstr "Meerdere type 6 (document) records."
 
-#: src/data/sys-file-reader.c:786
+#: src/data/sys-file-reader.c:794
 #, c-format
 msgid "Number of document lines (%d) must be greater than 0."
 msgstr "Aantal documentregels (%d) moet groter dan 0 zijn."
 
-#: src/data/sys-file-reader.c:794
+#: src/data/sys-file-reader.c:802
 msgid "Document line contains null byte."
 msgstr "Documentregel bevat null byte."
 
-#: src/data/sys-file-reader.c:885
+#: src/data/sys-file-reader.c:893
 #, c-format
 msgid ""
 "Unrecognized record type 7, subtype %d.  Please send a copy of this file, "
@@ -857,12 +852,12 @@ msgstr ""
 "Niet-herkend type 7, subtype %d.  Stuur s.v.p. een kopie van dit bestand en "
 "de syntax waarmee het is aangemaakt naar %s "
 
-#: src/data/sys-file-reader.c:912 tests/dissect-sysfile.c:590
+#: src/data/sys-file-reader.c:920 tests/dissect-sysfile.c:594
 #, c-format
 msgid "Bad size (%zu) or count (%zu) field on record type 7, subtype 3."
 msgstr "Onjuiste lengte (%zu) of aantal (%zu) veld in recordtype 7, subtype 3."
 
-#: src/data/sys-file-reader.c:932
+#: src/data/sys-file-reader.c:940
 #, c-format
 msgid ""
 "Floating-point representation indicated by system file (%d) differs from "
@@ -871,15 +866,15 @@ msgstr ""
 "Drijvende komma representatie aangegeven door systeembestand %d verschilt "
 "van verwachting (%d)."
 
-#: src/data/sys-file-reader.c:945 src/language/dictionary/sys-file-info.c:110
+#: src/data/sys-file-reader.c:953 src/language/dictionary/sys-file-info.c:110
 msgid "Little Endian"
 msgstr "Little Endian"
 
-#: src/data/sys-file-reader.c:945 src/language/dictionary/sys-file-info.c:109
+#: src/data/sys-file-reader.c:953 src/language/dictionary/sys-file-info.c:109
 msgid "Big Endian"
 msgstr "Big Endian"
 
-#: src/data/sys-file-reader.c:946
+#: src/data/sys-file-reader.c:954
 #, c-format
 msgid ""
 "Integer format indicated by system file (%s) differs from expected (%s)."
@@ -887,71 +882,71 @@ msgstr ""
 "Integer indeling aangegeven door systeembestand (%s) verschilt van verwacht "
 "(%s)."
 
-#: src/data/sys-file-reader.c:1003 tests/dissect-sysfile.c:621
+#: src/data/sys-file-reader.c:1011 tests/dissect-sysfile.c:625
 #, c-format
 msgid "Bad size (%zu) or count (%zu) on extension 4."
 msgstr "Onjuiste lengte (%zu) of aantal (%zu) bij extensie 4."
 
-#: src/data/sys-file-reader.c:1007 src/data/sys-file-reader.c:1011
-#: src/data/sys-file-reader.c:1015 tests/dissect-sysfile.c:626
-#: tests/dissect-sysfile.c:631 tests/dissect-sysfile.c:636
+#: src/data/sys-file-reader.c:1015 src/data/sys-file-reader.c:1019
+#: src/data/sys-file-reader.c:1023 tests/dissect-sysfile.c:630
+#: tests/dissect-sysfile.c:635 tests/dissect-sysfile.c:640
 #, c-format
 msgid "File specifies unexpected value %g as %s."
 msgstr "Bestand specificeert onverwachte waarde %g als %s."
 
-#: src/data/sys-file-reader.c:1048
+#: src/data/sys-file-reader.c:1056
 #, fuzzy, c-format
 msgid "Missing space following 'C' at offset %zu in MRSETS record"
 msgstr "Dubbele variabelenaam %s op offset %zu in MRSETS record."
 
-#: src/data/sys-file-reader.c:1066 tests/dissect-sysfile.c:687
+#: src/data/sys-file-reader.c:1074 tests/dissect-sysfile.c:691
 #, fuzzy, c-format
 msgid "Missing space following 'E' at offset %zu in MRSETS record"
 msgstr "Dubbele variabelenaam %s op offset %zu in MRSETS record."
 
-#: src/data/sys-file-reader.c:1075 tests/dissect-sysfile.c:696
+#: src/data/sys-file-reader.c:1083 tests/dissect-sysfile.c:700
 #, fuzzy, c-format
 msgid ""
 "Unexpected label source value \"%s\" following 'E' at offset %zu in MRSETS "
 "record"
 msgstr "Dubbele variabelenaam %s op offset %zu in MRSETS record."
 
-#: src/data/sys-file-reader.c:1081
+#: src/data/sys-file-reader.c:1089
 #, fuzzy, c-format
 msgid "Missing 'C', 'D', or 'E' at offset %zu in MRSETS record."
 msgstr "Dubbele variabelenaam %s op offset %zu in MRSETS record."
 
-#: src/data/sys-file-reader.c:1110
+#: src/data/sys-file-reader.c:1118
 #, fuzzy, c-format
 msgid "Missing new-line parsing variable names at offset %zu in MRSETS record."
 msgstr "Dubbele variabelenaam %s op offset %zu in MRSETS record."
 
-#: src/data/sys-file-reader.c:1121
+#: src/data/sys-file-reader.c:1129
 #, c-format
 msgid "Duplicate variable name %s at offset %zu in MRSETS record."
 msgstr "Dubbele variabelenaam %s op offset %zu in MRSETS record."
 
-#: src/data/sys-file-reader.c:1134
+#: src/data/sys-file-reader.c:1142
 #, c-format
 msgid "MRSET %s contains both string and numeric variables."
 msgstr "MRSET %s bevat zowel tekenreeks als numerieke variabelen."
 
-#: src/data/sys-file-reader.c:1149
+#: src/data/sys-file-reader.c:1157
 #, fuzzy, c-format
 msgid "MRSET %s has only %zu variables."
 msgstr "MRSET %s bevat zowel tekenreeks als numerieke variabelen."
 
-#: src/data/sys-file-reader.c:1186 tests/dissect-sysfile.c:754
+#: src/data/sys-file-reader.c:1194 tests/dissect-sysfile.c:758
 #, c-format
 msgid "Bad size %zu on extension 11."
 msgstr "Onjuiste lengte %zu voor extensie 11."
 
-#: src/data/sys-file-reader.c:1198 tests/dissect-sysfile.c:766
+#: src/data/sys-file-reader.c:1206 tests/dissect-sysfile.c:770
 #, c-format
 msgid "Extension 11 has bad count %zu (for %zu variables)."
 msgstr "Extensie 11 heeft een foutief aantal %zu (voor %zu variabelen)."
 
-#: src/data/sys-file-reader.c:1219
+#: src/data/sys-file-reader.c:1227
 #, c-format
 msgid ""
 "Invalid variable display parameters for variable %zu (%s).  Default "
@@ -960,22 +955,22 @@ msgstr ""
 "Ongeldige variabelen-toon-parameters voor variabele %zu (%s).  Verstek "
 "parameters ingevuld."
 
-#: src/data/sys-file-reader.c:1263
+#: src/data/sys-file-reader.c:1271
 #, c-format
 msgid "Long variable mapping from %s to invalid variable name `%s'."
 msgstr "Lange variabele afbeelding van %s tot ongeldige naam '%s'."
 
-#: src/data/sys-file-reader.c:1273
+#: src/data/sys-file-reader.c:1281
 #, c-format
 msgid "Duplicate long variable name `%s' within system file."
 msgstr "Dubbele lange variabelennaam '%s' binnen systeembestand."
 
-#: src/data/sys-file-reader.c:1326
+#: src/data/sys-file-reader.c:1334
 #, c-format
 msgid "%s listed as string of invalid length %s in very length string record."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1336
+#: src/data/sys-file-reader.c:1344
 #, c-format
 msgid ""
 "%s listed in very long string record with width %s, which requires only one "
@@ -984,12 +979,12 @@ msgstr ""
 "%s vermeld in erg lang tekenreeks-record met breedte %s, dat slechts een "
 "segment vereist."
 
-#: src/data/sys-file-reader.c:1342
+#: src/data/sys-file-reader.c:1350
 #, c-format
 msgid "Very long string %s overflows dictionary."
 msgstr "Erg lange-tekenreeks %s is te groot voor woordenboek."
 
-#: src/data/sys-file-reader.c:1356
+#: src/data/sys-file-reader.c:1364
 #, c-format
 msgid ""
 "Very long string with width %ld has segment %d of width %d (expected %d)"
@@ -997,12 +992,12 @@ msgstr ""
 "Erg lange-tekenreeks met breedte %ld heeft segment %d van breedte %d "
 "(verwacht %d)"
 
-#: src/data/sys-file-reader.c:1402
+#: src/data/sys-file-reader.c:1410
 #, c-format
 msgid "Invalid number of labels: %d.  Ignoring labels."
 msgstr "Ongeldig aantal labels: %d. Labels worden genegeerd."
 
-#: src/data/sys-file-reader.c:1433 tests/dissect-sysfile.c:464
+#: src/data/sys-file-reader.c:1441 tests/dissect-sysfile.c:468
 msgid ""
 "Variable index record (type 4) does not immediately follow value label "
 "record (type 3) as it should."
@@ -1010,7 +1005,7 @@ msgstr ""
 "Variabele index record (type 4) volgt niet onmiddellijk waardelabel record "
 "(type 3) zoals het moet."
 
-#: src/data/sys-file-reader.c:1440
+#: src/data/sys-file-reader.c:1448
 #, c-format
 msgid ""
 "Number of variables associated with a value label (%d) is not between 1 and "
@@ -1019,7 +1014,7 @@ msgstr ""
 "Aantal variabelen geassocieerd aan waardelabel (%d) is niet tussen 1 en het "
 "aantal variabelen (%zu)."
 
-#: src/data/sys-file-reader.c:1451
+#: src/data/sys-file-reader.c:1459
 #, c-format
 msgid ""
 "Value labels may not be added to long string variables (e.g. %s) using "
@@ -1028,7 +1023,7 @@ msgstr ""
 "Waardelabels mogen niet toegevoegd aan lange tekenreeks-variabelen (bv %s) "
 "bij het gebruik van records types 3 en 4."
 
-#: src/data/sys-file-reader.c:1460
+#: src/data/sys-file-reader.c:1468
 #, c-format
 msgid ""
 "Variables associated with value label are not all of identical type.  "
@@ -1037,125 +1032,125 @@ msgstr ""
 "Variabelen geassocieerd met waardelabel zijn niet allemaal van het identieke "
 "type.  Variabele %s is %s, maar variabele %s is %s."
 
-#: src/data/sys-file-reader.c:1494
+#: src/data/sys-file-reader.c:1502
 #, c-format
 msgid "Duplicate value label for %g on %s."
 msgstr "Dubbel waardelabel voor %g in %s."
 
-#: src/data/sys-file-reader.c:1497 src/data/sys-file-reader.c:1678
+#: src/data/sys-file-reader.c:1505 src/data/sys-file-reader.c:1686
 #, c-format
 msgid "Duplicate value label for \"%.*s\" on %s."
 msgstr "Dubbel waardelabel voor \"%.*s\" in %s."
 
-#: src/data/sys-file-reader.c:1535
+#: src/data/sys-file-reader.c:1543
 #, c-format
 msgid "Error parsing attribute value %s[%d]"
 msgstr "Fout tijdens ontleden attribuut waarde %s[%d]"
 
-#: src/data/sys-file-reader.c:1549
+#: src/data/sys-file-reader.c:1557
 #, c-format
 msgid "Attribute value %s[%d] is not quoted: %s"
 msgstr "Attribuut waarde %s[%d] is niet geciteerd: %s"
 
-#: src/data/sys-file-reader.c:1612 tests/dissect-sysfile.c:932
+#: src/data/sys-file-reader.c:1620 tests/dissect-sysfile.c:936
 #, c-format
 msgid ""
 "Variable name length in long string value label record (%d) exceeds %d-byte "
 "limit."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1622
+#: src/data/sys-file-reader.c:1630
 #, c-format
 msgid "Ignoring long string value record for unknown variable %s."
 msgstr "Negeren lange tekenreeks waarde record voor onbekende variabele %s."
 
-#: src/data/sys-file-reader.c:1629
+#: src/data/sys-file-reader.c:1637
 #, c-format
 msgid "Ignoring long string value record for numeric variable %s."
 msgstr "Negeren lange tekenreeks waarde record voor numerieke variabele %s."
 
-#: src/data/sys-file-reader.c:1636
+#: src/data/sys-file-reader.c:1644
 #, c-format
 msgid ""
 "Ignoring long string value record for variable %s because the record's width "
 "(%d) does not match the variable's width (%d)"
 msgstr ""
 
-#: src/data/sys-file-reader.c:1658
+#: src/data/sys-file-reader.c:1666
 #, c-format
 msgid ""
 "Ignoring long string value %zu for variable %s, with width %d, that has bad "
 "value width %zu."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1773
+#: src/data/sys-file-reader.c:1781
 msgid "File ends in partial case."
 msgstr "Bestand eindigt in gedeeltelijke case."
 
-#: src/data/sys-file-reader.c:1781
+#: src/data/sys-file-reader.c:1789
 #, c-format
 msgid "Error reading case from file %s."
 msgstr "Fout tijdens lezen case van bestand %s."
 
-#: src/data/sys-file-reader.c:1882
+#: src/data/sys-file-reader.c:1890
 msgid ""
 "Possible compressed data corruption: compressed spaces appear in numeric "
 "field."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1935
+#: src/data/sys-file-reader.c:1943
 #, c-format
 msgid ""
 "Possible compressed data corruption: string contains compressed integer "
 "(opcode %d)"
 msgstr ""
 
-#: src/data/sys-file-reader.c:2027
+#: src/data/sys-file-reader.c:2035
 #, c-format
 msgid "Variable index %d not in valid range 1...%d."
 msgstr "Variabele index %d niet in geldig bereik 1...%d."
 
-#: src/data/sys-file-reader.c:2032
+#: src/data/sys-file-reader.c:2040
 #, c-format
 msgid "Variable index %d refers to long string continuation."
 msgstr "Variabele index %d verwijst naar lange-tekenreeks voortzetting."
 
-#: src/data/sys-file-reader.c:2100
+#: src/data/sys-file-reader.c:2108
 #, c-format
 msgid "Suppressed %d additional related warnings."
 msgstr "Onderdrukt %d extra gerelateerde waarschuwingen."
 
-#: src/data/sys-file-reader.c:2141
+#: src/data/sys-file-reader.c:2153 src/data/sys-file-reader.c:2170
 #, fuzzy, c-format
 msgid "Dictionary record refers to unknown variable %s."
 msgstr "Variabele afbeelding refereert aan onbekende variabele %s."
 
-#: src/data/sys-file-reader.c:2202
+#: src/data/sys-file-reader.c:2231
 #, fuzzy, c-format
 msgid "Expecting digit at offset %zu in MRSETS record."
 msgstr "Dubbele variabelenaam %s op offset %zu in MRSETS record."
 
-#: src/data/sys-file-reader.c:2209
+#: src/data/sys-file-reader.c:2238
 #, fuzzy, c-format
 msgid "Expecting space at offset %zu in MRSETS record."
 msgstr "Dubbele variabelenaam %s op offset %zu in MRSETS record."
 
-#: src/data/sys-file-reader.c:2216
+#: src/data/sys-file-reader.c:2245
 #, c-format
 msgid "%zu-byte string starting at offset %zu exceeds record length %zu."
 msgstr ""
 
-#: src/data/sys-file-reader.c:2226
+#: src/data/sys-file-reader.c:2255
 #, c-format
 msgid "Expecting space at offset %zu following %zu-byte string."
 msgstr ""
 
-#: src/data/sys-file-reader.c:2318 tests/dissect-sysfile.c:1337
+#: src/data/sys-file-reader.c:2347 tests/dissect-sysfile.c:1341
 #, c-format
 msgid "System error: %s."
 msgstr "Systeemfout: %s."
 
-#: src/data/sys-file-reader.c:2320 tests/dissect-sysfile.c:1339
+#: src/data/sys-file-reader.c:2349 tests/dissect-sysfile.c:1343
 msgid "Unexpected end of file."
 msgstr "Onverwacht einde-bestand."
 
@@ -1176,7 +1171,7 @@ msgid "An I/O error occurred writing system file \"%s\"."
 msgstr ""
 "Een I/O fout is opgetreden tijdens het schrijven van systeembestand \"%s\"."
 
-#: src/data/variable.c:215
+#: src/data/variable.c:206
 #, c-format
 msgid ""
 "Character `%c' (in %s) may not appear as the first character in a variable "
@@ -1184,21 +1179,21 @@ msgid ""
 msgstr ""
 "Teken '%c' (in %s) mag niet als eerste teken in een variabelennaam voorkomen."
 
-#: src/data/variable.c:227
+#: src/data/variable.c:218
 #, c-format
 msgid "Character `%c' (in %s) may not appear in a variable name."
 msgstr "Teken '%c' (in %s) mag niet in een variabelennaam voorkomen."
 
-#: src/data/variable.c:253
+#: src/data/variable.c:244
 msgid "Variable name cannot be empty string."
 msgstr "Variabelennaam kan geen lege tekenreeks zijn."
 
-#: src/data/variable.c:259
+#: src/data/variable.c:250
 #, c-format
 msgid "Variable name %s exceeds %d-character limit."
 msgstr "Variabelennaam %s overschrijdt de limiet van %d tekens."
 
-#: src/data/variable.c:267
+#: src/data/variable.c:258
 #, c-format
 msgid "`%s' may not be used as a variable name because it is a reserved word."
 msgstr ""
@@ -2168,7 +2163,7 @@ msgid "IBM 390 Hex Long."
 msgstr "IBM 390 Hex Long."
 
 #: src/language/dictionary/sys-file-info.c:120 src/ui/gui/descriptives.ui:85
-#: src/ui/gui/factor.ui:161 src/ui/gui/recode.ui:960
+#: src/ui/gui/factor.ui:173 src/ui/gui/recode.ui:960
 msgid "Variables:"
 msgstr "Variabelen:"
 
@@ -2181,7 +2176,7 @@ msgid "Type:"
 msgstr "Type:"
 
 #: src/language/dictionary/sys-file-info.c:128
-#: src/ui/gui/psppire-data-window.c:629
+#: src/ui/gui/psppire-data-window.c:631
 msgid "System File"
 msgstr "Systeembestand"
 
@@ -2555,7 +2550,7 @@ msgstr "Doelvariabele %s dupliceert bestaande variabele %s."
 msgid "Variable %s is not dichotomous"
 msgstr "Variabele %s is niet dichotomisch "
 
-#: src/language/stats/binomial.c:192
+#: src/language/stats/binomial.c:192 src/ui/gui/binomial.ui:13
 msgid "Binomial Test"
 msgstr "Binomiaal Test"
 
@@ -2568,13 +2563,13 @@ msgid "Group2"
 msgstr "Groep2"
 
 #: src/language/stats/binomial.c:224 src/language/stats/chisquare.c:177
-#: src/language/stats/chisquare.c:236 src/language/stats/factor.c:1188
+#: src/language/stats/chisquare.c:236 src/language/stats/factor.c:1462
 #: src/language/stats/sign.c:92 src/language/stats/wilcoxon.c:260
 #: src/ui/gui/crosstabs-dialog.c:60 src/language/stats/crosstabs.q:823
 #: src/language/stats/crosstabs.q:1151 src/language/stats/crosstabs.q:1528
 #: src/language/stats/examine.q:1105 src/language/stats/frequencies.q:871
 #: src/language/stats/oneway.q:302 src/language/stats/oneway.q:472
-#: src/language/stats/regression.q:306 src/language/stats/reliability.q:702
+#: src/language/stats/regression.q:291 src/language/stats/reliability.q:702
 msgid "Total"
 msgstr "Totaal"
 
@@ -2583,8 +2578,8 @@ msgstr "Totaal"
 msgid "Category"
 msgstr "Categorie"
 
-#: src/language/stats/binomial.c:258 src/language/stats/correlations.c:120
-#: src/language/stats/correlations.c:228 src/language/stats/npar-summary.c:122
+#: src/language/stats/binomial.c:258 src/language/stats/correlations.c:119
+#: src/language/stats/correlations.c:227 src/language/stats/npar-summary.c:122
 #: src/language/stats/sign.c:72 src/language/stats/wilcoxon.c:243
 #: src/language/stats/crosstabs.q:830 src/language/stats/examine.q:1176
 #: src/language/stats/frequencies.q:1034 src/language/stats/oneway.q:385
@@ -2625,7 +2620,7 @@ msgid "Expected N"
 msgstr "Verwacht N"
 
 #: src/language/stats/chisquare.c:163 src/language/stats/chisquare.c:202
-#: src/ui/gui/crosstabs-dialog.c:62 src/language/stats/regression.q:305
+#: src/ui/gui/crosstabs-dialog.c:62 src/language/stats/regression.q:290
 msgid "Residual"
 msgstr "Overblijvend"
 
@@ -2645,7 +2640,7 @@ msgstr "Chi-Square"
 
 #: src/language/stats/chisquare.c:264 src/language/stats/crosstabs.q:1215
 #: src/language/stats/oneway.q:275 src/language/stats/oneway.q:685
-#: src/language/stats/regression.q:299 src/language/stats/t-test.q:752
+#: src/language/stats/regression.q:284 src/language/stats/t-test.q:752
 #: src/language/stats/t-test.q:923 src/language/stats/t-test.q:1010
 msgid "df"
 msgstr "df"
@@ -2654,13 +2649,13 @@ msgstr "df"
 msgid "Asymp. Sig."
 msgstr ""
 
-#: src/language/stats/correlations.c:97 src/language/stats/factor.c:1431
+#: src/language/stats/correlations.c:96 src/language/stats/factor.c:1720
 #: src/language/stats/npar-summary.c:108
 msgid "Descriptive Statistics"
 msgstr "Descriptieve Statistieken"
 
-#: src/language/stats/correlations.c:118 src/language/stats/descriptives.c:101
-#: src/language/stats/factor.c:1452 src/language/stats/npar-summary.c:125
+#: src/language/stats/correlations.c:117 src/language/stats/descriptives.c:101
+#: src/language/stats/factor.c:1741 src/language/stats/npar-summary.c:125
 #: src/ui/gui/descriptives-dialog.c:40 src/ui/gui/frequencies-dialog.c:41
 #: src/language/stats/examine.q:1444 src/language/stats/frequencies.q:105
 #: src/language/stats/oneway.q:386 src/language/stats/t-test.q:506
@@ -2669,7 +2664,7 @@ msgstr "Descriptieve Statistieken"
 msgid "Mean"
 msgstr "Gemiddelde "
 
-#: src/language/stats/correlations.c:119 src/language/stats/factor.c:1453
+#: src/language/stats/correlations.c:118 src/language/stats/factor.c:1742
 #: src/language/stats/npar-summary.c:128 src/language/stats/examine.q:1479
 #: src/language/stats/oneway.q:387 src/language/stats/t-test.q:507
 #: src/language/stats/t-test.q:527 src/language/stats/t-test.q:626
@@ -2677,33 +2672,33 @@ msgstr "Gemiddelde "
 msgid "Std. Deviation"
 msgstr "Std. Deviatie"
 
-#: src/language/stats/correlations.c:191 src/language/stats/factor.c:1331
+#: src/language/stats/correlations.c:190 src/language/stats/factor.c:1620
 msgid "Correlations"
 msgstr "Correlatie"
 
-#: src/language/stats/correlations.c:217
+#: src/language/stats/correlations.c:216
 msgid "Pearson Correlation"
 msgstr "Pearson Correlatie"
 
-#: src/language/stats/correlations.c:219 src/language/stats/oneway.q:686
+#: src/language/stats/correlations.c:218 src/language/stats/oneway.q:686
 #: src/language/stats/t-test.q:753 src/language/stats/t-test.q:924
 #: src/language/stats/t-test.q:1011
 msgid "Sig. (2-tailed)"
 msgstr ""
 
-#: src/language/stats/correlations.c:219
+#: src/language/stats/correlations.c:218
 msgid "Sig. (1-tailed)"
 msgstr ""
 
-#: src/language/stats/correlations.c:223
+#: src/language/stats/correlations.c:222
 msgid "Cross-products"
 msgstr ""
 
-#: src/language/stats/correlations.c:224
+#: src/language/stats/correlations.c:223
 msgid "Covariance"
 msgstr "Covariantie"
 
-#: src/language/stats/correlations.c:446 src/language/stats/descriptives.c:361
+#: src/language/stats/correlations.c:454 src/language/stats/descriptives.c:361
 #: src/language/data-io/list.q:91
 msgid "No variables specified."
 msgstr "Geen variabelen gespecificeerd."
@@ -2833,47 +2828,39 @@ msgstr "')' verwacht."
 msgid "Variable %s specified twice in sort criteria."
 msgstr "Variabele %s 2 keer opgegeven in sorteer criteria."
 
-#: src/language/stats/factor.c:558
+#: src/language/stats/factor.c:803
 msgid "Factor analysis on a single variable is not useful."
 msgstr "Factor analyse op een enkele variabele is niet zinvol."
 
-#: src/language/stats/factor.c:939
+#: src/language/stats/factor.c:1206
 msgid "Component Number"
 msgstr "Component-nummer "
 
-#: src/language/stats/factor.c:939
+#: src/language/stats/factor.c:1206
 msgid "Factor Number"
 msgstr "Factor Nummer"
 
-#: src/language/stats/factor.c:970
+#: src/language/stats/factor.c:1237
 msgid "Communalities"
 msgstr ""
 
-#: src/language/stats/factor.c:976
+#: src/language/stats/factor.c:1243
 msgid "Initial"
 msgstr "Initieel "
 
-#: src/language/stats/factor.c:979
+#: src/language/stats/factor.c:1246
 msgid "Extraction"
 msgstr ""
 
-#: src/language/stats/factor.c:1029
-msgid "Component Matrix"
-msgstr "Component-Matrix"
-
-#: src/language/stats/factor.c:1031
-msgid "Factor Matrix"
-msgstr "Factor-Matrix:"
-
-#: src/language/stats/factor.c:1039 src/language/stats/factor.c:1163
+#: src/language/stats/factor.c:1310 src/language/stats/factor.c:1437
 msgid "Component"
 msgstr "Component"
 
-#: src/language/stats/factor.c:1044 src/language/stats/factor.c:1165
+#: src/language/stats/factor.c:1315 src/language/stats/factor.c:1439
 msgid "Factor"
 msgstr "Factor"
 
-#: src/language/stats/factor.c:1076 src/language/stats/factor.c:1219
+#: src/language/stats/factor.c:1347 src/language/stats/factor.c:1495
 #: src/ui/gui/psppire-data-store.c:755 src/ui/gui/psppire-var-store.c:699
 #: src/ui/gui/psppire-var-store.c:709 src/ui/gui/psppire-var-store.c:719
 #: src/ui/gui/psppire-var-store.c:825
@@ -2881,59 +2868,77 @@ msgstr "Factor"
 msgid "%d"
 msgstr "%d"
 
-#: src/language/stats/factor.c:1138
+#: src/language/stats/factor.c:1412
 msgid "Total Variance Explained"
 msgstr ""
 
-#: src/language/stats/factor.c:1170
+#: src/language/stats/factor.c:1444
 msgid "Initial Eigenvalues"
 msgstr ""
 
-#: src/language/stats/factor.c:1176
+#: src/language/stats/factor.c:1450
 msgid "Extraction Sums of Squared Loadings"
 msgstr ""
 
-#: src/language/stats/factor.c:1182
+#: src/language/stats/factor.c:1456
 msgid "Rotation Sums of Squared Loadings"
 msgstr ""
 
-#: src/language/stats/factor.c:1190
+#: src/language/stats/factor.c:1464
 #, no-c-format
 msgid "% of Variance"
 msgstr "% van Variatie"
 
-#: src/language/stats/factor.c:1191
+#: src/language/stats/factor.c:1465
 msgid "Cumulative %"
 msgstr "Cumulatieve %"
 
-#: src/language/stats/factor.c:1289
+#: src/language/stats/factor.c:1578
 msgid "Correlation Matrix"
 msgstr "Correlatie-Matrix"
 
-#: src/language/stats/factor.c:1343
+#: src/language/stats/factor.c:1632
 msgid "Sig. 1-tailed"
 msgstr ""
 
-#: src/language/stats/factor.c:1377
+#: src/language/stats/factor.c:1666
 msgid "Determinant"
 msgstr "Determinant"
 
-#: src/language/stats/factor.c:1454
+#: src/language/stats/factor.c:1743
 msgid "Analysis N"
 msgstr "Analyses N"
 
-#: src/language/stats/factor.c:1487
+#: src/language/stats/factor.c:1776
 msgid ""
 "The FACTOR criteria result in zero factors extracted. Therefore no analysis "
 "will be performed."
 msgstr ""
 
-#: src/language/stats/factor.c:1493
+#: src/language/stats/factor.c:1782
 msgid ""
 "The FACTOR criteria result in more factors than variables, which is not "
 "meaningful. No analysis will be performed."
 msgstr ""
 
+#: src/language/stats/factor.c:1865
+msgid "Component Matrix"
+msgstr "Component-Matrix"
+
+#: src/language/stats/factor.c:1865
+msgid "Factor Matrix"
+msgstr "Factor-Matrix:"
+
+#: src/language/stats/factor.c:1871
+#, fuzzy
+msgid "Rotated Component Matrix"
+msgstr "Component-Matrix"
+
+#: src/language/stats/factor.c:1871
+#, fuzzy
+msgid "Rotated Factor Matrix"
+msgstr "Factor-Matrix:"
+
 #: src/language/stats/flip.c:98
 msgid ""
 "FLIP ignores TEMPORARY.  Temporary transformations will be made permanent."
@@ -3024,7 +3029,7 @@ msgstr ""
 
 #: src/language/stats/roc.c:952 src/language/stats/examine.q:1641
 #: src/language/stats/oneway.q:388 src/language/stats/oneway.q:683
-#: src/language/stats/regression.q:201
+#: src/language/stats/regression.q:198
 msgid "Std. Error"
 msgstr "Std. Fout"
 
@@ -3917,7 +3922,7 @@ msgstr ""
 msgid "ascii: opening output file \"%s\""
 msgstr "ascii: openen uitvoerbestand \"%s\""
 
-#: src/output/ascii.c:913 src/output/cairo.c:826
+#: src/output/ascii.c:913 src/output/cairo.c:784
 #, c-format
 msgid "%s - Page %d"
 msgstr "%s - Pagina %d"
@@ -4036,12 +4041,12 @@ msgid ""
 "bad box: (%d+%d=%d,%d+%d=%d)-(%d+%d=%d,%d+%d=%d) in table size (%d,%d)\n"
 msgstr ""
 
-#: src/output/cairo.c:283
+#: src/output/cairo.c:295
 #, c-format
 msgid "error opening output file \"%s\": %s"
 msgstr "fout tijdens openen uitvoerbestand \"%s\": %s"
 
-#: src/output/cairo.c:301
+#: src/output/cairo.c:312
 #, c-format
 msgid ""
 "The defined page is not wide enough to hold at least %d characters in the "
@@ -4050,7 +4055,7 @@ msgstr ""
 "De gedefinieerde pagina is niet breed om ten minste %d tekens in het verstek "
 "font te bevatten. In feite is er slechts plaats voor %d tekens."
 
-#: src/output/cairo.c:311
+#: src/output/cairo.c:322
 #, c-format
 msgid ""
 "The defined page is not long enough to hold margins and headers, plus least %"
@@ -4060,17 +4065,17 @@ msgstr ""
 "tenminste %d regels van het verstek font te bevatten.  In feite is er "
 "slechts plaats voor %d regels."
 
-#: src/output/cairo.c:364
+#: src/output/cairo.c:376
 #, c-format
 msgid "error drawing output for %s driver: %s"
 msgstr "fout tijdens tekenen uitvoer voor %s driver: %s "
 
-#: src/output/cairo.c:906
+#: src/output/cairo.c:864
 #, c-format
 msgid "\"%s\": bad font specification"
 msgstr "\"%s\": slechte fontspecificatie"
 
-#: src/output/cairo.c:1116
+#: src/output/cairo.c:1084
 #, c-format
 msgid "error writing output file \"%s\": %s"
 msgstr "fout tijdens schrijven uitvoerbestand \"%s\": %s"
@@ -4275,7 +4280,7 @@ msgstr "Standaardfout"
 msgid "Bad regular expression: %s"
 msgstr "Onjuiste regulaire expressie: %s"
 
-#: src/ui/gui/factor-dialog.c:230
+#: src/ui/gui/factor-dialog.c:344
 #, c-format
 msgid "Eigenvalues over %4.2f times the mean eigenvalue"
 msgstr ""
@@ -4301,7 +4306,7 @@ msgstr ""
 msgid "Median"
 msgstr "Mediaan"
 
-#: src/ui/gui/helper.c:196
+#: src/ui/gui/helper.c:197
 msgid "Sorry. The help system hasn't yet been implemented."
 msgstr "Sorry. Het help systeem is nog niet geïmplementeerd."
 
@@ -4365,106 +4370,106 @@ msgstr "Variabelenweergave"
 msgid "var"
 msgstr "var"
 
-#: src/ui/gui/psppire-data-window.c:210
+#: src/ui/gui/psppire-data-window.c:212
 msgid "Transformations Pending"
 msgstr "Transformaties uitstaand"
 
-#: src/ui/gui/psppire-data-window.c:226
+#: src/ui/gui/psppire-data-window.c:228
 msgid "Filter off"
 msgstr "Filter uit"
 
-#: src/ui/gui/psppire-data-window.c:240
+#: src/ui/gui/psppire-data-window.c:242
 #, c-format
 msgid "Filter by %s"
 msgstr "Filter op %s"
 
-#: src/ui/gui/psppire-data-window.c:261
+#: src/ui/gui/psppire-data-window.c:263
 msgid "No Split"
 msgstr "Geen splits"
 
-#: src/ui/gui/psppire-data-window.c:270
+#: src/ui/gui/psppire-data-window.c:272
 msgid "Split by "
 msgstr "Splits op "
 
-#: src/ui/gui/psppire-data-window.c:298
+#: src/ui/gui/psppire-data-window.c:300
 msgid "Weights off"
 msgstr "Weging uit"
 
-#: src/ui/gui/psppire-data-window.c:312
+#: src/ui/gui/psppire-data-window.c:314
 #, c-format
 msgid "Weight by %s"
 msgstr "Weeg op %s"
 
-#: src/ui/gui/psppire-data-window.c:380
+#: src/ui/gui/psppire-data-window.c:382
 msgid "Open"
 msgstr "Open"
 
-#: src/ui/gui/psppire-data-window.c:390
+#: src/ui/gui/psppire-data-window.c:392
 msgid "Data and Syntax Files"
 msgstr "Gegevens- en Syntax-bestanden"
 
-#: src/ui/gui/psppire-data-window.c:400 src/ui/gui/psppire-data-window.c:609
+#: src/ui/gui/psppire-data-window.c:402 src/ui/gui/psppire-data-window.c:611
 msgid "System Files (*.sav)"
 msgstr "Systeembestanden (*.sav)"
 
-#: src/ui/gui/psppire-data-window.c:406 src/ui/gui/psppire-data-window.c:615
+#: src/ui/gui/psppire-data-window.c:408 src/ui/gui/psppire-data-window.c:617
 msgid "Portable Files (*.por) "
 msgstr "Overdraagbaar (Portable) bestanden (*.por)"
 
-#: src/ui/gui/psppire-data-window.c:412 src/ui/gui/psppire-syntax-window.c:292
+#: src/ui/gui/psppire-data-window.c:414 src/ui/gui/psppire-syntax-window.c:292
 msgid "Syntax Files (*.sps) "
 msgstr "Syntaxbestanden (*.sps)"
 
-#: src/ui/gui/psppire-data-window.c:418 src/ui/gui/psppire-data-window.c:621
+#: src/ui/gui/psppire-data-window.c:420 src/ui/gui/psppire-data-window.c:623
 #: src/ui/gui/psppire-syntax-window.c:298
 msgid "All Files"
 msgstr "Alle bestanden"
 
-#: src/ui/gui/psppire-data-window.c:601
+#: src/ui/gui/psppire-data-window.c:603
 msgid "Save"
 msgstr "Opslaan"
 
-#: src/ui/gui/psppire-data-window.c:634
+#: src/ui/gui/psppire-data-window.c:636
 msgid "Portable File"
 msgstr "Overdraagbaar bestand"
 
-#: src/ui/gui/psppire-data-window.c:771
+#: src/ui/gui/psppire-data-window.c:773
 msgid "Font Selection"
 msgstr "Font selectie"
 
-#: src/ui/gui/psppire-data-window.c:1255
+#: src/ui/gui/psppire-data-window.c:1261
 msgid "Data Editor"
 msgstr "Gegevensbewerker"
 
-#: src/ui/gui/psppire-output-window.c:441
+#: src/ui/gui/psppire-output-window.c:458
 msgid "Export Output"
 msgstr "Exporteer Uitvoer"
 
-#: src/ui/gui/psppire-output-window.c:449
+#: src/ui/gui/psppire-output-window.c:466
 msgid "PDF Files (*.pdf)"
 msgstr "PDF-bestanden (*.pdf)"
 
-#: src/ui/gui/psppire-output-window.c:450
+#: src/ui/gui/psppire-output-window.c:467
 msgid "HTML Files (*.html)"
 msgstr "HTML-bestanden (*.html)"
 
-#: src/ui/gui/psppire-output-window.c:451
+#: src/ui/gui/psppire-output-window.c:468
 msgid "OpenDocument Files (*.odt)"
 msgstr "OpenDocument-bestanden (*.odt)"
 
-#: src/ui/gui/psppire-output-window.c:452
+#: src/ui/gui/psppire-output-window.c:469
 msgid "Text Files (*.txt)"
 msgstr "Textbestanden (*.txt)"
 
-#: src/ui/gui/psppire-output-window.c:453
+#: src/ui/gui/psppire-output-window.c:470
 msgid "PostScript Files (*.ps)"
 msgstr "PostScript-bestanden (*.ps)"
 
-#: src/ui/gui/psppire-output-window.c:454
+#: src/ui/gui/psppire-output-window.c:471
 msgid "Comma-Separated Value Files (*.csv)"
 msgstr "Komma-Gescheiden-Waarde-bestanden (*.csv)"
 
-#: src/ui/gui/psppire-output-window.c:584
+#: src/ui/gui/psppire-output-window.c:605
 msgid "Output Viewer"
 msgstr "Uitvoer Viewer"
 
@@ -4593,7 +4598,7 @@ msgstr "Hercodeer in Zelfde Variabelen: Oude en Nieuwe Waardes "
 msgid "Coeff"
 msgstr "Coeff"
 
-#: src/ui/gui/regression-dialog.c:43 src/language/stats/regression.q:158
+#: src/ui/gui/regression-dialog.c:43 src/language/stats/regression.q:155
 msgid "R"
 msgstr "R"
 
@@ -4753,27 +4758,27 @@ msgstr "Weeg cases niet"
 msgid "Weight cases by %s"
 msgstr "Weeg cases per %s"
 
-#: tests/dissect-sysfile.c:567
+#: tests/dissect-sysfile.c:571
 #, c-format
 msgid "Unrecognized record type 7, subtype %d."
 msgstr "Niet-herkend recordtype 7, subtype %d."
 
-#: tests/dissect-sysfile.c:846
+#: tests/dissect-sysfile.c:850
 #, c-format
 msgid "%s: Error parsing attribute value %s[%d]"
 msgstr "%s: Fout bij het ontleden van attribuut waarde %s[%d]"
 
-#: tests/dissect-sysfile.c:852
+#: tests/dissect-sysfile.c:856
 #, c-format
 msgid "%s: Attribute value %s[%d] is not quoted: %s"
 msgstr "%s: Attribuut waarde %s[%d] is niet geciteerd: %s"
 
-#: tests/dissect-sysfile.c:876
+#: tests/dissect-sysfile.c:880
 #, fuzzy, c-format
 msgid "Bad size %zu for extended number of cases."
 msgstr "Onjuiste lengte %zu voor extensie 11."
 
-#: tests/dissect-sysfile.c:882
+#: tests/dissect-sysfile.c:886
 #, fuzzy, c-format
 msgid "Bad count %zu for extended number of cases."
 msgstr "Onjuiste lengte %zu voor extensie 11."
@@ -5244,14 +5249,10 @@ msgstr ""
 msgid "Omitting pie chart for %s, which has over 50 unique values."
 msgstr ""
 
-#: src/language/stats/glm.q:245
+#: src/language/stats/glm.q:248
 msgid "Multivariate GLM not yet supported"
 msgstr "Mutivariante GLM wordt nog niet ondersteund"
 
-#: src/language/stats/glm.q:355 src/language/stats/regression.q:998
-msgid "No valid data found. This command was skipped."
-msgstr "Geen geldige gegevens gevonden. Deze opdracht is overgeslagen."
-
 #: src/language/stats/means.q:100
 msgid "Missing required subcommand TABLES."
 msgstr "Mis vereiste subopdracht TABLES."
@@ -5260,18 +5261,18 @@ msgstr "Mis vereiste subopdracht TABLES."
 msgid "TABLES subcommand may not appear more than once."
 msgstr "TABLES-subopdracht mag niet meer dan 1 keer voorkomen."
 
-#: src/language/stats/npar.q:110
+#: src/language/stats/npar.q:111
 msgid "NPAR subcommand not currently implemented."
 msgstr ""
 
-#: src/language/stats/npar.q:254
+#: src/language/stats/npar.q:256
 #, c-format
 msgid ""
 "The specified value of HI (%d) is lower than the specified value of LO (%d)"
 msgstr ""
 "De opgegeven waarde van HI (%d) is lager dan de opgegeven waarde van LO (%d)"
 
-#: src/language/stats/npar.q:309
+#: src/language/stats/npar.q:311
 #, c-format
 msgid ""
 "%d expected values were given, but the specified range (%d-%d) requires "
@@ -5280,7 +5281,7 @@ msgstr ""
 "%d verwachte waardes waren opgegeven, maar het opgegeven bereik (%d-%d) "
 "vereist precies %d waardes."
 
-#: src/language/stats/npar.q:444 src/language/stats/t-test.q:380
+#: src/language/stats/npar.q:453 src/language/stats/t-test.q:380
 #, c-format
 msgid ""
 "PAIRED was specified but the number of variables preceding WITH (%zu) did "
@@ -5303,21 +5304,21 @@ msgstr ""
 msgid "`%s' is not a variable name"
 msgstr "'%s' is geen variabelennaam"
 
-#: src/language/stats/oneway.q:274 src/language/stats/regression.q:298
+#: src/language/stats/oneway.q:274 src/language/stats/regression.q:283
 msgid "Sum of Squares"
 msgstr ""
 
-#: src/language/stats/oneway.q:276 src/language/stats/regression.q:300
+#: src/language/stats/oneway.q:276 src/language/stats/regression.q:285
 msgid "Mean Square"
 msgstr ""
 
-#: src/language/stats/oneway.q:277 src/language/stats/regression.q:301
+#: src/language/stats/oneway.q:277 src/language/stats/regression.q:286
 #: src/language/stats/t-test.q:749
 msgid "F"
 msgstr "F"
 
 #: src/language/stats/oneway.q:278 src/language/stats/oneway.q:535
-#: src/language/stats/regression.q:204 src/language/stats/regression.q:302
+#: src/language/stats/regression.q:201 src/language/stats/regression.q:287
 msgid "Significance"
 msgstr "Significantie "
 
@@ -5329,7 +5330,7 @@ msgstr "Tussen groepen"
 msgid "Within Groups"
 msgstr "Binnen groepen"
 
-#: src/language/stats/oneway.q:345 src/language/stats/regression.q:327
+#: src/language/stats/oneway.q:345 src/language/stats/regression.q:312
 msgid "ANOVA"
 msgstr "ANOVA"
 
@@ -5365,7 +5366,7 @@ msgstr "Contrasttesten"
 msgid "Value of Contrast"
 msgstr ""
 
-#: src/language/stats/oneway.q:684 src/language/stats/regression.q:203
+#: src/language/stats/oneway.q:684 src/language/stats/regression.q:200
 #: src/language/stats/t-test.q:751 src/language/stats/t-test.q:922
 #: src/language/stats/t-test.q:1009
 msgid "t"
@@ -5434,64 +5435,68 @@ msgstr "Variabele %s bestaat al."
 msgid "Too many variables in INTO clause."
 msgstr "Te veel variabelen in INTO clausule."
 
-#: src/language/stats/regression.q:159
+#: src/language/stats/regression.q:156
 msgid "R Square"
 msgstr "R Square"
 
-#: src/language/stats/regression.q:160
+#: src/language/stats/regression.q:157
 msgid "Adjusted R Square"
 msgstr ""
 
-#: src/language/stats/regression.q:161
+#: src/language/stats/regression.q:158
 msgid "Std. Error of the Estimate"
 msgstr ""
 
-#: src/language/stats/regression.q:166
+#: src/language/stats/regression.q:163
 msgid "Model Summary"
 msgstr ""
 
-#: src/language/stats/regression.q:200
+#: src/language/stats/regression.q:197
 msgid "B"
 msgstr "B"
 
-#: src/language/stats/regression.q:202
+#: src/language/stats/regression.q:199
 msgid "Beta"
 msgstr "Beta"
 
-#: src/language/stats/regression.q:205
+#: src/language/stats/regression.q:202
 msgid "(Constant)"
 msgstr "(Constante)"
 
-#: src/language/stats/regression.q:269
+#: src/language/stats/regression.q:254
 msgid "Coefficients"
 msgstr "Coëfficiënten"
 
-#: src/language/stats/regression.q:304 src/ui/gui/regression.ui:7
+#: src/language/stats/regression.q:289 src/ui/gui/regression.ui:7
 msgid "Regression"
 msgstr "Regressie"
 
-#: src/language/stats/regression.q:385
+#: src/language/stats/regression.q:370
 msgid "Model"
 msgstr "Model"
 
-#: src/language/stats/regression.q:386
+#: src/language/stats/regression.q:371
 msgid "Covariances"
 msgstr "Covarianties"
 
-#: src/language/stats/regression.q:401
+#: src/language/stats/regression.q:386
 msgid "Coefficient Correlations"
 msgstr "Coëfficiëntcorrelaties"
 
-#: src/language/stats/regression.q:808
+#: src/language/stats/regression.q:793
 msgid ""
 "The dependent variable is equal to the independent variable.The least "
 "squares line is therefore Y=X.Standard errors and related statistics may be "
 "meaningless."
 msgstr ""
 
-#: src/language/stats/regression.q:900
-msgid "Dependent variable must be numeric."
-msgstr "Afhankelijke variabele moet numeriek zijn."
+#: src/language/stats/regression.q:891
+msgid "REGRESSION requires numeric variables."
+msgstr ""
+
+#: src/language/stats/regression.q:962
+msgid "No valid data found. This command was skipped."
+msgstr "Geen geldige gegevens gevonden. Deze opdracht is overgeslagen."
 
 #: src/language/stats/reliability.q:421
 msgid "Reliability Statistics"
@@ -5758,6 +5763,27 @@ msgstr ""
 msgid "The step value %ld is less than 1.  The value is being reset to 1."
 msgstr "De stap waarde %ld is kleiner dan 1. De waarde is op 1 gezet."
 
+#: src/ui/gui/binomial.ui:57 src/ui/gui/chi-square.ui:57
+#, fuzzy
+msgid "_Test Variable List:"
+msgstr "Testvariabele:"
+
+#: src/ui/gui/binomial.ui:126 src/ui/gui/chi-square.ui:126
+msgid "_Get from data"
+msgstr ""
+
+#: src/ui/gui/binomial.ui:143 src/ui/gui/t-test.ui:333
+msgid "_Cut point:"
+msgstr "_Knippunt:"
+
+#: src/ui/gui/binomial.ui:178
+msgid "Define Dichotomy"
+msgstr ""
+
+#: src/ui/gui/binomial.ui:197
+msgid "Test _Proportion:"
+msgstr ""
+
 #: src/ui/gui/correlation.ui:7
 msgid "Bivariate Correlations"
 msgstr "Bivariate Correlaties"
@@ -5860,6 +5886,45 @@ msgstr "Kruistabel: Satistieken"
 msgid "Statistics"
 msgstr "Statistieken"
 
+#: src/ui/gui/chi-square.ui:13
+#, fuzzy
+msgid "Chi-Square Test"
+msgstr "Chi-square tests."
+
+#: src/ui/gui/chi-square.ui:140
+#, fuzzy
+msgid "Use _specified range"
+msgstr "_Gebruik gespecificeerde waardes:"
+
+#: src/ui/gui/chi-square.ui:162
+#, fuzzy
+msgid "_Lower:"
+msgstr "Lager"
+
+#: src/ui/gui/chi-square.ui:170
+#, fuzzy
+msgid "_Upper:"
+msgstr "Hoger"
+
+#: src/ui/gui/chi-square.ui:214
+#, fuzzy
+msgid "Expected Range:"
+msgstr "Verwacht N"
+
+#: src/ui/gui/chi-square.ui:240
+msgid "All categor_ies equal"
+msgstr ""
+
+#: src/ui/gui/chi-square.ui:257
+#, fuzzy
+msgid "_Values"
+msgstr "Waardes"
+
+#: src/ui/gui/chi-square.ui:301
+#, fuzzy
+msgid "Expected Values:"
+msgstr "Extreme Waardes"
+
 #: src/ui/gui/descriptives.ui:130 src/ui/gui/frequencies.ui:140
 msgid "Statistics:"
 msgstr "Statistieken:"
@@ -5935,57 +6000,97 @@ msgid "Factor Analysis"
 msgstr "Factoranalyse"
 
 #: src/ui/gui/factor.ui:47
-msgid "Descriptives..."
+#, fuzzy
+msgid "_Descriptives..."
 msgstr "Descriptieven..."
 
 #: src/ui/gui/factor.ui:60
-msgid "Extraction..."
+#, fuzzy
+msgid "_Extraction..."
 msgstr "Extractie..."
 
-#: src/ui/gui/factor.ui:180
+#: src/ui/gui/factor.ui:74
+#, fuzzy
+msgid "_Rotations..."
+msgstr "Opties..."
+
+#: src/ui/gui/factor.ui:192
 msgid "Factor Analysis: Extraction"
 msgstr ""
 
-#: src/ui/gui/factor.ui:204
+#: src/ui/gui/factor.ui:216
 msgid "Method: "
 msgstr "Methode:"
 
-#: src/ui/gui/factor.ui:254
+#: src/ui/gui/factor.ui:266
 msgid "Correlation matrix"
 msgstr "Correlatie-matrix"
 
-#: src/ui/gui/factor.ui:268
+#: src/ui/gui/factor.ui:280
 msgid "Covariance matrix"
 msgstr "Covariantie-matrix"
 
-#: src/ui/gui/factor.ui:288
+#: src/ui/gui/factor.ui:300
 msgid "Analyse"
 msgstr "Analyseer"
 
-#: src/ui/gui/factor.ui:312
+#: src/ui/gui/factor.ui:324
 msgid "Unrotatated factor solution"
 msgstr ""
 
-#: src/ui/gui/factor.ui:326
+#: src/ui/gui/factor.ui:338
 msgid "Scree plot"
 msgstr ""
 
-#: src/ui/gui/factor.ui:345 src/ui/gui/roc.ui:286
+#: src/ui/gui/factor.ui:357 src/ui/gui/roc.ui:286
 msgid "Display"
 msgstr "Scherm"
 
-#: src/ui/gui/factor.ui:418
+#: src/ui/gui/factor.ui:430
 msgid "Number of factors:"
 msgstr "Aantal van factoren:"
 
-#: src/ui/gui/factor.ui:448
+#: src/ui/gui/factor.ui:460
 msgid "Extract"
 msgstr ""
 
-#: src/ui/gui/factor.ui:463
+#: src/ui/gui/factor.ui:475 src/ui/gui/factor.ui:665
 msgid "Maximum iterations for convergence:"
 msgstr ""
 
+#: src/ui/gui/factor.ui:538
+#, fuzzy
+msgid "Factor Analysis: Rotation"
+msgstr "Factoranalyse"
+
+#: src/ui/gui/factor.ui:571
+#, fuzzy
+msgid "_None"
+msgstr "Geen"
+
+#: src/ui/gui/factor.ui:582
+#, fuzzy
+msgid "_Varimax"
+msgstr "_Variabelen"
+
+#: src/ui/gui/factor.ui:598
+msgid "_Quartimax"
+msgstr ""
+
+#: src/ui/gui/factor.ui:614
+msgid "_Equimax"
+msgstr ""
+
+#: src/ui/gui/factor.ui:637
+#, fuzzy
+msgid "Method"
+msgstr "Methode:"
+
+#: src/ui/gui/factor.ui:648
+#, fuzzy
+msgid "_Display rotated solution"
+msgstr "Gegevensbestand_informatie tonen"
+
 #: src/ui/gui/find.ui:8
 msgid "Find Case"
 msgstr "Vind case"
@@ -6665,10 +6770,6 @@ msgstr "Groep_2 waarde:"
 msgid "Group_1 value:"
 msgstr "Groep_1 waarde:"
 
-#: src/ui/gui/t-test.ui:333
-msgid "_Cut point:"
-msgstr "_Knippunt:"
-
 #: src/ui/gui/t-test.ui:365
 msgid "_Use specified values:"
 msgstr "_Gebruik gespecificeerde waardes:"
@@ -6953,7 +7054,7 @@ msgid "Recently Used _Files"
 msgstr "Recent gebruikte _bestanden"
 
 # Standaard snelleter voor Bewerken is de w.
-#: src/ui/gui/data-editor.ui:111 src/ui/gui/output-viewer.ui:21
+#: src/ui/gui/data-editor.ui:111 src/ui/gui/output-viewer.ui:28
 #: src/ui/gui/syntax-editor.ui:70
 msgid "_Edit"
 msgstr "Be_werken"
@@ -7171,12 +7272,12 @@ msgstr "Spring naar variabele"
 msgid "Data File _Comments"
 msgstr "Gegevensbestand _commentaren"
 
-#: src/ui/gui/data-editor.ui:444 src/ui/gui/output-viewer.ui:33
+#: src/ui/gui/data-editor.ui:444 src/ui/gui/output-viewer.ui:40
 #: src/ui/gui/syntax-editor.ui:131
 msgid "_Windows"
 msgstr "_Vensters"
 
-#: src/ui/gui/data-editor.ui:450 src/ui/gui/output-viewer.ui:39
+#: src/ui/gui/data-editor.ui:450 src/ui/gui/output-viewer.ui:46
 #: src/ui/gui/syntax-editor.ui:137
 msgid "_Minimize All Windows"
 msgstr "_Minimaliseer alle vensters"
@@ -7209,7 +7310,7 @@ msgstr "Weging statusgebied"
 msgid "Split File Status Area"
 msgstr "Splitsbestand statusgebied"
 
-#: src/ui/gui/output-viewer.ui:15
+#: src/ui/gui/output-viewer.ui:22
 msgid "_Export"
 msgstr "_Exporteer"
 
@@ -7233,6 +7334,12 @@ msgstr "Huidige regel"
 msgid "To End"
 msgstr "Naar einde"
 
+#~ msgid "Dependent variable must be numeric."
+#~ msgstr "Afhankelijke variabele moet numeriek zijn."
+
+#~ msgid "Variable %s has label of invalid length %zu."
+#~ msgstr "Variabele %s heeft label van ongeldige lengte %zu."
+
 #, fuzzy
 #~ msgid "Duplicate variable name %s among target variables."
 #~ msgstr "Dubbele variabelennaam '%s' binnen systeembestand."
index 7dbfec5e9747eaa3232a97952956cebaa1df0ce3..513c2e3bfb49274e9e216a55e355f273c5efa273 100644 (file)
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pspp-0.6.2-pre4\n"
 "Report-Msgid-Bugs-To: pspp-dev@gnu.org\n"
-"POT-Creation-Date: 2010-05-09 21:32+0200\n"
+"POT-Creation-Date: 2010-05-21 12:02+0200\n"
 "PO-Revision-Date: 2009-09-10 01:15-0300\n"
 "Last-Translator: Michel Almada de Castro Boaventura <michel@cecaps.ufmg.br>\n"
 "Language-Team: Brazilian Portuguese <ldp-br@bazar.conectiva.com.br>\n"
@@ -247,7 +247,7 @@ msgstr "system"
 msgid "scratch"
 msgstr "rascunho"
 
-#: src/data/dictionary.c:981
+#: src/data/dictionary.c:980
 msgid ""
 "At least one case in the data file had a weight value that was user-missing, "
 "system-missing, zero, or negative.  These case(s) were ignored."
@@ -256,7 +256,7 @@ msgstr ""
 "user-missing, system-missing, zero ou negativo. Este(s) caso(s) foi(foram) "
 "ignorado(s)."
 
-#: src/data/dictionary.c:1284
+#: src/data/dictionary.c:1283
 #, c-format
 msgid "Truncating document line to %d bytes."
 msgstr "Linha do documento truncada para %d bytes."
@@ -343,20 +343,20 @@ msgstr[1] ""
 msgid "%s variables are not compatible with %s format %s."
 msgstr "%s variáveis não são compatíveis com %s formato %s."
 
-#: src/data/format.c:327 src/data/sys-file-reader.c:744
+#: src/data/format.c:327 src/data/sys-file-reader.c:752
 #: src/ui/gui/psppire-var-store.c:628 src/ui/gui/psppire.ui:1960
 #: src/ui/gui/var-sheet-dialogs.ui:139
 msgid "String"
 msgstr "String"
 
-#: src/data/format.c:327 src/data/sys-file-reader.c:744
+#: src/data/format.c:327 src/data/sys-file-reader.c:752
 #: src/ui/gui/psppire-var-store.c:621 src/ui/gui/psppire.ui:2040
 #: src/ui/gui/var-sheet-dialogs.ui:27
 msgid "Numeric"
 msgstr "Numérico"
 
-#: src/data/format.c:328 src/data/sys-file-reader.c:1464
-#: src/data/sys-file-reader.c:1466 src/language/xforms/recode.c:493
+#: src/data/format.c:328 src/data/sys-file-reader.c:1472
+#: src/data/sys-file-reader.c:1474 src/language/xforms/recode.c:493
 #: src/language/xforms/recode.c:494 src/language/xforms/recode.c:506
 #: src/language/xforms/recode.c:507
 #: src/language/dictionary/apply-dictionary.c:78
@@ -364,8 +364,8 @@ msgstr "Numérico"
 msgid "numeric"
 msgstr "numérico"
 
-#: src/data/format.c:328 src/data/sys-file-reader.c:1464
-#: src/data/sys-file-reader.c:1466 src/language/xforms/recode.c:493
+#: src/data/format.c:328 src/data/sys-file-reader.c:1472
+#: src/data/sys-file-reader.c:1474 src/language/xforms/recode.c:493
 #: src/language/xforms/recode.c:494 src/language/xforms/recode.c:506
 #: src/language/xforms/recode.c:507
 #: src/language/dictionary/apply-dictionary.c:78
@@ -570,7 +570,7 @@ msgstr "Comprimento %d de variável inválido."
 msgid "Invalid variable name `%s' in position %d."
 msgstr "Nome de variável '%s' inválido na posição %d."
 
-#: src/data/por-file-reader.c:685 src/data/sys-file-reader.c:602
+#: src/data/por-file-reader.c:685 src/data/sys-file-reader.c:606
 #, c-format
 msgid "Bad width %d for variable %s."
 msgstr "Comprimento %d incorreto para variável %s."
@@ -690,125 +690,120 @@ msgstr ""
 msgid "Variable suffix too large."
 msgstr "Sufixo de variável muito grande."
 
-#: src/data/sys-file-reader.c:222
+#: src/data/sys-file-reader.c:226
 #, fuzzy, c-format
 msgid "Recoded variable name duplicates an existing `%s' within system file."
 msgstr "Nome de variável '%s' duplicado dentro do arquivo de sistema."
 
 #. TRANSLATORS: this fragment will be interpolated into
 #. messages in fh_lock() that identify types of files.
-#: src/data/sys-file-reader.c:286 src/data/sys-file-writer.c:207
+#: src/data/sys-file-reader.c:290 src/data/sys-file-writer.c:207
 msgid "system file"
 msgstr "arquivo de sistema"
 
-#: src/data/sys-file-reader.c:293
+#: src/data/sys-file-reader.c:297
 #, c-format
 msgid "Error opening \"%s\" for reading as a system file: %s."
 msgstr "Erro ao abrir \"%s\" para leitura como arquivo de sistema: %s."
 
-#: src/data/sys-file-reader.c:332 tests/dissect-sysfile.c:154
+#: src/data/sys-file-reader.c:336 tests/dissect-sysfile.c:154
 msgid "Misplaced type 4 record."
 msgstr "Registro de tipo 4 fora do lugar."
 
-#: src/data/sys-file-reader.c:343 tests/dissect-sysfile.c:165
+#: src/data/sys-file-reader.c:347 tests/dissect-sysfile.c:165
 #, c-format
 msgid "Unrecognized record type %d."
 msgstr "Registro de tipo %d não reconhecido."
 
-#: src/data/sys-file-reader.c:384
+#: src/data/sys-file-reader.c:388
 #, c-format
 msgid "File header claims %d variable positions but %d were read from file."
 msgstr ""
 "Cabeçalho do arquivo requer %d posições de variáveis, mas %d foram lidas do "
 "arquivo."
 
-#: src/data/sys-file-reader.c:424
+#: src/data/sys-file-reader.c:428
 #, c-format
 msgid "Error closing system file \"%s\": %s."
 msgstr "Erro ao fechar arquivo de sistema \"%s\": %s."
 
-#: src/data/sys-file-reader.c:489 src/data/sys-file-reader.c:499
+#: src/data/sys-file-reader.c:493 src/data/sys-file-reader.c:503
 #: tests/dissect-sysfile.c:202 tests/dissect-sysfile.c:212
 msgid "This is not an SPSS system file."
 msgstr "Este não é um arquivo de sistema do SPSS."
 
-#: src/data/sys-file-reader.c:521 tests/dissect-sysfile.c:227
+#: src/data/sys-file-reader.c:525 tests/dissect-sysfile.c:227
 msgid ""
 "Compression bias is not the usual value of 100, or system file uses "
 "unrecognized floating-point format."
 msgstr ""
 
-#: src/data/sys-file-reader.c:598
+#: src/data/sys-file-reader.c:602
 #, c-format
 msgid "Invalid variable name `%s'."
 msgstr "Nome de variável '%s' inválido."
 
-#: src/data/sys-file-reader.c:606
+#: src/data/sys-file-reader.c:610
 #, c-format
 msgid "Duplicate variable name `%s' within system file."
 msgstr "Nome de variável '%s' duplicado dentro do arquivo de sistema."
 
-#: src/data/sys-file-reader.c:614 tests/dissect-sysfile.c:356
+#: src/data/sys-file-reader.c:618 tests/dissect-sysfile.c:356
 msgid "Variable label indicator field is not 0 or 1."
 msgstr "Campo indicador de rótulo de variável não é 0 ou 1."
 
-#: src/data/sys-file-reader.c:622 tests/dissect-sysfile.c:365
-#, c-format
-msgid "Variable %s has label of invalid length %zu."
-msgstr "Variável %s tem um rótulo de tamanho inválido %zu."
-
-#: src/data/sys-file-reader.c:641 tests/dissect-sysfile.c:383
+#: src/data/sys-file-reader.c:649 tests/dissect-sysfile.c:387
 msgid "Numeric missing value indicator field is not -3, -2, 0, 1, 2, or 3."
 msgstr "Campo de indicador de missing numérico não é -3, -3, 0, 1, 2 ou 3."
 
-#: src/data/sys-file-reader.c:659 tests/dissect-sysfile.c:398
+#: src/data/sys-file-reader.c:667 tests/dissect-sysfile.c:402
 msgid "String missing value indicator field is not 0, 1, 2, or 3."
 msgstr "Campo de indicação de valores ausentes de string não é 0, 1, 2 ou 3."
 
-#: src/data/sys-file-reader.c:691
+#: src/data/sys-file-reader.c:699
 msgid "Missing string continuation record."
 msgstr "Faltando registro de continuação de string."
 
-#: src/data/sys-file-reader.c:725
+#: src/data/sys-file-reader.c:733
 #, c-format
 msgid "Unknown variable format %<PRIu8>."
 msgstr "Variável de formato %<PRIu8> desconhecida."
 
-#: src/data/sys-file-reader.c:743
+#: src/data/sys-file-reader.c:751
 #, c-format
 msgid "%s variable %s has invalid %s format %s."
 msgstr "%s variável %s tem um inválido %s formato %s."
 
-#: src/data/sys-file-reader.c:746
+#: src/data/sys-file-reader.c:754
 msgid "print"
 msgstr "imprimir"
 
-#: src/data/sys-file-reader.c:746
+#: src/data/sys-file-reader.c:754
 msgid "write"
 msgstr "escrever"
 
-#: src/data/sys-file-reader.c:750
+#: src/data/sys-file-reader.c:758
 msgid "Suppressing further invalid format warnings."
 msgstr "Ocultando avisos de formato inválido subsequentes."
 
-#: src/data/sys-file-reader.c:768
+#: src/data/sys-file-reader.c:776
 msgid "Weighting variable must be numeric."
 msgstr "Variável de ponderação deve ser numérica."
 
-#: src/data/sys-file-reader.c:782
+#: src/data/sys-file-reader.c:790
 msgid "Multiple type 6 (document) records."
 msgstr "Múltiplos registros de tipo 6 (documento)."
 
-#: src/data/sys-file-reader.c:786
+#: src/data/sys-file-reader.c:794
 #, c-format
 msgid "Number of document lines (%d) must be greater than 0."
 msgstr "Número de linhas do documento (%d) precisa ser maior que 0."
 
-#: src/data/sys-file-reader.c:794
+#: src/data/sys-file-reader.c:802
 msgid "Document line contains null byte."
 msgstr "Linha do documento contém byte nulo."
 
-#: src/data/sys-file-reader.c:885
+#: src/data/sys-file-reader.c:893
 #, c-format
 msgid ""
 "Unrecognized record type 7, subtype %d.  Please send a copy of this file, "
@@ -817,13 +812,13 @@ msgstr ""
 "Registro de tipo 7 e subtipo %d não reconhecido. Por favor, envie uma cópia "
 "deste arquivo bem como da sintaxe que o criou para %s"
 
-#: src/data/sys-file-reader.c:912 tests/dissect-sysfile.c:590
+#: src/data/sys-file-reader.c:920 tests/dissect-sysfile.c:594
 #, c-format
 msgid "Bad size (%zu) or count (%zu) field on record type 7, subtype 3."
 msgstr ""
 "Tamanho (%zu) ou quantidade (%zu) inválidos de registro tipo 7, subtipo 3."
 
-#: src/data/sys-file-reader.c:932
+#: src/data/sys-file-reader.c:940
 #, c-format
 msgid ""
 "Floating-point representation indicated by system file (%d) differs from "
@@ -832,17 +827,17 @@ msgstr ""
 "Representação de ponto flutuante indicado pelo arquivo de sistema (%d) "
 "difere do esperado (%d)."
 
-#: src/data/sys-file-reader.c:945 src/language/dictionary/sys-file-info.c:110
+#: src/data/sys-file-reader.c:953 src/language/dictionary/sys-file-info.c:110
 #, fuzzy
 msgid "Little Endian"
 msgstr "Little Endian."
 
-#: src/data/sys-file-reader.c:945 src/language/dictionary/sys-file-info.c:109
+#: src/data/sys-file-reader.c:953 src/language/dictionary/sys-file-info.c:109
 #, fuzzy
 msgid "Big Endian"
 msgstr "Big Endian."
 
-#: src/data/sys-file-reader.c:946
+#: src/data/sys-file-reader.c:954
 #, c-format
 msgid ""
 "Integer format indicated by system file (%s) differs from expected (%s)."
@@ -850,71 +845,71 @@ msgstr ""
 "Formato inteiro indicado pelo arquivo de sistema (%s) difere do esperado (%"
 "s)."
 
-#: src/data/sys-file-reader.c:1003 tests/dissect-sysfile.c:621
+#: src/data/sys-file-reader.c:1011 tests/dissect-sysfile.c:625
 #, c-format
 msgid "Bad size (%zu) or count (%zu) on extension 4."
 msgstr "Tamanho (%zu) ou quantidade (%zu) da extensão 4 inválido."
 
-#: src/data/sys-file-reader.c:1007 src/data/sys-file-reader.c:1011
-#: src/data/sys-file-reader.c:1015 tests/dissect-sysfile.c:626
-#: tests/dissect-sysfile.c:631 tests/dissect-sysfile.c:636
+#: src/data/sys-file-reader.c:1015 src/data/sys-file-reader.c:1019
+#: src/data/sys-file-reader.c:1023 tests/dissect-sysfile.c:630
+#: tests/dissect-sysfile.c:635 tests/dissect-sysfile.c:640
 #, fuzzy, c-format
 msgid "File specifies unexpected value %g as %s."
 msgstr "Arquivo especifica valor inesperado %g como SYSMIS."
 
-#: src/data/sys-file-reader.c:1048
+#: src/data/sys-file-reader.c:1056
 #, c-format
 msgid "Missing space following 'C' at offset %zu in MRSETS record"
 msgstr ""
 
-#: src/data/sys-file-reader.c:1066 tests/dissect-sysfile.c:687
+#: src/data/sys-file-reader.c:1074 tests/dissect-sysfile.c:691
 #, c-format
 msgid "Missing space following 'E' at offset %zu in MRSETS record"
 msgstr ""
 
-#: src/data/sys-file-reader.c:1075 tests/dissect-sysfile.c:696
+#: src/data/sys-file-reader.c:1083 tests/dissect-sysfile.c:700
 #, c-format
 msgid ""
 "Unexpected label source value \"%s\" following 'E' at offset %zu in MRSETS "
 "record"
 msgstr ""
 
-#: src/data/sys-file-reader.c:1081
+#: src/data/sys-file-reader.c:1089
 #, c-format
 msgid "Missing 'C', 'D', or 'E' at offset %zu in MRSETS record."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1110
+#: src/data/sys-file-reader.c:1118
 #, c-format
 msgid "Missing new-line parsing variable names at offset %zu in MRSETS record."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1121
+#: src/data/sys-file-reader.c:1129
 #, fuzzy, c-format
 msgid "Duplicate variable name %s at offset %zu in MRSETS record."
 msgstr "Nome de variável %s duplicado na posição %d."
 
-#: src/data/sys-file-reader.c:1134
+#: src/data/sys-file-reader.c:1142
 #, c-format
 msgid "MRSET %s contains both string and numeric variables."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1149
+#: src/data/sys-file-reader.c:1157
 #, c-format
 msgid "MRSET %s has only %zu variables."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1186 tests/dissect-sysfile.c:754
+#: src/data/sys-file-reader.c:1194 tests/dissect-sysfile.c:758
 #, c-format
 msgid "Bad size %zu on extension 11."
 msgstr "Tamanho %zu inválido da extensão 11."
 
-#: src/data/sys-file-reader.c:1198 tests/dissect-sysfile.c:766
+#: src/data/sys-file-reader.c:1206 tests/dissect-sysfile.c:770
 #, c-format
 msgid "Extension 11 has bad count %zu (for %zu variables)."
 msgstr "Extensão 11 tem uma quantidade inválida %zu (para %zu variáveis)."
 
-#: src/data/sys-file-reader.c:1219
+#: src/data/sys-file-reader.c:1227
 #, c-format
 msgid ""
 "Invalid variable display parameters for variable %zu (%s).  Default "
@@ -923,24 +918,24 @@ msgstr ""
 "Parâmetro de exibição de variáveis inválido para a variável %zu (%s). "
 "Parâmetros substituídos pelo padrão."
 
-#: src/data/sys-file-reader.c:1263
+#: src/data/sys-file-reader.c:1271
 #, c-format
 msgid "Long variable mapping from %s to invalid variable name `%s'."
 msgstr "Variável longa mapeando de %s para um nome de variável inválido '%s'."
 
-#: src/data/sys-file-reader.c:1273
+#: src/data/sys-file-reader.c:1281
 #, c-format
 msgid "Duplicate long variable name `%s' within system file."
 msgstr "Nome longo de variável '%s' duplicado dentro do arquivo de sistema."
 
-#: src/data/sys-file-reader.c:1326
+#: src/data/sys-file-reader.c:1334
 #, c-format
 msgid "%s listed as string of invalid length %s in very length string record."
 msgstr ""
 "%s listada como string de tamanho inválido %s em um registro de string muito "
 "longo."
 
-#: src/data/sys-file-reader.c:1336
+#: src/data/sys-file-reader.c:1344
 #, c-format
 msgid ""
 "%s listed in very long string record with width %s, which requires only one "
@@ -949,24 +944,24 @@ msgstr ""
 "%s listado em registro de string muito longa com comprimento %s, o que "
 "requer apenas um segmento."
 
-#: src/data/sys-file-reader.c:1342
+#: src/data/sys-file-reader.c:1350
 #, c-format
 msgid "Very long string %s overflows dictionary."
 msgstr "String muito longa %s estoura dicionário."
 
-#: src/data/sys-file-reader.c:1356
+#: src/data/sys-file-reader.c:1364
 #, c-format
 msgid ""
 "Very long string with width %ld has segment %d of width %d (expected %d)"
 msgstr ""
 "String muito longa de tamanho %ld tem segmento %d de tamanho %d (esperado %d)"
 
-#: src/data/sys-file-reader.c:1402
+#: src/data/sys-file-reader.c:1410
 #, c-format
 msgid "Invalid number of labels: %d.  Ignoring labels."
 msgstr "Número de rótulos inválido: %d. Ignorando rótulos."
 
-#: src/data/sys-file-reader.c:1433 tests/dissect-sysfile.c:464
+#: src/data/sys-file-reader.c:1441 tests/dissect-sysfile.c:468
 msgid ""
 "Variable index record (type 4) does not immediately follow value label "
 "record (type 3) as it should."
@@ -974,7 +969,7 @@ msgstr ""
 "Índice do registro da variável (tipo 4) não foi seguido imediatamente por um "
 "registro de rótulo de valores (tipo 3) como deveria."
 
-#: src/data/sys-file-reader.c:1440
+#: src/data/sys-file-reader.c:1448
 #, c-format
 msgid ""
 "Number of variables associated with a value label (%d) is not between 1 and "
@@ -983,14 +978,14 @@ msgstr ""
 "Número de variáveis associadas com um rótulo de valores (%d) não está entre "
 "1 e o número de variáveis (%zu)."
 
-#: src/data/sys-file-reader.c:1451
+#: src/data/sys-file-reader.c:1459
 #, fuzzy, c-format
 msgid ""
 "Value labels may not be added to long string variables (e.g. %s) using "
 "records types 3 and 4."
 msgstr "Rótulos de valores não são permitidos em variáveis string longas (%s)."
 
-#: src/data/sys-file-reader.c:1460
+#: src/data/sys-file-reader.c:1468
 #, c-format
 msgid ""
 "Variables associated with value label are not all of identical type.  "
@@ -999,125 +994,125 @@ msgstr ""
 "Variáveis associadas com rótulo de valores não são todas do mesmo tipo. "
 "Variável %s é %s, mas variável %s é %s."
 
-#: src/data/sys-file-reader.c:1494
+#: src/data/sys-file-reader.c:1502
 #, c-format
 msgid "Duplicate value label for %g on %s."
 msgstr "Rótulo de valores duplicados para %g em %s."
 
-#: src/data/sys-file-reader.c:1497 src/data/sys-file-reader.c:1678
+#: src/data/sys-file-reader.c:1505 src/data/sys-file-reader.c:1686
 #, c-format
 msgid "Duplicate value label for \"%.*s\" on %s."
 msgstr "Rótulo de valores duplicados para \"%.*s\" em %s."
 
-#: src/data/sys-file-reader.c:1535
+#: src/data/sys-file-reader.c:1543
 #, c-format
 msgid "Error parsing attribute value %s[%d]"
 msgstr ""
 
-#: src/data/sys-file-reader.c:1549
+#: src/data/sys-file-reader.c:1557
 #, c-format
 msgid "Attribute value %s[%d] is not quoted: %s"
 msgstr ""
 
-#: src/data/sys-file-reader.c:1612 tests/dissect-sysfile.c:932
+#: src/data/sys-file-reader.c:1620 tests/dissect-sysfile.c:936
 #, c-format
 msgid ""
 "Variable name length in long string value label record (%d) exceeds %d-byte "
 "limit."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1622
+#: src/data/sys-file-reader.c:1630
 #, fuzzy, c-format
 msgid "Ignoring long string value record for unknown variable %s."
 msgstr "Mapeamento de variável se refere a uma variável desconhecida %s."
 
-#: src/data/sys-file-reader.c:1629
+#: src/data/sys-file-reader.c:1637
 #, c-format
 msgid "Ignoring long string value record for numeric variable %s."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1636
+#: src/data/sys-file-reader.c:1644
 #, c-format
 msgid ""
 "Ignoring long string value record for variable %s because the record's width "
 "(%d) does not match the variable's width (%d)"
 msgstr ""
 
-#: src/data/sys-file-reader.c:1658
+#: src/data/sys-file-reader.c:1666
 #, c-format
 msgid ""
 "Ignoring long string value %zu for variable %s, with width %d, that has bad "
 "value width %zu."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1773
+#: src/data/sys-file-reader.c:1781
 msgid "File ends in partial case."
 msgstr "Arquivo termina em um caso parcial."
 
-#: src/data/sys-file-reader.c:1781
+#: src/data/sys-file-reader.c:1789
 #, c-format
 msgid "Error reading case from file %s."
 msgstr "Erro lendo caso do arquivo %s."
 
-#: src/data/sys-file-reader.c:1882
+#: src/data/sys-file-reader.c:1890
 msgid ""
 "Possible compressed data corruption: compressed spaces appear in numeric "
 "field."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1935
+#: src/data/sys-file-reader.c:1943
 #, c-format
 msgid ""
 "Possible compressed data corruption: string contains compressed integer "
 "(opcode %d)"
 msgstr ""
 
-#: src/data/sys-file-reader.c:2027
+#: src/data/sys-file-reader.c:2035
 #, c-format
 msgid "Variable index %d not in valid range 1...%d."
 msgstr "Índice de variável %d não está no intervalo válido de 1...%d."
 
-#: src/data/sys-file-reader.c:2032
+#: src/data/sys-file-reader.c:2040
 #, c-format
 msgid "Variable index %d refers to long string continuation."
 msgstr "Variável de índice %d se refere a uma continuação de uma string longa."
 
-#: src/data/sys-file-reader.c:2100
+#: src/data/sys-file-reader.c:2108
 #, fuzzy, c-format
 msgid "Suppressed %d additional related warnings."
 msgstr "Ocultados %d avisos adicionais de mapeamento de variável."
 
-#: src/data/sys-file-reader.c:2141
+#: src/data/sys-file-reader.c:2153 src/data/sys-file-reader.c:2170
 #, fuzzy, c-format
 msgid "Dictionary record refers to unknown variable %s."
 msgstr "Mapeamento de variável se refere a uma variável desconhecida %s."
 
-#: src/data/sys-file-reader.c:2202
+#: src/data/sys-file-reader.c:2231
 #, c-format
 msgid "Expecting digit at offset %zu in MRSETS record."
 msgstr ""
 
-#: src/data/sys-file-reader.c:2209
+#: src/data/sys-file-reader.c:2238
 #, c-format
 msgid "Expecting space at offset %zu in MRSETS record."
 msgstr ""
 
-#: src/data/sys-file-reader.c:2216
+#: src/data/sys-file-reader.c:2245
 #, c-format
 msgid "%zu-byte string starting at offset %zu exceeds record length %zu."
 msgstr ""
 
-#: src/data/sys-file-reader.c:2226
+#: src/data/sys-file-reader.c:2255
 #, c-format
 msgid "Expecting space at offset %zu following %zu-byte string."
 msgstr ""
 
-#: src/data/sys-file-reader.c:2318 tests/dissect-sysfile.c:1337
+#: src/data/sys-file-reader.c:2347 tests/dissect-sysfile.c:1341
 #, c-format
 msgid "System error: %s."
 msgstr "Erro de sistema: %s."
 
-#: src/data/sys-file-reader.c:2320 tests/dissect-sysfile.c:1339
+#: src/data/sys-file-reader.c:2349 tests/dissect-sysfile.c:1343
 msgid "Unexpected end of file."
 msgstr "Fim de arquivo inesperado."
 
@@ -1137,7 +1132,7 @@ msgstr "Erro ao abrir \"%s\" para gravação como arquivo de sistema: %s."
 msgid "An I/O error occurred writing system file \"%s\"."
 msgstr "Um erro de E/S ocorreu ao gravar arquivo de sistema \"%s\"."
 
-#: src/data/variable.c:215
+#: src/data/variable.c:206
 #, c-format
 msgid ""
 "Character `%c' (in %s) may not appear as the first character in a variable "
@@ -1146,21 +1141,21 @@ msgstr ""
 "Caractere '%c' (em %s) não pode aparecer como o primeiro caractere no nome "
 "de uma variável."
 
-#: src/data/variable.c:227
+#: src/data/variable.c:218
 #, c-format
 msgid "Character `%c' (in %s) may not appear in a variable name."
 msgstr "Caractere '%c' (em %s) não pode aparecer em um nome de variável."
 
-#: src/data/variable.c:253
+#: src/data/variable.c:244
 msgid "Variable name cannot be empty string."
 msgstr "Nome de variável não pode ser uma string vazia."
 
-#: src/data/variable.c:259
+#: src/data/variable.c:250
 #, c-format
 msgid "Variable name %s exceeds %d-character limit."
 msgstr "Nome de variável %s excede o limite de %d caracteres."
 
-#: src/data/variable.c:267
+#: src/data/variable.c:258
 #, c-format
 msgid "`%s' may not be used as a variable name because it is a reserved word."
 msgstr ""
@@ -2098,7 +2093,7 @@ msgid "IBM 390 Hex Long."
 msgstr "IBM 390 Hex Long."
 
 #: src/language/dictionary/sys-file-info.c:120 src/ui/gui/descriptives.ui:85
-#: src/ui/gui/factor.ui:161 src/ui/gui/recode.ui:960
+#: src/ui/gui/factor.ui:173 src/ui/gui/recode.ui:960
 msgid "Variables:"
 msgstr "Variáveis:"
 
@@ -2479,7 +2474,7 @@ msgstr "Variável de destino %s duplica variável existente %s."
 msgid "Variable %s is not dichotomous"
 msgstr "Variável %s não é dicotômica"
 
-#: src/language/stats/binomial.c:192
+#: src/language/stats/binomial.c:192 src/ui/gui/binomial.ui:13
 msgid "Binomial Test"
 msgstr "Teste Binomial"
 
@@ -2492,13 +2487,13 @@ msgid "Group2"
 msgstr "Grupo 2"
 
 #: src/language/stats/binomial.c:224 src/language/stats/chisquare.c:177
-#: src/language/stats/chisquare.c:236 src/language/stats/factor.c:1188
+#: src/language/stats/chisquare.c:236 src/language/stats/factor.c:1462
 #: src/language/stats/sign.c:92 src/language/stats/wilcoxon.c:260
 #: src/ui/gui/crosstabs-dialog.c:60 src/language/stats/crosstabs.q:823
 #: src/language/stats/crosstabs.q:1151 src/language/stats/crosstabs.q:1528
 #: src/language/stats/examine.q:1105 src/language/stats/frequencies.q:871
 #: src/language/stats/oneway.q:302 src/language/stats/oneway.q:472
-#: src/language/stats/regression.q:306 src/language/stats/reliability.q:702
+#: src/language/stats/regression.q:291 src/language/stats/reliability.q:702
 msgid "Total"
 msgstr "Total"
 
@@ -2507,8 +2502,8 @@ msgstr "Total"
 msgid "Category"
 msgstr "Categoria"
 
-#: src/language/stats/binomial.c:258 src/language/stats/correlations.c:120
-#: src/language/stats/correlations.c:228 src/language/stats/npar-summary.c:122
+#: src/language/stats/binomial.c:258 src/language/stats/correlations.c:119
+#: src/language/stats/correlations.c:227 src/language/stats/npar-summary.c:122
 #: src/language/stats/sign.c:72 src/language/stats/wilcoxon.c:243
 #: src/language/stats/crosstabs.q:830 src/language/stats/examine.q:1176
 #: src/language/stats/frequencies.q:1034 src/language/stats/oneway.q:385
@@ -2547,7 +2542,7 @@ msgid "Expected N"
 msgstr "N esperado"
 
 #: src/language/stats/chisquare.c:163 src/language/stats/chisquare.c:202
-#: src/ui/gui/crosstabs-dialog.c:62 src/language/stats/regression.q:305
+#: src/ui/gui/crosstabs-dialog.c:62 src/language/stats/regression.q:290
 msgid "Residual"
 msgstr "Resíduo"
 
@@ -2567,7 +2562,7 @@ msgstr "Chi-quadrado"
 
 #: src/language/stats/chisquare.c:264 src/language/stats/crosstabs.q:1215
 #: src/language/stats/oneway.q:275 src/language/stats/oneway.q:685
-#: src/language/stats/regression.q:299 src/language/stats/t-test.q:752
+#: src/language/stats/regression.q:284 src/language/stats/t-test.q:752
 #: src/language/stats/t-test.q:923 src/language/stats/t-test.q:1010
 msgid "df"
 msgstr "df"
@@ -2576,13 +2571,13 @@ msgstr "df"
 msgid "Asymp. Sig."
 msgstr "Asymp. Sig."
 
-#: src/language/stats/correlations.c:97 src/language/stats/factor.c:1431
+#: src/language/stats/correlations.c:96 src/language/stats/factor.c:1720
 #: src/language/stats/npar-summary.c:108
 msgid "Descriptive Statistics"
 msgstr ""
 
-#: src/language/stats/correlations.c:118 src/language/stats/descriptives.c:101
-#: src/language/stats/factor.c:1452 src/language/stats/npar-summary.c:125
+#: src/language/stats/correlations.c:117 src/language/stats/descriptives.c:101
+#: src/language/stats/factor.c:1741 src/language/stats/npar-summary.c:125
 #: src/ui/gui/descriptives-dialog.c:40 src/ui/gui/frequencies-dialog.c:41
 #: src/language/stats/examine.q:1444 src/language/stats/frequencies.q:105
 #: src/language/stats/oneway.q:386 src/language/stats/t-test.q:506
@@ -2591,7 +2586,7 @@ msgstr ""
 msgid "Mean"
 msgstr "Média"
 
-#: src/language/stats/correlations.c:119 src/language/stats/factor.c:1453
+#: src/language/stats/correlations.c:118 src/language/stats/factor.c:1742
 #: src/language/stats/npar-summary.c:128 src/language/stats/examine.q:1479
 #: src/language/stats/oneway.q:387 src/language/stats/t-test.q:507
 #: src/language/stats/t-test.q:527 src/language/stats/t-test.q:626
@@ -2599,37 +2594,37 @@ msgstr "Média"
 msgid "Std. Deviation"
 msgstr "Desvio padrão"
 
-#: src/language/stats/correlations.c:191 src/language/stats/factor.c:1331
+#: src/language/stats/correlations.c:190 src/language/stats/factor.c:1620
 #, fuzzy
 msgid "Correlations"
 msgstr "_Correlação Bivariada"
 
-#: src/language/stats/correlations.c:217
+#: src/language/stats/correlations.c:216
 #, fuzzy
 msgid "Pearson Correlation"
 msgstr "_Correlação Bivariada"
 
-#: src/language/stats/correlations.c:219 src/language/stats/oneway.q:686
+#: src/language/stats/correlations.c:218 src/language/stats/oneway.q:686
 #: src/language/stats/t-test.q:753 src/language/stats/t-test.q:924
 #: src/language/stats/t-test.q:1011
 msgid "Sig. (2-tailed)"
 msgstr ""
 
-#: src/language/stats/correlations.c:219
+#: src/language/stats/correlations.c:218
 #, fuzzy
 msgid "Sig. (1-tailed)"
 msgstr "Sig. exata (uni-caudal)"
 
-#: src/language/stats/correlations.c:223
+#: src/language/stats/correlations.c:222
 msgid "Cross-products"
 msgstr ""
 
-#: src/language/stats/correlations.c:224
+#: src/language/stats/correlations.c:223
 #, fuzzy
 msgid "Covariance"
 msgstr "Co-variança"
 
-#: src/language/stats/correlations.c:446 src/language/stats/descriptives.c:361
+#: src/language/stats/correlations.c:454 src/language/stats/descriptives.c:361
 #: src/language/data-io/list.q:91
 msgid "No variables specified."
 msgstr ""
@@ -2757,53 +2752,44 @@ msgstr ""
 msgid "Variable %s specified twice in sort criteria."
 msgstr ""
 
-#: src/language/stats/factor.c:558
+#: src/language/stats/factor.c:803
 msgid "Factor analysis on a single variable is not useful."
 msgstr ""
 
-#: src/language/stats/factor.c:939
+#: src/language/stats/factor.c:1206
 #, fuzzy
 msgid "Component Number"
 msgstr "Número da Coluna: 0"
 
-#: src/language/stats/factor.c:939
+#: src/language/stats/factor.c:1206
 #, fuzzy
 msgid "Factor Number"
 msgstr "Número do caso"
 
-#: src/language/stats/factor.c:970
+#: src/language/stats/factor.c:1237
 #, fuzzy
 msgid "Communalities"
 msgstr "Comentários:"
 
-#: src/language/stats/factor.c:976
+#: src/language/stats/factor.c:1243
 msgid "Initial"
 msgstr ""
 
-#: src/language/stats/factor.c:979
+#: src/language/stats/factor.c:1246
 msgid "Extraction"
 msgstr ""
 
-#: src/language/stats/factor.c:1029
-msgid "Component Matrix"
-msgstr ""
-
-#: src/language/stats/factor.c:1031
-#, fuzzy
-msgid "Factor Matrix"
-msgstr "Lista de Fator:"
-
-#: src/language/stats/factor.c:1039 src/language/stats/factor.c:1163
+#: src/language/stats/factor.c:1310 src/language/stats/factor.c:1437
 #, fuzzy
 msgid "Component"
 msgstr "Comentários:"
 
-#: src/language/stats/factor.c:1044 src/language/stats/factor.c:1165
+#: src/language/stats/factor.c:1315 src/language/stats/factor.c:1439
 #, fuzzy
 msgid "Factor"
 msgstr "_Fator:"
 
-#: src/language/stats/factor.c:1076 src/language/stats/factor.c:1219
+#: src/language/stats/factor.c:1347 src/language/stats/factor.c:1495
 #: src/ui/gui/psppire-data-store.c:755 src/ui/gui/psppire-var-store.c:699
 #: src/ui/gui/psppire-var-store.c:709 src/ui/gui/psppire-var-store.c:719
 #: src/ui/gui/psppire-var-store.c:825
@@ -2811,60 +2797,78 @@ msgstr "_Fator:"
 msgid "%d"
 msgstr "%d"
 
-#: src/language/stats/factor.c:1138
+#: src/language/stats/factor.c:1412
 msgid "Total Variance Explained"
 msgstr ""
 
-#: src/language/stats/factor.c:1170
+#: src/language/stats/factor.c:1444
 msgid "Initial Eigenvalues"
 msgstr ""
 
-#: src/language/stats/factor.c:1176
+#: src/language/stats/factor.c:1450
 msgid "Extraction Sums of Squared Loadings"
 msgstr ""
 
-#: src/language/stats/factor.c:1182
+#: src/language/stats/factor.c:1456
 msgid "Rotation Sums of Squared Loadings"
 msgstr ""
 
-#: src/language/stats/factor.c:1190
+#: src/language/stats/factor.c:1464
 #, fuzzy, no-c-format
 msgid "% of Variance"
 msgstr "Variança"
 
-#: src/language/stats/factor.c:1191
+#: src/language/stats/factor.c:1465
 msgid "Cumulative %"
 msgstr ""
 
-#: src/language/stats/factor.c:1289
+#: src/language/stats/factor.c:1578
 msgid "Correlation Matrix"
 msgstr ""
 
-#: src/language/stats/factor.c:1343
+#: src/language/stats/factor.c:1632
 msgid "Sig. 1-tailed"
 msgstr ""
 
-#: src/language/stats/factor.c:1377
+#: src/language/stats/factor.c:1666
 #, fuzzy
 msgid "Determinant"
 msgstr "Dependente"
 
-#: src/language/stats/factor.c:1454
+#: src/language/stats/factor.c:1743
 msgid "Analysis N"
 msgstr ""
 
-#: src/language/stats/factor.c:1487
+#: src/language/stats/factor.c:1776
 msgid ""
 "The FACTOR criteria result in zero factors extracted. Therefore no analysis "
 "will be performed."
 msgstr ""
 
-#: src/language/stats/factor.c:1493
+#: src/language/stats/factor.c:1782
 msgid ""
 "The FACTOR criteria result in more factors than variables, which is not "
 "meaningful. No analysis will be performed."
 msgstr ""
 
+#: src/language/stats/factor.c:1865
+msgid "Component Matrix"
+msgstr ""
+
+#: src/language/stats/factor.c:1865
+#, fuzzy
+msgid "Factor Matrix"
+msgstr "Lista de Fator:"
+
+#: src/language/stats/factor.c:1871
+msgid "Rotated Component Matrix"
+msgstr ""
+
+#: src/language/stats/factor.c:1871
+#, fuzzy
+msgid "Rotated Factor Matrix"
+msgstr "Lista de Fator:"
+
 #: src/language/stats/flip.c:98
 msgid ""
 "FLIP ignores TEMPORARY.  Temporary transformations will be made permanent."
@@ -2955,7 +2959,7 @@ msgstr ""
 
 #: src/language/stats/roc.c:952 src/language/stats/examine.q:1641
 #: src/language/stats/oneway.q:388 src/language/stats/oneway.q:683
-#: src/language/stats/regression.q:201
+#: src/language/stats/regression.q:198
 msgid "Std. Error"
 msgstr "Erro padrão"
 
@@ -3841,7 +3845,7 @@ msgstr ""
 msgid "ascii: opening output file \"%s\""
 msgstr ""
 
-#: src/output/ascii.c:913 src/output/cairo.c:826
+#: src/output/ascii.c:913 src/output/cairo.c:784
 #, c-format
 msgid "%s - Page %d"
 msgstr ""
@@ -3964,36 +3968,36 @@ msgstr ""
 "problema na caixa: (%d+%d=%d,%d+%d=%d)-(%d+%d=%d,%d+%d=%d) no tamanho da "
 "tabela (%d,%d)\n"
 
-#: src/output/cairo.c:283
+#: src/output/cairo.c:295
 #, fuzzy, c-format
 msgid "error opening output file \"%s\": %s"
 msgstr "Erro ao fechar arquivo portável \"%s\": %s."
 
-#: src/output/cairo.c:301
+#: src/output/cairo.c:312
 #, c-format
 msgid ""
 "The defined page is not wide enough to hold at least %d characters in the "
 "default font.  In fact, there's only room for %d characters."
 msgstr ""
 
-#: src/output/cairo.c:311
+#: src/output/cairo.c:322
 #, c-format
 msgid ""
 "The defined page is not long enough to hold margins and headers, plus least %"
 "d lines of the default fonts.  In fact, there's only room for %d lines."
 msgstr ""
 
-#: src/output/cairo.c:364
+#: src/output/cairo.c:376
 #, c-format
 msgid "error drawing output for %s driver: %s"
 msgstr ""
 
-#: src/output/cairo.c:906
+#: src/output/cairo.c:864
 #, c-format
 msgid "\"%s\": bad font specification"
 msgstr "\"%s\": especificação de fonte inválida"
 
-#: src/output/cairo.c:1116
+#: src/output/cairo.c:1084
 #, fuzzy, c-format
 msgid "error writing output file \"%s\": %s"
 msgstr "Erro escrevendo em arquivo FLIP: %s."
@@ -4092,16 +4096,6 @@ msgstr ""
 msgid "%s: output option specified more than once"
 msgstr ""
 
-#: src/ui/gui/about.c:66
-msgid "A program for the analysis of sampled data"
-msgstr ""
-
-#. TRANSLATORS: Use this string to list the people who have helped with
-#. translation to your language.
-#: src/ui/gui/about.c:76
-msgid "translator-credits"
-msgstr ""
-
 #: src/ui/gui/checkbox-treeview.c:92 src/language/stats/crosstabs.q:1213
 #: src/language/stats/crosstabs.q:1240 src/language/stats/crosstabs.q:1263
 #: src/language/stats/crosstabs.q:1287 src/language/stats/examine.q:1638
@@ -4168,7 +4162,7 @@ msgstr "Corr"
 #: src/ui/gui/crosstabs-dialog.c:54 src/ui/gui/crosstabs-dialog.c:65
 #: src/ui/gui/crosstabs-dialog.c:100 src/ui/gui/crosstabs-dialog.c:108
 #: src/ui/gui/psppire-var-store.c:612 src/ui/gui/var-display.c:16
-#: src/ui/gui/variable-info-dialog.c:40
+#: src/ui/gui/variable-info-dialog.c:41
 msgid "None"
 msgstr "Nenhum"
 
@@ -4204,12 +4198,12 @@ msgstr "Desvio padrão"
 msgid "Standard error"
 msgstr "Erro padrão"
 
-#: src/ui/gui/find-dialog.c:651
+#: src/ui/gui/find-dialog.c:649
 #, c-format
 msgid "Bad regular expression: %s"
 msgstr "Expressão regular mal formada: %s"
 
-#: src/ui/gui/factor-dialog.c:230
+#: src/ui/gui/factor-dialog.c:344
 #, c-format
 msgid "Eigenvalues over %4.2f times the mean eigenvalue"
 msgstr ""
@@ -4235,17 +4229,35 @@ msgstr "Erro padrão do kurtosis"
 msgid "Median"
 msgstr ""
 
-#: src/ui/gui/helper.c:196
+#: src/ui/gui/helper.c:197
 msgid "Sorry. The help system hasn't yet been implemented."
 msgstr "Desculpe. O sistema de ajuda ainda não foi implementado."
 
-#: src/ui/gui/helper.c:241
+#: src/ui/gui/help-menu.c:67
+msgid "A program for the analysis of sampled data"
+msgstr ""
+
+#. TRANSLATORS: Use this string to list the people who have helped with
+#. translation to your language.
+#: src/ui/gui/help-menu.c:77
+msgid "translator-credits"
+msgstr ""
+
+#: src/ui/gui/help-menu.c:98
 #, c-format
 msgid ""
 "Cannot open reference manual: %s.  The PSPP user manual is also available at "
 "http://www.gnu.org/software/pspp/documentation.html"
 msgstr ""
 
+#: src/ui/gui/help-menu.c:117
+msgid "_Help"
+msgstr "A_juda"
+
+#: src/ui/gui/help-menu.c:124
+msgid "_Reference Manual"
+msgstr "_Manual de Referência"
+
 #: src/ui/gui/missing-val-dialog.c:113 src/ui/gui/missing-val-dialog.c:167
 msgid "Incorrect value for variable type"
 msgstr "Valor incorreto para tipo de variável"
@@ -4254,7 +4266,7 @@ msgstr "Valor incorreto para tipo de variável"
 msgid "Incorrect range specification"
 msgstr "Especificação incorreta de intervalo"
 
-#: src/ui/gui/oneway-anova-dialog.c:314
+#: src/ui/gui/oneway-anova-dialog.c:313
 #, c-format
 msgid "Contrast %d of %d"
 msgstr "Contraste %d de %d"
@@ -4279,57 +4291,57 @@ msgstr "Visualização de variáveis"
 msgid "var"
 msgstr "var"
 
-#: src/ui/gui/psppire-data-window.c:210
+#: src/ui/gui/psppire-data-window.c:212
 msgid "Transformations Pending"
 msgstr "Transformação Pendente"
 
-#: src/ui/gui/psppire-data-window.c:226
+#: src/ui/gui/psppire-data-window.c:228
 msgid "Filter off"
 msgstr "Sem Filtro"
 
-#: src/ui/gui/psppire-data-window.c:240
+#: src/ui/gui/psppire-data-window.c:242
 #, c-format
 msgid "Filter by %s"
 msgstr "Filtrar por %s"
 
-#: src/ui/gui/psppire-data-window.c:261
+#: src/ui/gui/psppire-data-window.c:263
 msgid "No Split"
 msgstr "Sem divisão"
 
-#: src/ui/gui/psppire-data-window.c:270
+#: src/ui/gui/psppire-data-window.c:272
 msgid "Split by "
 msgstr "Dividido por "
 
-#: src/ui/gui/psppire-data-window.c:298
+#: src/ui/gui/psppire-data-window.c:300
 msgid "Weights off"
 msgstr "Sem ponderação"
 
-#: src/ui/gui/psppire-data-window.c:312
+#: src/ui/gui/psppire-data-window.c:314
 #, c-format
 msgid "Weight by %s"
 msgstr "Ponderar por %s"
 
-#: src/ui/gui/psppire-data-window.c:380
+#: src/ui/gui/psppire-data-window.c:382
 msgid "Open"
 msgstr "Abrir"
 
-#: src/ui/gui/psppire-data-window.c:390
+#: src/ui/gui/psppire-data-window.c:392
 msgid "Data and Syntax Files"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:400 src/ui/gui/psppire-data-window.c:611
+#: src/ui/gui/psppire-data-window.c:402 src/ui/gui/psppire-data-window.c:611
 msgid "System Files (*.sav)"
 msgstr "Arquivo de Sistema (*.sav)"
 
-#: src/ui/gui/psppire-data-window.c:406 src/ui/gui/psppire-data-window.c:617
+#: src/ui/gui/psppire-data-window.c:408 src/ui/gui/psppire-data-window.c:617
 msgid "Portable Files (*.por) "
 msgstr "Arquivo Portável (*.por) "
 
-#: src/ui/gui/psppire-data-window.c:412 src/ui/gui/psppire-syntax-window.c:292
+#: src/ui/gui/psppire-data-window.c:414 src/ui/gui/psppire-syntax-window.c:292
 msgid "Syntax Files (*.sps) "
 msgstr "Arquivo de Sintaxe (*.sps) "
 
-#: src/ui/gui/psppire-data-window.c:418 src/ui/gui/psppire-data-window.c:623
+#: src/ui/gui/psppire-data-window.c:420 src/ui/gui/psppire-data-window.c:623
 #: src/ui/gui/psppire-syntax-window.c:298
 msgid "All Files"
 msgstr "Todos os Arquivos"
@@ -4342,47 +4354,47 @@ msgstr "Salvar"
 msgid "Portable File"
 msgstr "Arquivo portátil"
 
-#: src/ui/gui/psppire-data-window.c:786
+#: src/ui/gui/psppire-data-window.c:773
 msgid "Font Selection"
 msgstr "Seleção de fonte"
 
-#: src/ui/gui/psppire-data-window.c:1581
+#: src/ui/gui/psppire-data-window.c:1261
 #, fuzzy
 msgid "Data Editor"
 msgstr "%s --- Editor de Dados do PSPP"
 
-#: src/ui/gui/psppire-output-window.c:441
+#: src/ui/gui/psppire-output-window.c:458
 msgid "Export Output"
 msgstr ""
 
-#: src/ui/gui/psppire-output-window.c:449
+#: src/ui/gui/psppire-output-window.c:466
 #, fuzzy
 msgid "PDF Files (*.pdf)"
 msgstr "Arquivo Portável (*.por) "
 
-#: src/ui/gui/psppire-output-window.c:450
+#: src/ui/gui/psppire-output-window.c:467
 msgid "HTML Files (*.html)"
 msgstr ""
 
-#: src/ui/gui/psppire-output-window.c:451
+#: src/ui/gui/psppire-output-window.c:468
 msgid "OpenDocument Files (*.odt)"
 msgstr ""
 
-#: src/ui/gui/psppire-output-window.c:452
+#: src/ui/gui/psppire-output-window.c:469
 #, fuzzy
 msgid "Text Files (*.txt)"
 msgstr "Arquivo de Sistema (*.sav)"
 
-#: src/ui/gui/psppire-output-window.c:453
+#: src/ui/gui/psppire-output-window.c:470
 #, fuzzy
 msgid "PostScript Files (*.ps)"
 msgstr "Arquivo Portável (*.por) "
 
-#: src/ui/gui/psppire-output-window.c:454
+#: src/ui/gui/psppire-output-window.c:471
 msgid "Comma-Separated Value Files (*.csv)"
 msgstr ""
 
-#: src/ui/gui/psppire-output-window.c:593
+#: src/ui/gui/psppire-output-window.c:605
 #, fuzzy
 msgid "Output Viewer"
 msgstr "Variável de Saída"
@@ -4396,12 +4408,12 @@ msgstr "lendo arquivo de fonte \"%s\""
 msgid "Save Syntax"
 msgstr "Salvar Sintaxe"
 
-#: src/ui/gui/psppire-syntax-window.c:512
+#: src/ui/gui/psppire-syntax-window.c:496
 #, fuzzy
 msgid "Syntax Editor"
 msgstr "Editor de Sintaxe do PSPP"
 
-#: src/ui/gui/psppire-syntax-window.c:526
+#: src/ui/gui/psppire-syntax-window.c:510
 #, fuzzy, c-format
 msgid "Cannot load syntax file '%s'"
 msgstr "impossível abrir arquivo de fonte \"%s\""
@@ -4484,27 +4496,27 @@ msgstr ""
 msgid "Close _without saving"
 msgstr "%s sem %s."
 
-#: src/ui/gui/recode-dialog.c:915
+#: src/ui/gui/recode-dialog.c:911
 msgid "Recode into Different Variables"
 msgstr "Transformar para Variáveis Diferentes"
 
-#: src/ui/gui/recode-dialog.c:918 src/ui/gui/recode.ui:692
+#: src/ui/gui/recode-dialog.c:914 src/ui/gui/recode.ui:692
 msgid "Recode into Same Variables"
 msgstr "Transformar para a Mesma Variável"
 
-#: src/ui/gui/recode-dialog.c:933 src/ui/gui/recode-dialog.c:1029
+#: src/ui/gui/recode-dialog.c:929 src/ui/gui/recode-dialog.c:1025
 msgid "New"
 msgstr "Novo"
 
-#: src/ui/gui/recode-dialog.c:948 src/ui/gui/recode-dialog.c:1021
+#: src/ui/gui/recode-dialog.c:944 src/ui/gui/recode-dialog.c:1017
 msgid "Old"
 msgstr "Antigo"
 
-#: src/ui/gui/recode-dialog.c:1278
+#: src/ui/gui/recode-dialog.c:1274
 msgid "Recode into Different Variables: Old and New Values "
 msgstr "Transformar Para Diferentes Variáveis: Antigos e Novos Valores "
 
-#: src/ui/gui/recode-dialog.c:1279
+#: src/ui/gui/recode-dialog.c:1275
 msgid "Recode into Same Variables: Old and New Values"
 msgstr "Transformar Para a Mesma Variável: Antigos e Novos Valores"
 
@@ -4512,7 +4524,7 @@ msgstr "Transformar Para a Mesma Variável: Antigos e Novos Valores"
 msgid "Coeff"
 msgstr "Coeff"
 
-#: src/ui/gui/regression-dialog.c:43 src/language/stats/regression.q:158
+#: src/ui/gui/regression-dialog.c:43 src/language/stats/regression.q:155
 msgid "R"
 msgstr ""
 
@@ -4627,31 +4639,31 @@ msgstr "Campo contendo \"%.*s\" não pode ser analisado no formato %s."
 msgid "Confidence Interval: %2d %%"
 msgstr "Intervalo de confiança: %2d %%"
 
-#: src/ui/gui/variable-info-dialog.c:76
+#: src/ui/gui/variable-info-dialog.c:77
 #, c-format
 msgid "Label: %s\n"
 msgstr "Rótulo: %s\n"
 
-#: src/ui/gui/variable-info-dialog.c:83
+#: src/ui/gui/variable-info-dialog.c:84
 #, c-format
 msgid "Type: %s\n"
 msgstr "Tipo: %s\n"
 
-#: src/ui/gui/variable-info-dialog.c:87
+#: src/ui/gui/variable-info-dialog.c:88
 #, c-format
 msgid "Missing Values: %s\n"
 msgstr "Valores missing: %s\n"
 
-#: src/ui/gui/variable-info-dialog.c:92
+#: src/ui/gui/variable-info-dialog.c:93
 #, c-format
 msgid "Measurement Level: %s\n"
 msgstr "Nível de medida: %s\n"
 
-#: src/ui/gui/variable-info-dialog.c:105
+#: src/ui/gui/variable-info-dialog.c:106
 msgid "Value Labels:\n"
 msgstr "Rótulos de valores:\n"
 
-#: src/ui/gui/variable-info-dialog.c:115
+#: src/ui/gui/variable-info-dialog.c:116
 #, c-format
 msgid "%s %s\n"
 msgstr ""
@@ -4666,27 +4678,27 @@ msgstr "Não ponderar casos"
 msgid "Weight cases by %s"
 msgstr "Pesar casos por %s"
 
-#: tests/dissect-sysfile.c:567
+#: tests/dissect-sysfile.c:571
 #, fuzzy, c-format
 msgid "Unrecognized record type 7, subtype %d."
 msgstr "Registro de tipo %d não reconhecido."
 
-#: tests/dissect-sysfile.c:846
+#: tests/dissect-sysfile.c:850
 #, c-format
 msgid "%s: Error parsing attribute value %s[%d]"
 msgstr ""
 
-#: tests/dissect-sysfile.c:852
+#: tests/dissect-sysfile.c:856
 #, c-format
 msgid "%s: Attribute value %s[%d] is not quoted: %s"
 msgstr ""
 
-#: tests/dissect-sysfile.c:876
+#: tests/dissect-sysfile.c:880
 #, fuzzy, c-format
 msgid "Bad size %zu for extended number of cases."
 msgstr "Tamanho %zu inválido da extensão 11."
 
-#: tests/dissect-sysfile.c:882
+#: tests/dissect-sysfile.c:886
 #, c-format
 msgid "Bad count %zu for extended number of cases."
 msgstr ""
@@ -5153,14 +5165,10 @@ msgstr ""
 msgid "Omitting pie chart for %s, which has over 50 unique values."
 msgstr ""
 
-#: src/language/stats/glm.q:245
+#: src/language/stats/glm.q:248
 msgid "Multivariate GLM not yet supported"
 msgstr ""
 
-#: src/language/stats/glm.q:355 src/language/stats/regression.q:998
-msgid "No valid data found. This command was skipped."
-msgstr ""
-
 #: src/language/stats/means.q:100
 msgid "Missing required subcommand TABLES."
 msgstr "Faltando subcomando necessário TABLES."
@@ -5169,24 +5177,24 @@ msgstr "Faltando subcomando necessário TABLES."
 msgid "TABLES subcommand may not appear more than once."
 msgstr ""
 
-#: src/language/stats/npar.q:110
+#: src/language/stats/npar.q:111
 msgid "NPAR subcommand not currently implemented."
 msgstr ""
 
-#: src/language/stats/npar.q:254
+#: src/language/stats/npar.q:256
 #, c-format
 msgid ""
 "The specified value of HI (%d) is lower than the specified value of LO (%d)"
 msgstr ""
 
-#: src/language/stats/npar.q:309
+#: src/language/stats/npar.q:311
 #, c-format
 msgid ""
 "%d expected values were given, but the specified range (%d-%d) requires "
 "exactly %d values."
 msgstr ""
 
-#: src/language/stats/npar.q:444 src/language/stats/t-test.q:380
+#: src/language/stats/npar.q:453 src/language/stats/t-test.q:380
 #, c-format
 msgid ""
 "PAIRED was specified but the number of variables preceding WITH (%zu) did "
@@ -5207,21 +5215,21 @@ msgstr ""
 msgid "`%s' is not a variable name"
 msgstr ""
 
-#: src/language/stats/oneway.q:274 src/language/stats/regression.q:298
+#: src/language/stats/oneway.q:274 src/language/stats/regression.q:283
 msgid "Sum of Squares"
 msgstr "Soma dos quadrados"
 
-#: src/language/stats/oneway.q:276 src/language/stats/regression.q:300
+#: src/language/stats/oneway.q:276 src/language/stats/regression.q:285
 msgid "Mean Square"
 msgstr ""
 
-#: src/language/stats/oneway.q:277 src/language/stats/regression.q:301
+#: src/language/stats/oneway.q:277 src/language/stats/regression.q:286
 #: src/language/stats/t-test.q:749
 msgid "F"
 msgstr ""
 
 #: src/language/stats/oneway.q:278 src/language/stats/oneway.q:535
-#: src/language/stats/regression.q:204 src/language/stats/regression.q:302
+#: src/language/stats/regression.q:201 src/language/stats/regression.q:287
 msgid "Significance"
 msgstr ""
 
@@ -5233,7 +5241,7 @@ msgstr ""
 msgid "Within Groups"
 msgstr ""
 
-#: src/language/stats/oneway.q:345 src/language/stats/regression.q:327
+#: src/language/stats/oneway.q:345 src/language/stats/regression.q:312
 msgid "ANOVA"
 msgstr "ANOVA"
 
@@ -5269,7 +5277,7 @@ msgstr ""
 msgid "Value of Contrast"
 msgstr ""
 
-#: src/language/stats/oneway.q:684 src/language/stats/regression.q:203
+#: src/language/stats/oneway.q:684 src/language/stats/regression.q:200
 #: src/language/stats/t-test.q:751 src/language/stats/t-test.q:922
 #: src/language/stats/t-test.q:1009
 msgid "t"
@@ -5336,64 +5344,68 @@ msgstr ""
 msgid "Too many variables in INTO clause."
 msgstr ""
 
-#: src/language/stats/regression.q:159
+#: src/language/stats/regression.q:156
 msgid "R Square"
 msgstr ""
 
-#: src/language/stats/regression.q:160
+#: src/language/stats/regression.q:157
 msgid "Adjusted R Square"
 msgstr ""
 
-#: src/language/stats/regression.q:161
+#: src/language/stats/regression.q:158
 msgid "Std. Error of the Estimate"
 msgstr ""
 
-#: src/language/stats/regression.q:166
+#: src/language/stats/regression.q:163
 msgid "Model Summary"
 msgstr ""
 
-#: src/language/stats/regression.q:200
+#: src/language/stats/regression.q:197
 msgid "B"
 msgstr ""
 
-#: src/language/stats/regression.q:202
+#: src/language/stats/regression.q:199
 msgid "Beta"
 msgstr ""
 
-#: src/language/stats/regression.q:205
+#: src/language/stats/regression.q:202
 msgid "(Constant)"
 msgstr ""
 
-#: src/language/stats/regression.q:269
+#: src/language/stats/regression.q:254
 msgid "Coefficients"
 msgstr "Coeficientes"
 
-#: src/language/stats/regression.q:304 src/ui/gui/regression.ui:7
+#: src/language/stats/regression.q:289 src/ui/gui/regression.ui:7
 msgid "Regression"
 msgstr "Regressão"
 
-#: src/language/stats/regression.q:385
+#: src/language/stats/regression.q:370
 msgid "Model"
 msgstr "Modelo"
 
-#: src/language/stats/regression.q:386
+#: src/language/stats/regression.q:371
 msgid "Covariances"
 msgstr "Co-variança"
 
-#: src/language/stats/regression.q:401
+#: src/language/stats/regression.q:386
 msgid "Coefficient Correlations"
 msgstr ""
 
-#: src/language/stats/regression.q:808
+#: src/language/stats/regression.q:793
 msgid ""
 "The dependent variable is equal to the independent variable.The least "
 "squares line is therefore Y=X.Standard errors and related statistics may be "
 "meaningless."
 msgstr ""
 
-#: src/language/stats/regression.q:900
-msgid "Dependent variable must be numeric."
-msgstr "Variável dependente precisa ser numérica"
+#: src/language/stats/regression.q:891
+msgid "REGRESSION requires numeric variables."
+msgstr ""
+
+#: src/language/stats/regression.q:962
+msgid "No valid data found. This command was skipped."
+msgstr ""
 
 #: src/language/stats/reliability.q:421
 #, fuzzy
@@ -5658,6 +5670,27 @@ msgstr ""
 msgid "The step value %ld is less than 1.  The value is being reset to 1."
 msgstr ""
 
+#: src/ui/gui/binomial.ui:57 src/ui/gui/chi-square.ui:57
+#, fuzzy
+msgid "_Test Variable List:"
+msgstr "Variável(is) de teste:"
+
+#: src/ui/gui/binomial.ui:126 src/ui/gui/chi-square.ui:126
+msgid "_Get from data"
+msgstr ""
+
+#: src/ui/gui/binomial.ui:143 src/ui/gui/t-test.ui:333
+msgid "_Cut point:"
+msgstr "Ponto de _corte:"
+
+#: src/ui/gui/binomial.ui:178
+msgid "Define Dichotomy"
+msgstr ""
+
+#: src/ui/gui/binomial.ui:197
+msgid "Test _Proportion:"
+msgstr ""
+
 #: src/ui/gui/correlation.ui:7
 #, fuzzy
 msgid "Bivariate Correlations"
@@ -5768,6 +5801,44 @@ msgstr "Testes estatísticos"
 msgid "Statistics"
 msgstr "Estatísticas"
 
+#: src/ui/gui/chi-square.ui:13
+#, fuzzy
+msgid "Chi-Square Test"
+msgstr "Teste Chi-quadrado"
+
+#: src/ui/gui/chi-square.ui:140
+msgid "Use _specified range"
+msgstr ""
+
+#: src/ui/gui/chi-square.ui:162
+#, fuzzy
+msgid "_Lower:"
+msgstr "Mínimo"
+
+#: src/ui/gui/chi-square.ui:170
+#, fuzzy
+msgid "_Upper:"
+msgstr "Máximo"
+
+#: src/ui/gui/chi-square.ui:214
+#, fuzzy
+msgid "Expected Range:"
+msgstr "N esperado"
+
+#: src/ui/gui/chi-square.ui:240
+msgid "All categor_ies equal"
+msgstr ""
+
+#: src/ui/gui/chi-square.ui:257
+#, fuzzy
+msgid "_Values"
+msgstr "Valores"
+
+#: src/ui/gui/chi-square.ui:301
+#, fuzzy
+msgid "Expected Values:"
+msgstr "N esperado"
+
 #: src/ui/gui/descriptives.ui:130 src/ui/gui/frequencies.ui:140
 msgid "Statistics:"
 msgstr "Estatísticas:"
@@ -5848,62 +5919,100 @@ msgstr "Lista de Fator:"
 
 #: src/ui/gui/factor.ui:47
 #, fuzzy
-msgid "Descriptives..."
+msgid "_Descriptives..."
 msgstr "Descritivas"
 
 #: src/ui/gui/factor.ui:60
 #, fuzzy
-msgid "Extraction..."
+msgid "_Extraction..."
+msgstr "Opções..."
+
+#: src/ui/gui/factor.ui:74
+#, fuzzy
+msgid "_Rotations..."
 msgstr "Opções..."
 
-#: src/ui/gui/factor.ui:180
+#: src/ui/gui/factor.ui:192
 msgid "Factor Analysis: Extraction"
 msgstr ""
 
-#: src/ui/gui/factor.ui:204
+#: src/ui/gui/factor.ui:216
 #, fuzzy
 msgid "Method: "
 msgstr "Modo:"
 
-#: src/ui/gui/factor.ui:254
+#: src/ui/gui/factor.ui:266
 msgid "Correlation matrix"
 msgstr ""
 
-#: src/ui/gui/factor.ui:268
+#: src/ui/gui/factor.ui:280
 #, fuzzy
 msgid "Covariance matrix"
 msgstr "Co-variança"
 
-#: src/ui/gui/factor.ui:288
+#: src/ui/gui/factor.ui:300
 #, fuzzy
 msgid "Analyse"
 msgstr "_Analisar"
 
-#: src/ui/gui/factor.ui:312
+#: src/ui/gui/factor.ui:324
 msgid "Unrotatated factor solution"
 msgstr ""
 
-#: src/ui/gui/factor.ui:326
+#: src/ui/gui/factor.ui:338
 msgid "Scree plot"
 msgstr ""
 
-#: src/ui/gui/factor.ui:345 src/ui/gui/roc.ui:286
+#: src/ui/gui/factor.ui:357 src/ui/gui/roc.ui:286
 #, fuzzy
 msgid "Display"
 msgstr "Visualizar Célula"
 
-#: src/ui/gui/factor.ui:418
+#: src/ui/gui/factor.ui:430
 msgid "Number of factors:"
 msgstr ""
 
-#: src/ui/gui/factor.ui:448
+#: src/ui/gui/factor.ui:460
 msgid "Extract"
 msgstr ""
 
-#: src/ui/gui/factor.ui:463
+#: src/ui/gui/factor.ui:475 src/ui/gui/factor.ui:665
 msgid "Maximum iterations for convergence:"
 msgstr ""
 
+#: src/ui/gui/factor.ui:538
+#, fuzzy
+msgid "Factor Analysis: Rotation"
+msgstr "Lista de Fator:"
+
+#: src/ui/gui/factor.ui:571
+#, fuzzy
+msgid "_None"
+msgstr "Nenhum"
+
+#: src/ui/gui/factor.ui:582
+#, fuzzy
+msgid "_Varimax"
+msgstr "_Variáveis"
+
+#: src/ui/gui/factor.ui:598
+msgid "_Quartimax"
+msgstr ""
+
+#: src/ui/gui/factor.ui:614
+msgid "_Equimax"
+msgstr ""
+
+#: src/ui/gui/factor.ui:637
+#, fuzzy
+msgid "Method"
+msgstr "Modo:"
+
+#: src/ui/gui/factor.ui:648
+#, fuzzy
+msgid "_Display rotated solution"
+msgstr "informação do arquivo de dados"
+
 #: src/ui/gui/find.ui:8
 msgid "Find Case"
 msgstr "Localizar Casos"
@@ -6615,10 +6724,6 @@ msgstr "Valor do grupo_2:"
 msgid "Group_1 value:"
 msgstr "Valor do grupo_1:"
 
-#: src/ui/gui/t-test.ui:333
-msgid "_Cut point:"
-msgstr "Ponto de _corte:"
-
 #: src/ui/gui/t-test.ui:365
 msgid "_Use specified values:"
 msgstr ""
@@ -6864,19 +6969,19 @@ msgstr "Ordenar Ascendentemente "
 msgid "Sort Descending"
 msgstr "Ordenar Descendentemente"
 
-#: src/ui/gui/data-editor.ui:26 src/ui/gui/output-viewer.glade:21
-#: src/ui/gui/syntax-editor.glade:14
+#: src/ui/gui/data-editor.ui:26 src/ui/gui/output-viewer.ui:9
+#: src/ui/gui/syntax-editor.ui:10
 msgid "_File"
 msgstr "_Arquivo"
 
-#: src/ui/gui/data-editor.ui:38 src/ui/gui/syntax-editor.glade:32
-#: src/ui/gui/syntax-editor.glade:62
+#: src/ui/gui/data-editor.ui:38 src/ui/gui/syntax-editor.ui:22
+#: src/ui/gui/syntax-editor.ui:40
 msgid "_Syntax"
 msgstr "_Sintaxe"
 
 #: src/ui/gui/data-editor.ui:44 src/ui/gui/data-editor.ui:217
-#: src/ui/gui/data-editor.ui:229 src/ui/gui/syntax-editor.glade:41
-#: src/ui/gui/syntax-editor.glade:71
+#: src/ui/gui/data-editor.ui:229 src/ui/gui/syntax-editor.ui:28
+#: src/ui/gui/syntax-editor.ui:46
 msgid "_Data"
 msgstr "_Dados"
 
@@ -6906,8 +7011,8 @@ msgstr "Dados Recen_temente usados"
 msgid "Recently Used _Files"
 msgstr "Arquivos _Recentemente Usados"
 
-#: src/ui/gui/data-editor.ui:111 src/ui/gui/output-viewer.glade:43
-#: src/ui/gui/syntax-editor.glade:118
+#: src/ui/gui/data-editor.ui:111 src/ui/gui/output-viewer.ui:28
+#: src/ui/gui/syntax-editor.ui:70
 msgid "_Edit"
 msgstr "_Editar"
 
@@ -7127,13 +7232,13 @@ msgstr "Pular para variável"
 msgid "Data File _Comments"
 msgstr "_Comentários do Arquivo de Dados"
 
-#: src/ui/gui/data-editor.ui:444 src/ui/gui/output-viewer.glade:66
-#: src/ui/gui/syntax-editor.glade:209
+#: src/ui/gui/data-editor.ui:444 src/ui/gui/output-viewer.ui:40
+#: src/ui/gui/syntax-editor.ui:131
 msgid "_Windows"
 msgstr "_Janelas"
 
-#: src/ui/gui/data-editor.ui:450 src/ui/gui/output-viewer.glade:76
-#: src/ui/gui/syntax-editor.glade:218
+#: src/ui/gui/data-editor.ui:450 src/ui/gui/output-viewer.ui:46
+#: src/ui/gui/syntax-editor.ui:137
 msgid "_Minimize All Windows"
 msgstr "_Minimizar Todas as Janelas"
 
@@ -7142,69 +7247,64 @@ msgstr "_Minimizar Todas as Janelas"
 msgid "_Split"
 msgstr "_Dividir"
 
-#: src/ui/gui/data-editor.ui:462 src/ui/gui/output-viewer.glade:87
-#: src/ui/gui/syntax-editor.glade:229
-msgid "_Help"
-msgstr "A_juda"
-
-#: src/ui/gui/data-editor.ui:468 src/ui/gui/output-viewer.glade:94
-#: src/ui/gui/syntax-editor.glade:237
-msgid "_Reference Manual"
-msgstr "_Manual de Referência"
-
-#: src/ui/gui/data-editor.ui:652
+#: src/ui/gui/data-editor.ui:630
 msgid "Information Area"
 msgstr "Área de Informação"
 
-#: src/ui/gui/data-editor.ui:674
+#: src/ui/gui/data-editor.ui:652
 msgid "Processor Area"
 msgstr "Área do Processamento"
 
-#: src/ui/gui/data-editor.ui:699
+#: src/ui/gui/data-editor.ui:677
 msgid "Case Counter Area"
 msgstr "Área de Contagem dos Casos"
 
-#: src/ui/gui/data-editor.ui:724
+#: src/ui/gui/data-editor.ui:702
 msgid "Filter Use Status Area"
 msgstr "Área de Status do Uso de Filtros"
 
-#: src/ui/gui/data-editor.ui:750
+#: src/ui/gui/data-editor.ui:728
 msgid "Weight Status Area"
 msgstr "Área de status da ponderação"
 
-#: src/ui/gui/data-editor.ui:776
+#: src/ui/gui/data-editor.ui:754
 msgid "Split File Status Area"
 msgstr "Área de Status da Divisão de Arquivos"
 
-#: src/ui/gui/output-viewer.glade:31
+#: src/ui/gui/output-viewer.ui:22
 #, fuzzy
 msgid "_Export"
 msgstr "_Explorar"
 
-#: src/ui/gui/output-viewer.glade:101 src/ui/gui/syntax-editor.glade:244
-msgid "_About"
-msgstr "_Sobre"
-
-#: src/ui/gui/syntax-editor.glade:163
+#: src/ui/gui/syntax-editor.ui:100
 msgid "_Run"
 msgstr "_Executar"
 
-#: src/ui/gui/syntax-editor.glade:172
+#: src/ui/gui/syntax-editor.ui:106
 msgid "All"
 msgstr "Todos"
 
-#: src/ui/gui/syntax-editor.glade:180
+#: src/ui/gui/syntax-editor.ui:112
 msgid "Selection"
 msgstr "Seleção"
 
-#: src/ui/gui/syntax-editor.glade:188
+#: src/ui/gui/syntax-editor.ui:118
 msgid "Current Line"
 msgstr "Linha atual"
 
-#: src/ui/gui/syntax-editor.glade:197
+#: src/ui/gui/syntax-editor.ui:125
 msgid "To End"
 msgstr "Para o Final"
 
+#~ msgid "Dependent variable must be numeric."
+#~ msgstr "Variável dependente precisa ser numérica"
+
+#~ msgid "Variable %s has label of invalid length %zu."
+#~ msgstr "Variável %s tem um rótulo de tamanho inválido %zu."
+
+#~ msgid "_About"
+#~ msgstr "_Sobre"
+
 #~ msgid "searching for \"%s\" in path \"%s\""
 #~ msgstr "Procurando \"%s\" no caminho \"%s\""
 
index e508ff7e604f3aa2c678fbedf324c5f5eb412999..19403cf7f3ae95ee48ce6635c756d3a0d9d25545 100644 (file)
@@ -42,8 +42,6 @@ src_data_libdata_la_SOURCES = \
        src/data/case.h \
        src/data/case-tmpfile.c \
        src/data/case-tmpfile.h \
-       src/data/category.c \
-       src/data/category.h \
        src/data/data-in.c \
        src/data/data-in.h \
        src/data/data-out.c \
diff --git a/src/data/category.c b/src/data/category.c
deleted file mode 100644 (file)
index 968dd4c..0000000
+++ /dev/null
@@ -1,199 +0,0 @@
-/* PSPP - a program for statistical analysis.
-   Copyright (C) 2005, 2009 Free Software Foundation, Inc.
-
-   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 3 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, see <http://www.gnu.org/licenses/>. */
-
-/*
-  Functions and data structures to store values of a categorical
-  variable, and to recode those values into binary vectors.
-
-  For some statistical models, it is necessary to change each value
-  of a categorical variable to a vector with binary entries. These
-  vectors are then stored as sub-rows within a matrix during
-  model-fitting. For example, we need functions and data strucutres to map a
-  value, say 'a', of a variable named 'cat_var', to a vector, say (0
-  1 0 0 0), and vice versa.  We also need to be able to map the
-  vector back to the value 'a', and if the vector is a sub-row of a
-  matrix, we need to know which sub-row corresponds to the variable
-  'cat_var'.
-*/
-#include <config.h>
-
-#include <assert.h>
-#include <data/category.h>
-#include <data/value.h>
-#include <data/variable.h>
-#include <gl/xalloc.h>
-#include <libpspp/message.h>
-#include <stdlib.h>
-#include <string.h>
-
-#define CAT_VALUE_NOT_FOUND -1
-
-#define N_INITIAL_CATEGORIES 1
-
-/*
-  This structure contains the observed values of a
-  categorical variable.
- */
-struct cat_vals
-{
-  union value *vals;
-  size_t n_categories;
-  size_t n_allocated_categories;       /* This is used only during
-                                          initialization to keep
-                                          track of the number of
-                                          values stored.
-                                        */
-  size_t *value_counts; /* Element i stores the number of cases for which
-                          the categorical variable has that corresponding 
-                          value. This is necessary for computing covariance
-                          matrices.
-                        */
-};
-
-void
-cat_stored_values_create (const struct variable *v)
-{
-  if (!var_has_obs_vals (v))
-    {
-      struct cat_vals *obs_vals = xmalloc (sizeof *obs_vals);
-
-      obs_vals->n_categories = 0;
-      obs_vals->n_allocated_categories = N_INITIAL_CATEGORIES;
-      obs_vals->vals = xnmalloc (N_INITIAL_CATEGORIES, sizeof *obs_vals->vals);
-      obs_vals->value_counts = xnmalloc (N_INITIAL_CATEGORIES, sizeof *obs_vals->value_counts);
-      var_set_obs_vals (v, obs_vals);
-    }
-}
-
-void
-cat_stored_values_destroy (struct cat_vals *obs_vals)
-{
-  if (obs_vals != NULL)
-    {
-      if (obs_vals->n_allocated_categories > 0)
-       {
-         free (obs_vals->vals);
-         free (obs_vals->value_counts);
-       }
-      free (obs_vals);
-    }
-}
-
-/*
-  Which subscript corresponds to val?
- */
-size_t
-cat_value_find (const struct variable *v, const union value *val)
-{
-  struct cat_vals *obs_vals = var_get_obs_vals (v);
-  size_t i;
-  const union value *candidate;
-
-  for (i = 0; i < obs_vals->n_categories; i++)
-    {
-      candidate = obs_vals->vals + i;
-      assert (candidate != NULL);
-      if (value_equal (candidate, val, var_get_width (v)))
-       {
-         return i;
-       }
-    }
-  return CAT_VALUE_NOT_FOUND;
-}
-
-/*
-   Add the new value unless it is already present. Increment the count.
- */
-void
-cat_value_update (const struct variable *v, const union value *val)
-{
-  if (var_is_alpha (v))
-    {
-      size_t i;
-      struct cat_vals *cv = var_get_obs_vals (v);
-      i = cat_value_find (v, val);
-      if (i == CAT_VALUE_NOT_FOUND)
-       {
-         if (cv->n_categories >= cv->n_allocated_categories)
-           {
-             cv->n_allocated_categories *= 2;
-             cv->vals = xnrealloc (cv->vals,
-                                   cv->n_allocated_categories,
-                                   sizeof *cv->vals);
-             cv->value_counts = xnrealloc (cv->value_counts, cv->n_allocated_categories,
-                                           sizeof *cv->value_counts);
-           }
-         cv->vals[cv->n_categories] = *val;
-         cv->value_counts[cv->n_categories] = 1;
-         cv->n_categories++;
-       }
-      else
-       {
-         cv->value_counts[i]++;
-       }
-    }
-}
-/*
-  Return the count for the sth category.
- */
-size_t
-cat_get_category_count (const size_t s, const struct variable *v)
-{
-  struct cat_vals *tmp;
-  size_t n_categories;
-
-  tmp = var_get_obs_vals (v);
-  n_categories = cat_get_n_categories (v);
-  if (s < n_categories)
-    {
-      return tmp->value_counts[s];
-    }
-  return CAT_VALUE_NOT_FOUND;
-}
-
-const union value *
-cat_subscript_to_value (const size_t s, const struct variable *v)
-{
-  struct cat_vals *obs_vals = var_get_obs_vals (v);
-  return s < obs_vals->n_categories ? obs_vals->vals + s : NULL;
-}
-
-/*
-  Return the number of categories of a categorical variable.
- */
-size_t
-cat_get_n_categories (const struct variable *v)
-{
-  return var_get_obs_vals (v)->n_categories;
-}
-
-/*
-  If VAR is categorical with d categories, its first category should
-  correspond to the origin in d-dimensional Euclidean space.
- */
-bool
-cat_is_origin (const struct variable *var, const union value *val)
-{
-  if (var_is_numeric (var))
-    {
-      return false;
-    }
-  if (cat_value_find (var, val) == 0)
-    {
-      return true;
-    }
-  return false;
-}
diff --git a/src/data/category.h b/src/data/category.h
deleted file mode 100644 (file)
index f90ae7c..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-/* PSPP - a program for statistical analysis.
-   Copyright (C) 2005 Free Software Foundation, Inc.
-
-   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 3 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, see <http://www.gnu.org/licenses/>. */
-
-/*
-  Functions and data structures to recode categorical variables into
-  vectors and sub-rows of matrices.
-
-  To fit many types of statistical models, it is necessary
-  to change each value of a categorical variable to a vector with binary
-  entries. These vectors are then stored as sub-rows within a matrix
-  during model-fitting. We need functions and data strucutres to,
-  e.g., map a value, say 'a', of a variable named 'cat_var', to a
-  vector, say (0 1 0 0 0), and vice versa.  We also need to be able
-  to map the vector back to the value 'a', and if the vector is a
-  sub-row of a matrix, we need to know which sub-row corresponds to
-  the variable 'cat_var'.
-
- */
-
-#ifndef CATEGORY_H
-#define CATEGORY_H
-#include <stdbool.h>
-#include <stddef.h>
-
-struct cat_vals;
-struct variable ;
-union value;
-
-void cat_stored_values_create (const struct variable *);
-void cat_stored_values_destroy (struct cat_vals *);
-
-size_t cat_value_find (const struct variable *, const union value *);
-
-const union value *cat_subscript_to_value (const size_t,
-                                          const struct variable *);
-
-
-void cat_value_update (const struct variable *, const union value *);
-
-/*
-  Return the count for the sth category.
-*/
-size_t
-cat_get_category_count (const size_t, const struct variable *);
-
-/*
-  Return the number of categories of a categorical variable.
- */
-size_t  cat_get_n_categories (const struct variable *v);
-
-/*
-  If VAR is categorical with d categories, its first category should
-  correspond to the origin in d-dimensional Euclidean space.
- */
-bool cat_is_origin (const struct variable *, const union value *);
-#endif
index 1976ec038ff4a21c7df31f3dc7eb281e51cdbce8..aa0fcd5654d82181c23895793a7c88459e1e2dae 100644 (file)
@@ -24,7 +24,6 @@
 
 #include "data/attributes.h"
 #include "data/case.h"
-#include "data/category.h"
 #include "data/identifier.h"
 #include "data/mrset.h"
 #include "data/settings.h"
index ba216f4826eedb93b630375ff62cf7447033ab25..9968d9f9fb4e6067219dd9f7ccef2cc15518b0d7 100644 (file)
@@ -20,7 +20,6 @@
 #include <stdlib.h>
 
 #include <data/attributes.h>
-#include <data/category.h>
 #include <data/data-out.h>
 #include <data/format.h>
 #include <data/dictionary.h>
@@ -74,11 +73,6 @@ struct variable
     void *aux;
     void (*aux_dtor) (struct variable *);
 
-    /* Values of a categorical variable.  Procedures need
-       vectors with binary entries, so any variable of type ALPHA will
-       have its values stored here. */
-    struct cat_vals *obs_vals;
-
     /* Custom attributes. */
     struct attrset attributes;
   };
@@ -112,7 +106,6 @@ var_create (const char *name, int width)
   v->short_name_cnt = 0;
   v->aux = NULL;
   v->aux_dtor = NULL;
-  v->obs_vals = NULL;
   attrset_init (&v->attributes);
 
   return v;
@@ -127,8 +120,7 @@ var_create (const char *name, int width)
 
     - The new variable is not added to OLD_VAR's dictionary by
       default.  Use dict_clone_var, instead, to do that.
-
-    - Auxiliary data and obs_vals are not copied. */
+*/
 struct variable *
 var_clone (const struct variable *old_var)
 {
@@ -159,7 +151,6 @@ var_destroy (struct variable *v)
     {
       assert (!var_has_vardict (v));
       mv_destroy (&v->miss);
-      cat_stored_values_destroy (v->obs_vals);
       var_clear_short_names (v);
       var_clear_aux (v);
       val_labs_destroy (v->val_labs);
@@ -967,35 +958,6 @@ var_dtor_free (struct variable *v)
   free (v->aux);
 }
 \f
-/* Observed categorical values. */
-
-/* Returns V's observed categorical values,
-   which V must have. */
-struct cat_vals *
-var_get_obs_vals (const struct variable *v)
-{
-  assert (v->obs_vals != NULL);
-  return v->obs_vals;
-}
-
-/* Sets V's observed categorical values to CAT_VALS.
-   V becomes the owner of CAT_VALS. */
-void
-var_set_obs_vals (const struct variable *v_, struct cat_vals *cat_vals)
-{
-  struct variable *v = CONST_CAST (struct variable *, v_ );
-  cat_stored_values_destroy (v->obs_vals);
-  v->obs_vals = cat_vals;
-}
-
-/* Returns true if V has observed categorical values,
-   false otherwise. */
-bool
-var_has_obs_vals (const struct variable *v)
-{
-  return v->obs_vals != NULL;
-}
-\f
 /* Returns variable V's attribute set.  The caller may examine or
    modify the attribute set, but must not destroy it.  Destroying
    V, or calling var_set_attributes() on V, will also destroy its
index f1a4c8728ad6ea75e96cbd77f90c101f21763dd1..524a6be2be0d73c60b376aeb510079f0ad512ea3 100644 (file)
@@ -166,11 +166,6 @@ void var_clear_aux (struct variable *);
 void *var_detach_aux (struct variable *);
 void var_dtor_free (struct variable *);
 
-/* Observed categorical values. */
-struct cat_vals *var_get_obs_vals (const struct variable *);
-void var_set_obs_vals (const struct variable *, struct cat_vals *);
-bool var_has_obs_vals (const struct variable *);
-
 /* Custom attributes. */
 struct attrset *var_get_attributes (const struct variable *);
 void var_set_attributes (struct variable *, const struct attrset *);
index 7fcca77cc7a883acbd05c8cdac604eb7bcc66544..995675e2cbf4b36cecab0e37ba7374df8e30c9a3 100644 (file)
@@ -19,7 +19,6 @@
 #include <libpspp/assertion.h>
 #include <math/covariance.h>
 #include <math/correlation.h>
-#include <math/design-matrix.h>
 #include <gsl/gsl_matrix.h>
 #include <data/casegrouper.h>
 #include <data/casereader.h>
@@ -281,16 +280,25 @@ run_corr (struct casereader *r, const struct corr_opts *opts, const struct corr
   const gsl_matrix *var_matrix,  *samples_matrix, *mean_matrix;
   const gsl_matrix *cov_matrix;
   gsl_matrix *corr_matrix;
-  struct covariance *cov = covariance_create (corr->n_vars_total, corr->vars,
-                                             opts->wv, opts->exclude);
+  struct covariance *cov = covariance_2pass_create (corr->n_vars_total, corr->vars,
+                                                   0, NULL,
+                                                   opts->wv, opts->exclude);
 
+  struct casereader *rc = casereader_clone (r);
   for ( ; (c = casereader_read (r) ); case_unref (c))
     {
-      covariance_accumulate (cov, c);
+      covariance_accumulate_pass1 (cov, c);
+    }
+
+  for ( ; (c = casereader_read (rc) ); case_unref (c))
+    {
+      covariance_accumulate_pass2 (cov, c);
     }
 
   cov_matrix = covariance_calculate (cov);
 
+  casereader_destroy (rc);
+
   samples_matrix = covariance_moments (cov, MOMENT_NONE);
   var_matrix = covariance_moments (cov, MOMENT_VARIANCE);
   mean_matrix = covariance_moments (cov, MOMENT_MEAN);
index 83dc13de7ed5a28f92e16cd8e24e2a2a02c77b25..1043173bfeab6d50b082403e40906a483238d844 100644 (file)
@@ -1682,7 +1682,7 @@ do_factor (const struct cmd_factor *factor, struct casereader *r)
   const gsl_matrix *analysis_matrix;
   struct idata *idata = idata_alloc (factor->n_vars);
 
-  struct covariance *cov = covariance_create (factor->n_vars, factor->vars,
+  struct covariance *cov = covariance_1pass_create (factor->n_vars, factor->vars,
                                              factor->wv, factor->exclude);
 
   for ( ; (c = casereader_read (r) ); case_unref (c))
index 0804945fabaa1504eff3779906b77dce6d3b9bda..1a941152d9fa334d408eb10002314c17febd4049 100644 (file)
@@ -23,7 +23,6 @@
 #include <stdlib.h>
 
 #include <data/case.h>
-#include <data/category.h>
 #include <data/casegrouper.h>
 #include <data/casereader.h>
 #include <data/dictionary.h>
@@ -39,7 +38,7 @@
 #include <libpspp/compiler.h>
 #include <libpspp/hash.h>
 #include <libpspp/message.h>
-#include <math/covariance-matrix.h>
+#include <math/covariance.h>
 #include <math/coefficient.h>
 #include <math/linreg.h>
 #include <math/moments.h>
@@ -228,18 +227,22 @@ glm_custom_dependent (struct lexer *lexer, struct dataset *ds,
                      struct cmd_glm *cmd UNUSED, void *aux UNUSED)
 {
   const struct dictionary *dict = dataset_dict (ds);
+  size_t i;
 
   if ((lex_token (lexer) != T_ID
        || dict_lookup_var (dict, lex_tokid (lexer)) == NULL)
       && lex_token (lexer) != T_ALL)
     return 2;
 
-  if (!parse_variables_const
-      (lexer, dict, &v_dependent, &n_dependent, PV_NONE))
+  if (!parse_variables_const (lexer, dict, &v_dependent, &n_dependent, PV_NONE))
     {
       free (v_dependent);
       return 0;
     }
+  for (i = 0; i < n_dependent; i++)
+    {
+      assert (var_is_numeric (v_dependent[i]));
+    }
   assert (n_dependent);
   if (n_dependent > 1)
     msg (SE, _("Multivariate GLM not yet supported"));
@@ -248,29 +251,13 @@ glm_custom_dependent (struct lexer *lexer, struct dataset *ds,
   return 1;
 }
 
-/*
-  COV is the covariance matrix for variables included in the
-  model. That means the dependent variable is in there, too.
- */
-static void
-coeff_init (pspp_linreg_cache * c, const struct design_matrix *cov)
-{
-  c->coeff = xnmalloc (cov->m->size2, sizeof (*c->coeff));
-  c->n_coeffs = cov->m->size2 - 1;
-  pspp_coeff_init (c->coeff, cov);
-}
-
-
-static pspp_linreg_cache *
-fit_model (const struct covariance_matrix *cov,
+static linreg *
+fit_model (const struct covariance *cov,
           const struct variable *dep_var, 
           const struct variable ** indep_vars, 
           size_t n_data, size_t n_indep)
 {
-  pspp_linreg_cache *result = NULL;
-  result = pspp_linreg_cache_alloc (dep_var, indep_vars, n_data, n_indep);
-  coeff_init (result, covariance_to_design (cov));
-  pspp_linreg_with_cov (cov, result);  
+  linreg *result = NULL;
   
   return result;
 }
@@ -281,17 +268,18 @@ run_glm (struct casereader *input,
         const struct dataset *ds)
 {
   casenumber row;
-  const struct variable **indep_vars;
-  const struct variable **all_vars;
+  const struct variable **numerics = NULL;
+  const struct variable **categoricals = NULL;
   int n_indep = 0;
-  pspp_linreg_cache *model = NULL; 
+  linreg *model = NULL; 
   pspp_linreg_opts lopts;
   struct ccase *c;
   size_t i;
-  size_t n_all_vars;
   size_t n_data;               /* Number of valid cases. */
+  size_t n_categoricals = 0;
+  size_t n_numerics;
   struct casereader *reader;
-  struct covariance_matrix *cov;
+  struct covariance *cov;
 
   c = casereader_peek (input, 0);
   if (c == NULL)
@@ -311,50 +299,93 @@ run_glm (struct casereader *input,
   lopts.get_depvar_mean_std = 1;
 
   lopts.get_indep_mean_std = xnmalloc (n_dependent, sizeof (int));
-  indep_vars = xnmalloc (cmd->n_by, sizeof *indep_vars);
-  n_all_vars = cmd->n_by + n_dependent;
-  all_vars = xnmalloc (n_all_vars, sizeof *all_vars);
 
-  for (i = 0; i < n_dependent; i++)
+
+  n_numerics = n_dependent;
+  for (i = 0; i < cmd->n_with; i++)
+    {
+      if (var_is_alpha (cmd->v_with[i]))
+       {
+         n_categoricals++;
+       }
+      else
+       {
+         n_numerics++;
+       }
+    }
+  for (i = 0; i < cmd->n_by; i++)
     {
-      all_vars[i] = v_dependent[i];
+      if (var_is_alpha (cmd->v_by[i]))
+       {
+         n_categoricals++;
+       }
+      else
+       {
+         n_numerics++;
+       }
     }
+  numerics = xnmalloc (n_numerics, sizeof *numerics);
+  categoricals = xnmalloc (n_categoricals, sizeof (*categoricals));
+  size_t j = 0;
+  size_t k = 0;
   for (i = 0; i < cmd->n_by; i++)
     {
-      indep_vars[i] = cmd->v_by[i];
-      all_vars[i + n_dependent] = cmd->v_by[i];
+      if (var_is_alpha (cmd->v_by[i]))
+       {
+         categoricals[j] = cmd->v_by[i];
+         j++;
+       }
+      else
+       {
+         numerics[k] = cmd->v_by[i];
+         k++;
+       }
+    }
+  for (i = 0; i < cmd->n_with; i++)
+    {
+      if (var_is_alpha (cmd->v_with[i]))
+       {
+         categoricals[j] = cmd->v_with[i];
+         j++;
+       }
+      else
+       {
+         numerics[k] = cmd->v_with[i];
+         k++;
+       }
+    }
+  for (i = 0; i < n_dependent; i++)
+    {
+      numerics[k] = v_dependent[i];
+      k++;
     }
-  n_indep = cmd->n_by;
+
+  cov = covariance_2pass_create (n_numerics, numerics, n_categoricals, categoricals, NULL, MV_NEVER);
 
   reader = casereader_clone (input);
-  reader = casereader_create_filter_missing (reader, indep_vars, n_indep,
+  reader = casereader_create_filter_missing (reader, numerics, n_numerics,
                                             MV_ANY, NULL, NULL);
-  reader = casereader_create_filter_missing (reader, v_dependent, 1,
+  reader = casereader_create_filter_missing (reader, categoricals, n_categoricals,
                                             MV_ANY, NULL, NULL);
+  struct casereader *r = casereader_clone (reader);
 
-  if (n_indep > 0)
+  reader = casereader_create_counter (reader, &row, -1);
+  
+  for (; (c = casereader_read (reader)) != NULL; case_unref (c))
     {
-      for (i = 0; i < n_all_vars; i++)
-       if (var_is_alpha (all_vars[i]))
-         cat_stored_values_create (all_vars[i]);
-      
-      reader = casereader_create_counter (reader, &row, -1);
-
-      for (i = 0; i < n_inter; i++)
-      for (; (c = casereader_read (reader)) != NULL; case_unref (c))
-       {
-         /* 
-            Accumulate the covariance matrix.
-         */
-         n_data++;
-       }
-      casereader_destroy (reader);
+      covariance_accumulate_pass1 (cov, c);
     }
-  else
+  for (; (c = casereader_read (r)) != NULL; case_unref (c))
     {
-      msg (SE, gettext ("No valid data found. This command was skipped."));
+      covariance_accumulate_pass2 (cov, c);
     }
-  free (indep_vars);
+
+  covariance_destroy (cov);
+  casereader_destroy (reader);
+  casereader_destroy (r);
+  
+  free (numerics);
+  free (categoricals);
   free (lopts.get_indep_mean_std);
   casereader_destroy (input);
 
index 2487b9021d08bb14d86a14ed84e3b99dd6f5bad6..c7e8179a579086620064f53e0bd6bb5eace213ce 100644 (file)
 #include <gsl/gsl_vector.h>
 #include <math.h>
 #include <stdlib.h>
-
 #include <data/case.h>
 #include <data/casegrouper.h>
 #include <data/casereader.h>
-#include <data/category.h>
 #include <data/dictionary.h>
 #include <data/missing-values.h>
 #include <data/procedure.h>
@@ -39,8 +37,7 @@
 #include <libpspp/compiler.h>
 #include <libpspp/message.h>
 #include <libpspp/taint.h>
-#include <math/design-matrix.h>
-#include <math/coefficient.h>
+#include <math/covariance.h>
 #include <math/linreg.h>
 #include <math/moments.h>
 #include <output/tab.h>
@@ -99,7 +96,7 @@ struct reg_trns
 {
   int n_trns;                  /* Number of transformations. */
   int trns_id;                 /* Which trns is this one? */
-  pspp_linreg_cache *c;                /* Linear model for this trns. */
+  linreg *c;           /* Linear model for this trns. */
 };
 /*
   Variables used (both explanatory and response).
@@ -112,31 +109,31 @@ static const struct variable **v_variables;
 static size_t n_variables;
 
 static bool run_regression (struct casereader *, struct cmd_regression *,
-                           struct dataset *, pspp_linreg_cache **);
+                           struct dataset *, linreg **);
 
 /*
    STATISTICS subcommand output functions.
  */
-static void reg_stats_r (pspp_linreg_cache *);
-static void reg_stats_coeff (pspp_linreg_cache *);
-static void reg_stats_anova (pspp_linreg_cache *);
-static void reg_stats_outs (pspp_linreg_cache *);
-static void reg_stats_zpp (pspp_linreg_cache *);
-static void reg_stats_label (pspp_linreg_cache *);
-static void reg_stats_sha (pspp_linreg_cache *);
-static void reg_stats_ci (pspp_linreg_cache *);
-static void reg_stats_f (pspp_linreg_cache *);
-static void reg_stats_bcov (pspp_linreg_cache *);
-static void reg_stats_ses (pspp_linreg_cache *);
-static void reg_stats_xtx (pspp_linreg_cache *);
-static void reg_stats_collin (pspp_linreg_cache *);
-static void reg_stats_tol (pspp_linreg_cache *);
-static void reg_stats_selection (pspp_linreg_cache *);
-static void statistics_keyword_output (void (*)(pspp_linreg_cache *),
-                                      int, pspp_linreg_cache *);
+static void reg_stats_r (linreg *, void *);
+static void reg_stats_coeff (linreg *, void *);
+static void reg_stats_anova (linreg *, void *);
+static void reg_stats_outs (linreg *, void *);
+static void reg_stats_zpp (linreg *, void *);
+static void reg_stats_label (linreg *, void *);
+static void reg_stats_sha (linreg *, void *);
+static void reg_stats_ci (linreg *, void *);
+static void reg_stats_f (linreg *, void *);
+static void reg_stats_bcov (linreg *, void *);
+static void reg_stats_ses (linreg *, void *);
+static void reg_stats_xtx (linreg *, void *);
+static void reg_stats_collin (linreg *, void *);
+static void reg_stats_tol (linreg *, void *);
+static void reg_stats_selection (linreg *, void *);
+static void statistics_keyword_output (void (*)(linreg *, void *),
+                                      int, linreg *, void *);
 
 static void
-reg_stats_r (pspp_linreg_cache * c)
+reg_stats_r (linreg *c, void *aux UNUSED)
 {
   struct tab_table *t;
   int n_rows = 2;
@@ -146,9 +143,9 @@ reg_stats_r (pspp_linreg_cache * c)
   double std_error;
 
   assert (c != NULL);
-  rsq = c->ssm / c->sst;
-  adjrsq = 1.0 - (1.0 - rsq) * (c->n_obs - 1.0) / (c->n_obs - c->n_indeps);
-  std_error = sqrt (pspp_linreg_mse (c));
+  rsq = linreg_ssreg (c) / linreg_sst (c);
+  adjrsq = 1.0 - (1.0 - rsq) * (linreg_n_obs (c) - 1.0) / (linreg_n_obs (c) - linreg_n_coeffs (c));
+  std_error = sqrt (linreg_mse (c));
   t = tab_create (n_cols, n_rows);
   tab_box (t, TAL_2, TAL_2, -1, TAL_1, 0, 0, n_cols - 1, n_rows - 1);
   tab_hline (t, TAL_2, 0, n_cols - 1, 1);
@@ -171,7 +168,7 @@ reg_stats_r (pspp_linreg_cache * c)
   Table showing estimated regression coefficients.
  */
 static void
-reg_stats_coeff (pspp_linreg_cache * c)
+reg_stats_coeff (linreg * c, void *aux_)
 {
   size_t j;
   int n_cols = 7;
@@ -184,11 +181,11 @@ reg_stats_coeff (pspp_linreg_cache * c)
   const char *label;
 
   const struct variable *v;
-  const union value *val;
   struct tab_table *t;
+  gsl_matrix *cov = aux_;
 
   assert (c != NULL);
-  n_rows = c->n_coeffs + 3;
+  n_rows = linreg_n_coeffs (c) + 3;
 
   t = tab_create (n_cols, n_rows);
   tab_headers (t, 2, 0, 1, 0);
@@ -203,66 +200,54 @@ reg_stats_coeff (pspp_linreg_cache * c)
   tab_text (t, 5, 0, TAB_CENTER | TAT_TITLE, _("t"));
   tab_text (t, 6, 0, TAB_CENTER | TAT_TITLE, _("Significance"));
   tab_text (t, 1, 1, TAB_LEFT | TAT_TITLE, _("(Constant)"));
-  tab_double (t, 2, 1, 0, c->intercept, NULL);
-  std_err = sqrt (gsl_matrix_get (c->cov, 0, 0));
+  tab_double (t, 2, 1, 0, linreg_intercept (c), NULL);
+  std_err = sqrt (gsl_matrix_get (linreg_cov (c), 0, 0));
   tab_double (t, 3, 1, 0, std_err, NULL);
   tab_double (t, 4, 1, 0, 0.0, NULL);
-  t_stat = c->intercept / std_err;
+  t_stat = linreg_intercept (c) / std_err;
   tab_double (t, 5, 1, 0, t_stat, NULL);
   pval = 2 * gsl_cdf_tdist_Q (fabs (t_stat), 1.0);
   tab_double (t, 6, 1, 0, pval, NULL);
-  for (j = 0; j < c->n_coeffs; j++)
+  for (j = 0; j < linreg_n_coeffs (c); j++)
     {
       struct string tstr;
       ds_init_empty (&tstr);
       this_row = j + 2;
 
-      v = pspp_coeff_get_var (c->coeff[j], 0);
+      v = linreg_indep_var (c, j);
       label = var_to_string (v);
       /* Do not overwrite the variable's name. */
       ds_put_cstr (&tstr, label);
-      if (var_is_alpha (v))
-       {
-         /*
-            Append the value associated with this coefficient.
-            This makes sense only if we us the usual binary encoding
-            for that value.
-          */
-
-         val = pspp_coeff_get_value (c->coeff[j], v);
-
-         var_append_value_name (v, val, &tstr);
-       }
-
       tab_text (t, 1, this_row, TAB_CENTER, ds_cstr (&tstr));
       /*
          Regression coefficients.
        */
-      tab_double (t, 2, this_row, 0, c->coeff[j]->estimate, NULL);
+      tab_double (t, 2, this_row, 0, linreg_coeff (c, j), NULL);
       /*
          Standard error of the coefficients.
        */
-      std_err = sqrt (gsl_matrix_get (c->cov, j + 1, j + 1));
+      std_err = sqrt (gsl_matrix_get (linreg_cov (c), j + 1, j + 1));
       tab_double (t, 3, this_row, 0, std_err, NULL);
       /*
          Standardized coefficient, i.e., regression coefficient
          if all variables had unit variance.
        */
-      beta = pspp_coeff_get_sd (c->coeff[j]);
-      beta *= c->coeff[j]->estimate / c->depvar_std;
+      beta = sqrt (gsl_matrix_get (cov, j, j));
+      beta *= linreg_coeff (c, j) / 
+       sqrt (gsl_matrix_get (cov, cov->size1 - 1, cov->size2 - 1));
       tab_double (t, 4, this_row, 0, beta, NULL);
 
       /*
          Test statistic for H0: coefficient is 0.
        */
-      t_stat = c->coeff[j]->estimate / std_err;
+      t_stat = linreg_coeff (c, j) / std_err;
       tab_double (t, 5, this_row, 0, t_stat, NULL);
       /*
          P values for the test statistic above.
        */
       pval =
        2 * gsl_cdf_tdist_Q (fabs (t_stat),
-                            (double) (c->n_obs - c->n_coeffs));
+                            (double) (linreg_n_obs (c) - linreg_n_coeffs (c)));
       tab_double (t, 6, this_row, 0, pval, NULL);
       ds_destroy (&tstr);
     }
@@ -274,12 +259,12 @@ reg_stats_coeff (pspp_linreg_cache * c)
   Display the ANOVA table.
  */
 static void
-reg_stats_anova (pspp_linreg_cache * c)
+reg_stats_anova (linreg * c, void *aux UNUSED)
 {
   int n_cols = 7;
   int n_rows = 4;
-  const double msm = c->ssm / c->dfm;
-  const double mse = pspp_linreg_mse (c);
+  const double msm = linreg_ssreg (c) / linreg_dfmodel (c);
+  const double mse = linreg_mse (c);
   const double F = msm / mse;
   const double pval = gsl_cdf_fdist_Q (F, c->dfm, c->dfe);
 
@@ -306,9 +291,9 @@ reg_stats_anova (pspp_linreg_cache * c)
   tab_text (t, 1, 3, TAB_LEFT | TAT_TITLE, _("Total"));
 
   /* Sums of Squares */
-  tab_double (t, 2, 1, 0, c->ssm, NULL);
-  tab_double (t, 2, 3, 0, c->sst, NULL);
-  tab_double (t, 2, 2, 0, c->sse, NULL);
+  tab_double (t, 2, 1, 0, linreg_ssreg (c), NULL);
+  tab_double (t, 2, 3, 0, linreg_sst (c), NULL);
+  tab_double (t, 2, 2, 0, linreg_sse (c), NULL);
 
 
   /* Degrees of freedom */
@@ -329,40 +314,40 @@ reg_stats_anova (pspp_linreg_cache * c)
 }
 
 static void
-reg_stats_outs (pspp_linreg_cache * c)
+reg_stats_outs (linreg * c, void *aux UNUSED)
 {
   assert (c != NULL);
 }
 
 static void
-reg_stats_zpp (pspp_linreg_cache * c)
+reg_stats_zpp (linreg * c, void *aux UNUSED)
 {
   assert (c != NULL);
 }
 
 static void
-reg_stats_label (pspp_linreg_cache * c)
+reg_stats_label (linreg * c, void *aux UNUSED)
 {
   assert (c != NULL);
 }
 
 static void
-reg_stats_sha (pspp_linreg_cache * c)
+reg_stats_sha (linreg * c, void *aux UNUSED)
 {
   assert (c != NULL);
 }
 static void
-reg_stats_ci (pspp_linreg_cache * c)
+reg_stats_ci (linreg * c, void *aux UNUSED)
 {
   assert (c != NULL);
 }
 static void
-reg_stats_f (pspp_linreg_cache * c)
+reg_stats_f (linreg * c, void *aux UNUSED)
 {
   assert (c != NULL);
 }
 static void
-reg_stats_bcov (pspp_linreg_cache * c)
+reg_stats_bcov (linreg * c, void *aux UNUSED)
 {
   int n_cols;
   int n_rows;
@@ -384,13 +369,13 @@ reg_stats_bcov (pspp_linreg_cache * c)
   tab_vline (t, TAL_0, 1, 0, 0);
   tab_text (t, 0, 0, TAB_CENTER | TAT_TITLE, _("Model"));
   tab_text (t, 1, 1, TAB_CENTER | TAT_TITLE, _("Covariances"));
-  for (i = 0; i < c->n_coeffs; i++)
+  for (i = 0; i < linreg_n_coeffs (c); i++)
     {
-      const struct variable *v = pspp_coeff_get_var (c->coeff[i], 0);
+      const struct variable *v = linreg_indep_var (c, i);
       label = var_to_string (v);
       tab_text (t, 2, i, TAB_CENTER, label);
       tab_text (t, i + 2, 0, TAB_CENTER, label);
-      for (k = 1; k < c->n_coeffs; k++)
+      for (k = 1; k < linreg_n_coeffs (c); k++)
        {
          col = (i <= k) ? k : i;
          row = (i <= k) ? i : k;
@@ -402,43 +387,43 @@ reg_stats_bcov (pspp_linreg_cache * c)
   tab_submit (t);
 }
 static void
-reg_stats_ses (pspp_linreg_cache * c)
+reg_stats_ses (linreg * c, void *aux UNUSED)
 {
   assert (c != NULL);
 }
 static void
-reg_stats_xtx (pspp_linreg_cache * c)
+reg_stats_xtx (linreg * c, void *aux UNUSED)
 {
   assert (c != NULL);
 }
 static void
-reg_stats_collin (pspp_linreg_cache * c)
+reg_stats_collin (linreg * c, void *aux UNUSED)
 {
   assert (c != NULL);
 }
 static void
-reg_stats_tol (pspp_linreg_cache * c)
+reg_stats_tol (linreg * c, void *aux UNUSED)
 {
   assert (c != NULL);
 }
 static void
-reg_stats_selection (pspp_linreg_cache * c)
+reg_stats_selection (linreg * c, void *aux UNUSED)
 {
   assert (c != NULL);
 }
 
 static void
-statistics_keyword_output (void (*function) (pspp_linreg_cache *),
-                          int keyword, pspp_linreg_cache * c)
+statistics_keyword_output (void (*function) (linreg *, void *),
+                          int keyword, linreg * c, void *aux)
 {
   if (keyword)
     {
-      (*function) (c);
+      (*function) (c, aux);
     }
 }
 
 static void
-subcommand_statistics (int *keywords, pspp_linreg_cache * c)
+subcommand_statistics (int *keywords, linreg * c, void *aux)
 {
   /*
      The order here must match the order in which the STATISTICS
@@ -498,21 +483,21 @@ subcommand_statistics (int *keywords, pspp_linreg_cache * c)
          keywords[r] = 1;
        }
     }
-  statistics_keyword_output (reg_stats_r, keywords[r], c);
-  statistics_keyword_output (reg_stats_anova, keywords[anova], c);
-  statistics_keyword_output (reg_stats_coeff, keywords[coeff], c);
-  statistics_keyword_output (reg_stats_outs, keywords[outs], c);
-  statistics_keyword_output (reg_stats_zpp, keywords[zpp], c);
-  statistics_keyword_output (reg_stats_label, keywords[label], c);
-  statistics_keyword_output (reg_stats_sha, keywords[sha], c);
-  statistics_keyword_output (reg_stats_ci, keywords[ci], c);
-  statistics_keyword_output (reg_stats_f, keywords[f], c);
-  statistics_keyword_output (reg_stats_bcov, keywords[bcov], c);
-  statistics_keyword_output (reg_stats_ses, keywords[ses], c);
-  statistics_keyword_output (reg_stats_xtx, keywords[xtx], c);
-  statistics_keyword_output (reg_stats_collin, keywords[collin], c);
-  statistics_keyword_output (reg_stats_tol, keywords[tol], c);
-  statistics_keyword_output (reg_stats_selection, keywords[selection], c);
+  statistics_keyword_output (reg_stats_r, keywords[r], c, aux);
+  statistics_keyword_output (reg_stats_anova, keywords[anova], c, aux);
+  statistics_keyword_output (reg_stats_coeff, keywords[coeff], c, aux);
+  statistics_keyword_output (reg_stats_outs, keywords[outs], c, aux);
+  statistics_keyword_output (reg_stats_zpp, keywords[zpp], c, aux);
+  statistics_keyword_output (reg_stats_label, keywords[label], c, aux);
+  statistics_keyword_output (reg_stats_sha, keywords[sha], c, aux);
+  statistics_keyword_output (reg_stats_ci, keywords[ci], c, aux);
+  statistics_keyword_output (reg_stats_f, keywords[f], c, aux);
+  statistics_keyword_output (reg_stats_bcov, keywords[bcov], c, aux);
+  statistics_keyword_output (reg_stats_ses, keywords[ses], c, aux);
+  statistics_keyword_output (reg_stats_xtx, keywords[xtx], c, aux);
+  statistics_keyword_output (reg_stats_collin, keywords[collin], c, aux);
+  statistics_keyword_output (reg_stats_tol, keywords[tol], c, aux);
+  statistics_keyword_output (reg_stats_selection, keywords[selection], c, aux);
 }
 
 /*
@@ -527,7 +512,7 @@ regression_trns_free (void *t_)
 
   if (t->trns_id == t->n_trns)
     {
-      result = pspp_linreg_cache_free (t->c);
+      result = linreg_free (t->c);
     }
   free (t);
 
@@ -544,9 +529,10 @@ regression_trns_pred_proc (void *t_, struct ccase **c,
   size_t i;
   size_t n_vals;
   struct reg_trns *trns = t_;
-  pspp_linreg_cache *model;
+  linreg *model;
   union value *output = NULL;
-  const union value **vals = NULL;
+  const union value *tmp;
+  double *vals;
   const struct variable **vars = NULL;
 
   assert (trns != NULL);
@@ -555,21 +541,20 @@ regression_trns_pred_proc (void *t_, struct ccase **c,
   assert (model->depvar != NULL);
   assert (model->pred != NULL);
 
-  vars = xnmalloc (model->n_coeffs, sizeof (*vars));
-  n_vals = (*model->get_vars) (model, vars);
-
+  vars = linreg_get_vars (model);
+  n_vals = linreg_n_coeffs (model);
   vals = xnmalloc (n_vals, sizeof (*vals));
   *c = case_unshare (*c);
+
   output = case_data_rw (*c, model->pred);
 
   for (i = 0; i < n_vals; i++)
     {
-      vals[i] = case_data (*c, vars[i]);
+      tmp = case_data (*c, vars[i]);
+      vals[i] = tmp->f;
     }
-  output->f = (*model->predict) ((const struct variable **) vars,
-                                vals, model, n_vals);
+  output->f = linreg_predict (model, vals, n_vals);
   free (vals);
-  free (vars);
   return TRNS_CONTINUE;
 }
 
@@ -583,10 +568,11 @@ regression_trns_resid_proc (void *t_, struct ccase **c,
   size_t i;
   size_t n_vals;
   struct reg_trns *trns = t_;
-  pspp_linreg_cache *model;
+  linreg *model;
   union value *output = NULL;
-  const union value **vals = NULL;
-  const union value *obs = NULL;
+  const union value *tmp;
+  double *vals = NULL;
+  double obs;
   const struct variable **vars = NULL;
 
   assert (trns != NULL);
@@ -595,8 +581,8 @@ regression_trns_resid_proc (void *t_, struct ccase **c,
   assert (model->depvar != NULL);
   assert (model->resid != NULL);
 
-  vars = xnmalloc (model->n_coeffs, sizeof (*vars));
-  n_vals = (*model->get_vars) (model, vars);
+  vars = linreg_get_vars (model);
+  n_vals = linreg_n_coeffs (model);
 
   vals = xnmalloc (n_vals, sizeof (*vals));
   *c = case_unshare (*c);
@@ -605,13 +591,14 @@ regression_trns_resid_proc (void *t_, struct ccase **c,
 
   for (i = 0; i < n_vals; i++)
     {
-      vals[i] = case_data (*c, vars[i]);
+      tmp = case_data (*c, vars[i]);
+      vals[i] = tmp->f;
     }
-  obs = case_data (*c, model->depvar);
-  output->f = (*model->residual) ((const struct variable **) vars,
-                                 vals, obs, model, n_vals);
+  tmp = case_data (*c, model->depvar);
+  obs = tmp->f;
+  output->f = linreg_residual (model, obs, vals, n_vals);
   free (vals);
-  free (vars);
+
   return TRNS_CONTINUE;
 }
 
@@ -643,7 +630,7 @@ reg_get_name (const struct dictionary *dict, char name[VAR_NAME_LEN],
 
 static void
 reg_save_var (struct dataset *ds, const char *prefix, trns_proc_func * f,
-             pspp_linreg_cache * c, struct variable **v, int n_trns)
+             linreg * c, struct variable **v, int n_trns)
 {
   struct dictionary *dict = dataset_dict (ds);
   static int trns_index = 1;
@@ -663,14 +650,12 @@ reg_save_var (struct dataset *ds, const char *prefix, trns_proc_func * f,
   trns_index++;
 }
 static void
-subcommand_save (struct dataset *ds, int save, pspp_linreg_cache ** models)
+subcommand_save (struct dataset *ds, int save, linreg ** models)
 {
-  pspp_linreg_cache **lc;
+  linreg **lc;
   int n_trns = 0;
   int i;
 
-  assert (models != NULL);
-
   if (save)
     {
       /* Count the number of transformations we will need. */
@@ -709,7 +694,7 @@ subcommand_save (struct dataset *ds, int save, pspp_linreg_cache ** models)
        {
          if (*lc != NULL)
            {
-             pspp_linreg_cache_free (*lc);
+             linreg_free (*lc);
            }
        }
     }
@@ -720,7 +705,7 @@ cmd_regression (struct lexer *lexer, struct dataset *ds)
 {
   struct casegrouper *grouper;
   struct casereader *group;
-  pspp_linreg_cache **models;
+  linreg **models;
   bool ok;
   size_t i;
 
@@ -813,72 +798,101 @@ identify_indep_vars (const struct variable **indep_vars,
     }
   return n_indep_vars;
 }
-
-/* Encode categorical variables.
-   Returns number of valid cases. */
-static int
-prepare_categories (struct casereader *input,
-                   const struct variable **vars, size_t n_vars,
-                   struct moments_var *mom)
+static double
+fill_covariance (gsl_matrix *cov, struct covariance *all_cov, 
+                const struct variable **vars,
+                size_t n_vars, const struct variable *dep_var, 
+                const struct variable **all_vars, size_t n_all_vars,
+                double *means)
 {
-  int n_data;
-  struct ccase *c;
   size_t i;
-
-  assert (vars != NULL);
-  assert (mom != NULL);
-
-  for (i = 0; i < n_vars; i++)
-    if (var_is_alpha (vars[i]))
-      cat_stored_values_create (vars[i]);
-
-  n_data = 0;
-  for (; (c = casereader_read (input)) != NULL; case_unref (c))
+  size_t j;
+  size_t dep_subscript;
+  size_t *rows;
+  const gsl_matrix *ssizes;
+  const gsl_matrix *cm;
+  const gsl_matrix *mean_matrix;
+  const gsl_matrix *ssize_matrix;
+  double result = 0.0;
+  
+  cm = covariance_calculate_unnormalized (all_cov);
+  rows = xnmalloc (cov->size1 - 1, sizeof (*rows));
+  
+  for (i = 0; i < n_all_vars; i++)
     {
-      /*
-         The second condition ensures the program will run even if
-         there is only one variable to act as both explanatory and
-         response.
-       */
-      for (i = 0; i < n_vars; i++)
+      for (j = 0; j < n_vars; j++)
+       {
+         if (vars[j] == all_vars[i])
+           {
+             rows[j] = i;
+           }
+       }
+      if (all_vars[i] == dep_var)
        {
-         const union value *val = case_data (c, vars[i]);
-         if (var_is_alpha (vars[i]))
-           cat_value_update (vars[i], val);
-         else
-           moments1_add (mom[i].m, val->f, 1.0);
+         dep_subscript = i;
        }
-      n_data++;
     }
-  casereader_destroy (input);
-
-  return n_data;
-}
-
-static void
-coeff_init (pspp_linreg_cache * c, struct design_matrix *dm)
-{
-  c->coeff = xnmalloc (dm->m->size2, sizeof (*c->coeff));
-  pspp_coeff_init (c->coeff, dm);
+  mean_matrix = covariance_moments (all_cov, MOMENT_MEAN);
+  ssize_matrix = covariance_moments (all_cov, MOMENT_NONE);
+  for (i = 0; i < cov->size1 - 1; i++)
+    {
+      means[i] = gsl_matrix_get (mean_matrix, rows[i], 0)
+       / gsl_matrix_get (ssize_matrix, rows[i], 0);
+      for (j = 0; j < cov->size2 - 1; j++)
+       {
+         gsl_matrix_set (cov, i, j, gsl_matrix_get (cm, rows[i], rows[j]));
+         gsl_matrix_set (cov, j, i, gsl_matrix_get (cm, rows[j], rows[i]));
+       }
+    }
+  means[cov->size1 - 1] = gsl_matrix_get (mean_matrix, dep_subscript, 0)
+    / gsl_matrix_get (ssize_matrix, dep_subscript, 0);
+  ssizes = covariance_moments (all_cov, MOMENT_NONE);
+  result = gsl_matrix_get (ssizes, dep_subscript, rows[0]);
+  for (i = 0; i < cov->size1 - 1; i++)
+    {
+      gsl_matrix_set (cov, i, cov->size1 - 1, 
+                     gsl_matrix_get (cm, rows[i], dep_subscript));
+      gsl_matrix_set (cov, cov->size1 - 1, i, 
+                     gsl_matrix_get (cm, rows[i], dep_subscript));
+      if (result > gsl_matrix_get (ssizes, rows[i], dep_subscript))
+       {
+         result = gsl_matrix_get (ssizes, rows[i], dep_subscript);
+       }
+    }
+  gsl_matrix_set (cov, cov->size1 - 1, cov->size1 - 1, 
+                 gsl_matrix_get (cm, dep_subscript, dep_subscript));
+  free (rows);
+  return result;
 }
 
 static bool
 run_regression (struct casereader *input, struct cmd_regression *cmd,
-               struct dataset *ds, pspp_linreg_cache **models)
+               struct dataset *ds, linreg **models)
 {
   size_t i;
   int n_indep = 0;
   int k;
+  double n_data;
+  double *means;
   struct ccase *c;
-  const struct variable **indep_vars;
-  struct design_matrix *X;
-  struct moments_var *mom;
-  gsl_vector *Y;
-
-  pspp_linreg_opts lopts;
+  struct covariance *cov;
+  const struct variable **vars;
+  const struct variable *dep_var;
+  struct casereader *reader;
+  const struct dictionary *dict;
+  gsl_matrix *this_cm;
 
   assert (models != NULL);
 
+  for (i = 0; i < n_variables; i++)
+    {
+      if (!var_is_numeric (v_variables[i]))
+       {
+         msg (SE, _("REGRESSION requires numeric variables."));
+         return false;
+       }
+    }
+
   c = casereader_peek (input, 0);
   if (c == NULL)
     {
@@ -888,125 +902,75 @@ run_regression (struct casereader *input, struct cmd_regression *cmd,
   output_split_file_values (ds, c);
   case_unref (c);
 
+  dict = dataset_dict (ds);
   if (!v_variables)
     {
-      dict_get_vars (dataset_dict (ds), &v_variables, &n_variables, 0);
-    }
-
-  for (i = 0; i < cmd->n_dependent; i++)
-    {
-      if (!var_is_numeric (cmd->v_dependent[i]))
-       {
-         msg (SE, _("Dependent variable must be numeric."));
-         return false;
-       }
+      dict_get_vars (dict, &v_variables, &n_variables, 0);
     }
-
-  mom = xnmalloc (n_variables, sizeof (*mom));
-  for (i = 0; i < n_variables; i++)
+  vars = xnmalloc (n_variables, sizeof (*vars));
+  means  = xnmalloc (n_variables, sizeof (*means));
+  cov = covariance_1pass_create (n_variables, v_variables,
+                                dict_get_weight (dict), MV_ANY);
+
+  reader = casereader_clone (input);
+  reader = casereader_create_filter_missing (reader, v_variables, n_variables,
+                                            MV_ANY, NULL, NULL);
+  for (; (c = casereader_read (reader)) != NULL; case_unref (c))
     {
-      (mom + i)->m = moments1_create (MOMENT_VARIANCE);
-      (mom + i)->v = v_variables[i];
+      covariance_accumulate (cov, c);
     }
-  lopts.get_depvar_mean_std = 1;
-
-
-  indep_vars = xnmalloc (n_variables, sizeof *indep_vars);
-
+  
   for (k = 0; k < cmd->n_dependent; k++)
     {
-      const struct variable *dep_var;
-      struct casereader *reader;
-      casenumber row;
-      struct ccase *c;
-      size_t n_data;           /* Number of valid cases. */
-
       dep_var = cmd->v_dependent[k];
-      n_indep = identify_indep_vars (indep_vars, dep_var);
-      reader = casereader_clone (input);
-      reader = casereader_create_filter_missing (reader, indep_vars, n_indep,
-                                                MV_ANY, NULL, NULL);
-      reader = casereader_create_filter_missing (reader, &dep_var, 1,
-                                                MV_ANY, NULL, NULL);
-      n_data = prepare_categories (casereader_clone (reader),
-                                  indep_vars, n_indep, mom);
-
-      if ((n_data > 0) && (n_indep > 0))
+      n_indep = identify_indep_vars (vars, dep_var);
+      
+      this_cm = gsl_matrix_alloc (n_indep + 1, n_indep + 1);
+      n_data = fill_covariance (this_cm, cov, vars, n_indep, 
+                               dep_var, v_variables, n_variables, means);
+      models[k] = linreg_alloc (dep_var, (const struct variable **) vars,
+                               n_data, n_indep);
+      models[k]->depvar = dep_var;
+      for (i = 0; i < n_indep; i++)
+       {
+         linreg_set_indep_variable_mean (models[k], i, means[i]);
+       }
+      linreg_set_depvar_mean (models[k], means[i]);
+      /*
+       For large data sets, use QR decomposition.
+      */
+      if (n_data > sqrt (n_indep) && n_data > REG_LARGE_DATA)
+       {
+         models[k]->method = LINREG_QR;
+       }
+      
+      if (n_data > 0)
        {
-         Y = gsl_vector_alloc (n_data);
-         X =
-           design_matrix_create (n_indep,
-                                 (const struct variable **) indep_vars,
-                                 n_data);
-         lopts.get_indep_mean_std = xnmalloc (X->m->size2, sizeof (int));
-         for (i = 0; i < X->m->size2; i++)
-           {
-             lopts.get_indep_mean_std[i] = 1;
-           }
-         models[k] = pspp_linreg_cache_alloc (dep_var, (const struct variable **) indep_vars,
-                                              X->m->size1, n_indep);
-         models[k]->depvar = dep_var;
-         /*
-            For large data sets, use QR decomposition.
-          */
-         if (n_data > sqrt (n_indep) && n_data > REG_LARGE_DATA)
-           {
-             models[k]->method = PSPP_LINREG_QR;
-           }
-
-         /*
-            The second pass fills the design matrix.
-          */
-         reader = casereader_create_counter (reader, &row, -1);
-         for (; (c = casereader_read (reader)) != NULL; case_unref (c))
-           {
-             for (i = 0; i < n_indep; ++i)
-               {
-                 const struct variable *v = indep_vars[i];
-                 const union value *val = case_data (c, v);
-                 if (var_is_alpha (v))
-                   design_matrix_set_categorical (X, row, v, val);
-                 else
-                   design_matrix_set_numeric (X, row, v, val);
-               }
-             gsl_vector_set (Y, row, case_num (c, dep_var));
-           }
-         /*
-            Now that we know the number of coefficients, allocate space
-            and store pointers to the variables that correspond to the
-            coefficients.
-          */
-         coeff_init (models[k], X);
-
          /*
-            Find the least-squares estimates and other statistics.
-          */
-         pspp_linreg ((const gsl_vector *) Y, X, &lopts, models[k]);
-
+           Find the least-squares estimates and other statistics.
+         */
+         linreg_fit (this_cm, models[k]);
+         
          if (!taint_has_tainted_successor (casereader_get_taint (input)))
            {
-             subcommand_statistics (cmd->a_statistics, models[k]);
+             subcommand_statistics (cmd->a_statistics, models[k], this_cm);
            }
-
-         gsl_vector_free (Y);
-         design_matrix_destroy (X);
-         free (lopts.get_indep_mean_std);
        }
       else
        {
          msg (SE,
               gettext ("No valid data found. This command was skipped."));
+         linreg_free (models[k]);
+         models[k] = NULL;
        }
-      casereader_destroy (reader);
     }
-  for (i = 0; i < n_variables; i++)
-    {
-      moments1_destroy ((mom + i)->m);
-    }
-  free (mom);
-  free (indep_vars);
+  
+  casereader_destroy (reader);
+  free (vars);
+  free (means);
   casereader_destroy (input);
-
+  covariance_destroy (cov);
+  
   return true;
 }
 
index a17919e405a92e81c56cd3828f4f5987c7af5082..b443d9f94c63f7a0aacebf0ed6447e58dbfdff29 100644 (file)
@@ -1,6 +1,5 @@
 ## Process this file with automake to produce Makefile.in  -*- makefile -*-
 
-include $(top_srcdir)/src/math/ts/automake.mk
 
 noinst_LTLIBRARIES += src/math/libpspp-math.la
 
@@ -11,15 +10,12 @@ src_math_libpspp_math_la_SOURCES = \
        src/math/chart-geometry.c \
        src/math/chart-geometry.h \
        src/math/box-whisker.c src/math/box-whisker.h \
-       src/math/coefficient.c \
-       src/math/coefficient.h \
+       src/math/categoricals.h \
+       src/math/categoricals.c \
        src/math/covariance.c \
        src/math/covariance.h \
-       src/math/covariance-matrix.c \
-       src/math/covariance-matrix.h \
        src/math/correlation.c \
        src/math/correlation.h \
-       src/math/design-matrix.c src/math/design-matrix.h \
        src/math/extrema.c src/math/extrema.h \
        src/math/group.c  src/math/group.h \
        src/math/group-proc.h \
diff --git a/src/math/categoricals.c b/src/math/categoricals.c
new file mode 100644 (file)
index 0000000..33e3b51
--- /dev/null
@@ -0,0 +1,386 @@
+/* PSPP - a program for statistical analysis.
+   Copyright (C) 2009 Free Software Foundation, Inc.
+
+   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 3 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, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#include <stdio.h>
+
+#include "categoricals.h"
+
+#include <gl/xalloc.h>
+#include <data/variable.h>
+#include <data/case.h>
+#include <data/value.h>
+#include <libpspp/hmap.h>
+#include <libpspp/pool.h>
+
+#include <libpspp/str.h>
+
+struct value_node
+{
+  struct hmap_node node;      /* Node in hash map. */
+  union value value;          /* The value being labeled. */
+  double cc;                  /* The total of the weights of cases with this value */
+  int subscript;              /* A zero based integer, unique within the variable.
+                                Can be used as an index into an array */
+};
+
+
+struct var_params
+{
+  /* A map indexed by a union values */
+  struct hmap map;
+
+  const struct variable *var;
+
+  int base_subscript;
+
+  /* The number of distinct values of this variable */
+  int n_cats;
+
+  /* A map of values indexed by subscript */
+  const struct value_node **reverse_value_map;
+
+  /* Total of the weights of this variable */
+  double cc; 
+};
+
+
+struct categoricals
+{
+  /* The weight variable */
+  const struct variable *wv;
+
+
+  /* An array of var_params */
+  struct var_params *vp;
+
+  /* The size of VP. (ie, the number of variables involved.) */
+  size_t n_vp;
+
+  /* The number of categorical variables which contain entries.
+     In the absence of missing values, this will be equal to N_VP */
+  size_t n_vars;
+
+  /* A map to enable the lookup of variables indexed by subscript */
+  int *reverse_variable_map;
+
+  size_t n_cats_total;
+
+  struct pool *pool;
+
+  /* Missing values to be excluded */
+  enum mv_class exclude;
+};
+
+
+void
+categoricals_destroy ( struct categoricals *cat)
+{
+  int i;
+  if (cat != NULL)
+    {
+      for (i = 0 ; i < cat->n_vp; ++i)
+       hmap_destroy (&cat->vp[i].map);
+      
+      pool_destroy (cat->pool);
+      free (cat);
+    }
+}
+
+
+void
+categoricals_dump (const struct categoricals *cat)
+{
+  int v;
+
+  for (v = 0 ; v < cat->n_vp; ++v)
+    {
+      const struct var_params *vp = &cat->vp[v];
+      const struct hmap *m = &vp->map;
+      struct hmap_node *node ;
+      int x;
+     
+      printf ("\n%s (%d)  CC=%g n_cats=%d:\n", 
+             var_get_name (vp->var), vp->base_subscript, vp->cc, vp->n_cats);
+
+      printf ("Reverse map\n");
+      for (x = 0 ; x < vp->n_cats; ++x)
+       {
+         struct string s;
+         const struct value_node *vn = vp->reverse_value_map[x];
+         ds_init_empty (&s);
+         var_append_value_name (vp->var, &vn->value, &s);
+         printf ("Value for %d is %s\n", x, ds_cstr(&s));
+         ds_destroy (&s);
+       }
+
+      printf ("\nForward map\n");
+      for (node = hmap_first (m); node; node = hmap_next (m, node))
+       {
+         struct string s;
+         ds_init_empty (&s);
+         const struct value_node *vn = HMAP_DATA (node, struct value_node, node);
+         var_append_value_name (vp->var, &vn->value, &s);
+         printf ("Value: %s; Index %d; CC %g\n",
+                 ds_cstr (&s),
+                 vn->subscript, vn->cc);
+         ds_destroy (&s);
+       }
+    }
+
+  assert (cat->n_vars <= cat->n_vp);
+
+  printf ("\n");
+  printf ("Number of categorical variables: %d\n", cat->n_vp);
+  printf ("Number of non-empty categorical variables: %d\n", cat->n_vars);
+  printf ("Total number of categories: %d\n", cat->n_cats_total);
+
+  printf ("\nReverse variable map:\n");
+
+  for (v = 0 ; v < cat->n_cats_total - cat->n_vars; ++v)
+    printf ("%d ", cat->reverse_variable_map[v]);
+  printf ("\n");
+}
+
+
+
+static struct value_node *
+lookup_value (const struct hmap *map, const struct variable *var, const union value *val)
+{
+  struct value_node *foo;
+  unsigned int width = var_get_width (var);
+  size_t hash = value_hash (val, width, 0);
+
+  HMAP_FOR_EACH_WITH_HASH (foo, struct value_node, node, hash, map)
+    {
+      if (value_equal (val, &foo->value, width))
+       break;
+
+      fprintf (stderr, "Warning: Hash table collision\n");
+    }
+
+  return foo;
+}
+
+
+
+struct categoricals *
+categoricals_create (const struct variable **v, size_t n_vars,
+                    const struct variable *wv, enum mv_class exclude)
+{
+  size_t i;
+  struct categoricals *cat = xmalloc (sizeof *cat);
+  
+  cat->n_vp = n_vars;
+  cat->wv = wv;
+  cat->n_cats_total = 0;
+  cat->n_vars = 0;
+  cat->reverse_variable_map = NULL;
+  cat->pool = pool_create ();
+  cat->exclude = exclude;
+
+  cat->vp = pool_calloc (cat->pool, cat->n_vp, sizeof *cat->vp);
+
+  for (i = 0 ; i < cat->n_vp; ++i)
+    {
+      hmap_init (&cat->vp[i].map);
+      cat->vp[i].var = v[i];
+    }
+
+  return cat;
+}
+
+
+
+void
+categoricals_update (struct categoricals *cat, const struct ccase *c)
+{
+  size_t i;
+  
+  const double weight = cat->wv ? case_data (c, cat->wv)->f : 1.0;
+
+  assert (NULL == cat->reverse_variable_map);
+
+  for (i = 0 ; i < cat->n_vp; ++i)
+    {
+      const struct variable *var = cat->vp[i].var;
+      unsigned int width = var_get_width (var);
+      const union value *val = case_data (c, var);
+      size_t hash;
+      struct value_node *node ;
+
+      if ( var_is_value_missing (var, val, cat->exclude))
+       continue;
+
+      hash = value_hash (val, width, 0);
+      node = lookup_value (&cat->vp[i].map, var, val);
+
+      if ( NULL == node)
+       {
+         node = pool_malloc (cat->pool, sizeof *node);
+
+         value_init (&node->value, width);
+         value_copy (&node->value, val, width);
+         node->cc = 0.0;
+
+         hmap_insert (&cat->vp[i].map, &node->node,  hash);
+         cat->n_cats_total++;
+         
+         if ( 0 == cat->vp[i].n_cats)
+           cat->n_vars++;
+
+         node->subscript = cat->vp[i].n_cats++ ;
+       }
+
+      node->cc += weight;
+      cat->vp[i].cc += weight;
+    }
+}
+
+/* Return the number of categories (distinct values) for variable N */
+size_t
+categoricals_n_count (const struct categoricals *cat, size_t n)
+{
+  return hmap_count (&cat->vp[n].map);
+}
+
+
+/* Return the total number of categories */
+size_t
+categoricals_total (const struct categoricals *cat)
+{
+  return cat->n_cats_total;
+}
+
+
+/* This function must be called *before* any call to categoricals_get_*_by subscript an
+ *after* all calls to categoricals_update */
+void
+categoricals_done (struct categoricals *cat)
+{
+  /* Implementation Note: Whilst this function is O(n) in cat->n_cats_total, in most
+     uses it will be more efficient that using a tree based structure, since it
+     is called only once, and means that subsequent lookups will be O(1).
+
+     1 call of O(n) + 10^9 calls of O(1) is better than 10^9 calls of O(log n).
+  */
+  int v;
+  int idx = 0;
+  cat->reverse_variable_map = pool_calloc (cat->pool,
+                                          cat->n_cats_total - cat->n_vars,
+                                          sizeof *cat->reverse_variable_map);
+  
+  for (v = 0 ; v < cat->n_vp; ++v)
+    {
+      int i;
+      struct var_params *vp = &cat->vp[v];
+      int n_cats_total = categoricals_n_count (cat, v);
+      struct hmap_node *node ;
+
+      vp->reverse_value_map = pool_calloc (cat->pool, n_cats_total, sizeof *vp->reverse_value_map);
+
+      vp->base_subscript = idx;
+
+      for (node = hmap_first (&vp->map); node; node = hmap_next (&vp->map, node))
+       {
+         const struct value_node *vn = HMAP_DATA (node, struct value_node, node);
+         vp->reverse_value_map[vn->subscript] = vn;
+       }
+
+      /* Populate the reverse variable map.
+        This implementation considers the first value of each categorical variable
+        as the basis.  Therefore, this loop starts from 1 instead of 0 */
+      for (i = 1; i < vp->n_cats; ++i)
+       cat->reverse_variable_map[idx++] = v;
+    }
+
+  assert (cat->n_vars <= cat->n_vp);
+}
+
+
+static int
+reverse_variable_lookup (const struct categoricals *cat, int subscript)
+{
+  assert (cat->reverse_variable_map);
+  assert (subscript >= 0);
+  assert (subscript < cat->n_cats_total - cat->n_vars);
+
+  return cat->reverse_variable_map[subscript];
+}
+
+
+/* Return the categorical variable corresponding to SUBSCRIPT */
+const struct variable *
+categoricals_get_variable_by_subscript (const struct categoricals *cat, int subscript)
+{
+  int index = reverse_variable_lookup (cat, subscript);
+
+  return cat->vp[index].var;
+}
+
+/* Return the value corresponding to SUBSCRIPT */
+const union value *
+categoricals_get_value_by_subscript (const struct categoricals *cat, int subscript)
+{
+  int vindex = reverse_variable_lookup (cat, subscript);
+  const struct var_params *vp = &cat->vp[vindex];
+  const struct value_node *vn = vp->reverse_value_map [subscript - vp->base_subscript];
+
+  return &vn->value;
+}
+
+
+double
+categoricals_get_weight_by_subscript (const struct categoricals *cat, int subscript)
+{
+  int vindex = reverse_variable_lookup (cat, subscript);
+  const struct var_params *vp = &cat->vp[vindex];
+
+  return vp->cc;
+}
+
+double
+categoricals_get_sum_by_subscript (const struct categoricals *cat, int subscript)
+{
+  int vindex = reverse_variable_lookup (cat, subscript);
+  const struct var_params *vp = &cat->vp[vindex];
+
+  const struct value_node *vn = vp->reverse_value_map [subscript - vp->base_subscript];
+  return vn->cc;
+}
+
+
+/* Returns unity if the value in case C at SUBSCRIPT is equal to the category
+   for that subscript */
+double
+categoricals_get_binary_by_subscript (const struct categoricals *cat, int subscript,
+                                     const struct ccase *c)
+{
+  const struct variable *var = categoricals_get_variable_by_subscript (cat, subscript);
+  int width = var_get_width (var);
+
+  const union value *val = case_data (c, var);
+
+  return value_equal (val, categoricals_get_value_by_subscript (cat, subscript), width);
+}
+
+
+size_t
+categoricals_get_n_variables (const struct categoricals *cat)
+{
+  return cat->n_vars;
+}
diff --git a/src/math/categoricals.h b/src/math/categoricals.h
new file mode 100644 (file)
index 0000000..2f86ce1
--- /dev/null
@@ -0,0 +1,70 @@
+/* PSPP - a program for statistical analysis.
+   Copyright (C) 2009 Free Software Foundation, Inc.
+
+   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 3 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, see <http://www.gnu.org/licenses/>. */
+
+
+#ifndef _CATEGORICALS__
+#define _CATEGORICALS__
+
+#include <stddef.h>
+#include <data/missing-values.h>
+
+struct categoricals;
+struct variable;
+struct ccase;
+
+union value ;
+
+struct categoricals *categoricals_create (const struct variable **v, size_t n_vars,
+                                         const struct variable *wv, enum mv_class exclude);
+
+void categoricals_destroy (struct categoricals *);
+
+void categoricals_update (struct categoricals *cat, const struct ccase *c);
+
+
+/* Return the number of categories (distinct values) for variable N */
+size_t categoricals_n_count (const struct categoricals *cat, size_t n);
+
+
+/* Return the total number of categories */
+size_t categoricals_total (const struct categoricals *cat);
+
+/*
+  Return the total number of variables which participated in these categoricals.
+  Due to the possibility of missing values, this is NOT necessarily
+  equal to the number of variables passed in when the object was
+  created.
+*/
+size_t categoricals_get_n_variables (const struct categoricals *cat);
+
+void categoricals_done (struct categoricals *cat);
+
+const struct variable * categoricals_get_variable_by_subscript (const struct categoricals *cat, int subscript);
+
+const union value * categoricals_get_value_by_subscript (const struct categoricals *cat, int subscript);
+
+double categoricals_get_weight_by_subscript (const struct categoricals *cat, int subscript);
+
+double categoricals_get_sum_by_subscript (const struct categoricals *cat, int subscript);
+
+double categoricals_get_binary_by_subscript (const struct categoricals *cat, int subscript,
+                                            const struct ccase *c);
+
+
+
+
+
+#endif
diff --git a/src/math/covariance-matrix.c b/src/math/covariance-matrix.c
deleted file mode 100644 (file)
index 1a72644..0000000
+++ /dev/null
@@ -1,1016 +0,0 @@
-/* PSPP - a program for statistical analysis.
-   Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
-
-   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 3 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, see <http://www.gnu.org/licenses/>. */
-
-/*
-  Create and update the values in the covariance matrix.
-*/
-#include <assert.h>
-#include <config.h>
-#include <data/case.h>
-#include <data/category.h>
-#include <data/variable.h>
-#include <data/value.h>
-#include <libpspp/hash.h>
-#include <libpspp/hash-functions.h>
-#include <math/covariance-matrix.h>
-#include <math/moments.h>
-#include <string.h>
-#include <xalloc.h>
-
-/*
-  Structure used to accumulate the covariance matrix in a single data
-  pass.  Before passing the data, we do not know how many categories
-  there are in each categorical variable. Therefore we do not know the
-  size of the covariance matrix. To get around this problem, we
-  accumulate the elements of the covariance matrix in pointers to
-  COVARIANC_ACCUMULATOR. These values are then used to populate
-  the covariance matrix.
- */
-struct covariance_accumulator
-{
-  const struct variable *v1;
-  const struct variable *v2;
-  const union value *val1;
-  const union value *val2;
-  double dot_product;
-  double sum1;
-  double sum2;
-  double ssize;
-};
-
-
-
-struct covariance_matrix
-{
-  struct design_matrix *cov;
-  struct design_matrix *ssize;
-  struct hsh_table *ca;
-  struct moments1 **m1;
-  struct moments **m;
-  const struct variable **v_variables;
-  const struct interaction_variable **interactions;
-  size_t n_variables;
-  size_t n_intr;
-  int n_pass;
-  int missing_handling;
-  enum mv_class missing_value;
-  void (*accumulate) (struct covariance_matrix *, const struct ccase *,
-                     const struct interaction_variable **, size_t);
-  void (*update_moments) (struct covariance_matrix *, size_t, double);
-};
-
-
-
-static struct hsh_table *covariance_hsh_create (size_t *);
-static hsh_hash_func covariance_accumulator_hash;
-static unsigned int hash_numeric_alpha (const struct variable *,
-                                       const struct variable *,
-                                       const union value *, size_t);
-static hsh_compare_func covariance_accumulator_compare;
-static hsh_free_func covariance_accumulator_free;
-static void update_moments1 (struct covariance_matrix *, size_t, double);
-static void update_moments2 (struct covariance_matrix *, size_t, double);
-static struct covariance_accumulator *get_new_covariance_accumulator (const
-                                                                     struct
-                                                                     variable
-                                                                     *,
-                                                                     const
-                                                                     struct
-                                                                     variable
-                                                                     *,
-                                                                     const
-                                                                     union
-                                                                     value *,
-                                                                     const
-                                                                     union
-                                                                     value
-                                                                     *);
-static void covariance_accumulate_listwise (struct covariance_matrix *,
-                                           const struct ccase *,
-                                           const struct interaction_variable **,
-                                           size_t);
-static void covariance_accumulate_pairwise (struct covariance_matrix *,
-                                           const struct ccase *,
-                                           const struct interaction_variable **,
-                                           size_t);
-
-struct covariance_matrix *
-covariance_matrix_init (size_t n_variables,
-                       const struct variable *v_variables[], int n_pass,
-                       int missing_handling, enum mv_class missing_value)
-{
-  size_t i;
-  struct covariance_matrix *result = NULL;
-
-  result = xmalloc (sizeof (*result));
-  result->cov = NULL;
-  result->n_variables = n_variables;
-  result->ca = covariance_hsh_create (&result->n_variables);
-  result->m = NULL;
-  result->m1 = NULL;
-  result->n_intr = 0;
-  result->missing_handling = missing_handling;
-  result->missing_value = missing_value;
-  result->accumulate = (result->missing_handling == LISTWISE) ?
-    covariance_accumulate_listwise : covariance_accumulate_pairwise;
-  if (n_pass == ONE_PASS)
-    {
-      result->update_moments = update_moments1;
-      result->m1 = xnmalloc (n_variables, sizeof (*result->m1));
-      for (i = 0; i < n_variables; i++)
-       {
-         result->m1[i] = moments1_create (MOMENT_MEAN);
-       }
-    }
-  else
-    {
-      result->update_moments = update_moments2;
-      result->m = xnmalloc (n_variables, sizeof (*result->m));
-      for (i = 0; i < n_variables; i++)
-       {
-         result->m[i] = moments_create (MOMENT_MEAN);
-       }
-    }
-  result->v_variables = v_variables;
-
-  result->n_pass = n_pass;
-
-  return result;
-}
-void
-covariance_interaction_set (struct covariance_matrix *cov, 
-                           const struct interaction_variable **intr, size_t n_intr)
-{
-  cov->interactions = intr;
-  cov->n_intr = n_intr;
-}
-
-static size_t 
-get_n_rows (size_t n_variables, const struct variable *v_variables[])
-{
-  size_t i;
-  size_t result = 0;
-  for (i = 0; i < n_variables; i++)
-    {
-      if (var_is_numeric (v_variables[i]))
-       {
-         result++;
-       }
-      else if (var_is_alpha (v_variables[i]))
-       {
-         size_t n_categories = cat_get_n_categories (v_variables[i]);
-         result += n_categories - 1;
-       }
-    }
-  return result;
-}
-/*
-  The covariances are stored in a DESIGN_MATRIX structure.
- */
-struct design_matrix *
-covariance_matrix_create (size_t n_variables,
-                         const struct variable *v_variables[])
-{
-  size_t n_rows = get_n_rows (n_variables, v_variables);
-  return design_matrix_create (n_variables, v_variables, n_rows);
-}
-
-static size_t 
-get_n_rows_s (const struct variable *var)
-{
-  size_t result = 0;
-  if (var_is_numeric (var))
-    {
-      result++;
-    }
-  else
-    {
-      result += cat_get_n_categories (var) - 1;
-    }
-  return result;
-}
-static struct design_matrix *
-covariance_matrix_create_s (struct covariance_matrix *cov)
-{
-  struct variable **v_variables;
-  size_t n_variables;
-  size_t n_rows = 0;
-  size_t i;
-  size_t j;
-
-  n_variables = cov->n_variables + cov->n_intr;
-  v_variables = xnmalloc (n_variables, sizeof (*v_variables));
-  for (i = 0; i < cov->n_variables; i++)
-    {
-      v_variables[i] = cov->v_variables[i];
-      n_rows += get_n_rows_s (v_variables[i]);
-    }
-  for (j = 0; j < cov->n_intr; j++)
-    {
-      v_variables[i + j] = interaction_get_variable (cov->interactions[j]);
-      n_rows += get_n_rows_s (v_variables[i]);
-    }
-  return design_matrix_create (n_variables, v_variables, n_rows);
-}
-
-static void
-update_moments1 (struct covariance_matrix *cov, size_t i, double x)
-{
-  assert (cov->m1 != NULL);
-  moments1_add (cov->m1[i], x, 1.0);
-}
-
-static void
-update_moments2 (struct covariance_matrix *cov, size_t i, double x)
-{
-  assert (cov->m != NULL);
-  moments_pass_one (cov->m[i], x, 1.0);
-}
-
-void
-covariance_matrix_destroy (struct covariance_matrix *cov)
-{
-  size_t i;
-
-  assert (cov != NULL);
-  design_matrix_destroy (cov->cov);
-  design_matrix_destroy (cov->ssize);
-  hsh_destroy (cov->ca);
-  if (cov->n_pass == ONE_PASS)
-    {
-      for (i = 0; i < cov->n_variables; i++)
-       {
-         moments1_destroy (cov->m1[i]);
-       }
-      free (cov->m1);
-    }
-  else
-    {
-      for (i = 0; i < cov->n_variables; i++)
-       {
-         moments_destroy (cov->m[i]);
-       }
-      free (cov->m);
-    }
-}
-
-/*
-  Update the covariance matrix with the new entries, assuming that ROW
-  corresponds to a categorical variable and V2 is numeric.
- */
-static void
-covariance_update_categorical_numeric (struct design_matrix *cov, double mean,
-                                      size_t row,
-                                      const struct variable *v2, double x,
-                                      const union value *val2)
-{
-  size_t col;
-  double tmp;
-
-  assert (var_is_numeric (v2));
-
-  col = design_matrix_var_to_column (cov, v2);
-  assert (val2 != NULL);
-  tmp = design_matrix_get_element (cov, row, col);
-  design_matrix_set_element (cov, row, col, (val2->f - mean) * x + tmp);
-  design_matrix_set_element (cov, col, row, (val2->f - mean) * x + tmp);
-}
-static void
-column_iterate (struct design_matrix *cov, const struct variable *v,
-               double ssize, double x, const union value *val1, size_t row)
-{
-  int width = var_get_width (v);
-  size_t col;
-  size_t i;
-  double y;
-  double tmp;
-  const union value *tmp_val;
-
-  col = design_matrix_var_to_column (cov, v);
-  for (i = 0; i < cat_get_n_categories (v) - 1; i++)
-    {
-      col += i;
-      y = -1.0 * cat_get_category_count (i, v) / ssize;
-      tmp_val = cat_subscript_to_value (i, v);
-      if (!value_equal (tmp_val, val1, width))
-       {
-         y += -1.0;
-       }
-      tmp = design_matrix_get_element (cov, row, col);
-      design_matrix_set_element (cov, row, col, x * y + tmp);
-      design_matrix_set_element (cov, col, row, x * y + tmp);
-    }
-}
-
-/*
-  Call this function in the second data pass. The central moments are
-  MEAN1 and MEAN2. Any categorical variables should already have their
-  values summarized in in its OBS_VALS element.
- */
-void
-covariance_pass_two (struct design_matrix *cov, double mean1, double mean2,
-                    double ssize, const struct variable *v1,
-                    const struct variable *v2, const union value *val1,
-                    const union value *val2)
-{
-  size_t row;
-  size_t col;
-  size_t i;
-  double x;
-  const union value *tmp_val;
-
-  if (var_is_alpha (v1))
-    {
-      row = design_matrix_var_to_column (cov, v1);
-      for (i = 0; i < cat_get_n_categories (v1) - 1; i++)
-       {
-         row += i;
-         x = -1.0 * cat_get_category_count (i, v1) / ssize;
-         tmp_val = cat_subscript_to_value (i, v1);
-         if (!value_equal (tmp_val, val1, var_get_width (v1)))
-           {
-             x += 1.0;
-           }
-         if (var_is_numeric (v2))
-           {
-             covariance_update_categorical_numeric (cov, mean2, row,
-                                                    v2, x, val2);
-           }
-         else
-           {
-             column_iterate (cov, v1, ssize, x, val1, row);
-             column_iterate (cov, v2, ssize, x, val2, row);
-           }
-       }
-    }
-  else if (var_is_alpha (v2))
-    {
-      /*
-         Reverse the orders of V1, V2, etc. and put ourselves back
-         in the previous IF scope.
-       */
-      covariance_pass_two (cov, mean2, mean1, ssize, v2, v1, val2, val1);
-    }
-  else
-    {
-      /*
-         Both variables are numeric.
-       */
-      row = design_matrix_var_to_column (cov, v1);
-      col = design_matrix_var_to_column (cov, v2);
-      x = (val1->f - mean1) * (val2->f - mean2);
-      x += design_matrix_get_element (cov, col, row);
-      design_matrix_set_element (cov, row, col, x);
-      design_matrix_set_element (cov, col, row, x);
-    }
-}
-
-static unsigned int
-covariance_accumulator_hash (const void *h, const void *aux)
-{
-  struct covariance_accumulator *ca = (struct covariance_accumulator *) h;
-  size_t *n_vars = (size_t *) aux;
-  const struct variable *v_min;
-  const struct variable *v_max;
-  const union value *val_min;
-  const union value *val_max;
-
-  /*
-     Order everything by the variables' addresses. This ensures we get the
-     same key regardless of the order in which the variables are stored
-     and passed around.
-   */
-  if (ca->v1 < ca->v2)
-    {
-      v_min = ca->v1;
-      v_max = ca->v2;
-      val_min = ca->val1;
-      val_max = ca->val2;
-    }
-  else
-    {
-      v_min = ca->v2;
-      v_max = ca->v2;
-      val_min = ca->val2;
-      val_max = ca->val1;
-    }
-
-  if (var_is_numeric (v_max) && var_is_numeric (v_min))
-    {
-      return hash_pointer (v_min, hash_pointer (v_max, 0));
-    }
-  if (var_is_numeric (v_max) && var_is_alpha (v_min))
-    {
-      return hash_numeric_alpha (v_max, v_min, val_min, *n_vars);
-    }
-  if (var_is_alpha (v_max) && var_is_numeric (v_min))
-    {
-      return (hash_numeric_alpha (v_min, v_max, val_max, *n_vars));
-    }
-  if (var_is_alpha (v_max) && var_is_alpha (v_min))
-    {
-      unsigned hash = value_hash (val_max, var_get_width (v_max), 0);
-      hash = value_hash (val_min, var_get_width (v_min), hash);
-      hash = hash_pointer (v_min, hash);
-      return hash_pointer (v_max, hash);
-    }
-  return -1u;
-}
-
-/*
-  Make a hash table consisting of struct covariance_accumulators.
-  This allows the accumulation of the elements of a covariance matrix
-  in a single data pass. Call covariance_accumulate () for each case 
-  in the data.
- */
-static struct hsh_table *
-covariance_hsh_create (size_t *n_vars)
-{
-  return hsh_create (*n_vars * *n_vars, covariance_accumulator_compare,
-                    covariance_accumulator_hash, covariance_accumulator_free,
-                    n_vars);
-}
-
-static void
-covariance_accumulator_free (void *c_, const void *aux UNUSED)
-{
-  struct covariance_accumulator *c = c_;
-  assert (c != NULL);
-  free (c);
-}
-
-static int 
-ordered_match_nodes (const struct covariance_accumulator *c, const struct variable *v1,
-                    const struct variable *v2, const union value *val1, const union value *val2)
-{
-  return (v1 != c->v1
-          || v2 != c->v2
-          || (var_is_alpha (v1)
-              && !value_equal (val1, c->val1, var_get_width (v1)))
-          || (var_is_alpha (v2)
-              && !value_equal (val2, c->val2, var_get_width (v2))));
-}
-  
-/*
-  Hash comparison. Returns 0 for a match, or a non-zero int
-  otherwise. The sign of a non-zero return value *should* indicate the
-  position of C relative to the covariance_accumulator described by
-  the other arguments. But for now, it just returns 1 for any
-  non-match.  This should be changed when someone figures out how to
-  compute a sensible sign for the return value.
- */
-static int
-match_nodes (const struct covariance_accumulator *c,
-            const struct variable *v1, const struct variable *v2,
-            const union value *val1, const union value *val2)
-{
-  return (ordered_match_nodes (c, v1, v2, val1, val2)
-          && ordered_match_nodes (c, v2, v1, val2, val1));
-}
-
-/*
-  This function is meant to be used as a comparison function for
-  a struct hsh_table in src/libpspp/hash.c.
-*/
-static int
-covariance_accumulator_compare (const void *a1_, const void *a2_,
-                               const void *aux UNUSED)
-{
-  const struct covariance_accumulator *a1 = a1_;
-  const struct covariance_accumulator *a2 = a2_;
-
-  if (a1 == NULL && a2 == NULL)
-    return 0;
-
-  if (a1 == NULL || a2 == NULL)
-    return 1;
-  
-  return match_nodes (a1, a2->v1, a2->v2, a2->val1, a2->val2);
-}
-
-static unsigned int
-hash_numeric_alpha (const struct variable *v1, const struct variable *v2,
-                   const union value *val, size_t n_vars)
-{
-  unsigned int result = -1u;
-  if (var_is_numeric (v1) && var_is_alpha (v2))
-    {
-      result = hash_pointer (v1, 0);
-      result = hash_pointer (v2, result);
-      result = value_hash (val, var_get_width (v2), result);
-    }
-  else if (var_is_alpha (v1) && var_is_numeric (v2))
-    {
-      result = hash_numeric_alpha (v2, v1, val, n_vars);
-    }
-  return result;
-}
-
-
-static double
-update_product (const struct variable *v1, const struct variable *v2,
-               const union value *val1, const union value *val2)
-{
-  assert (v1 != NULL);
-  assert (v2 != NULL);
-  assert (val1 != NULL);
-  assert (val2 != NULL);
-  if (var_is_alpha (v1) && var_is_alpha (v2))
-    {
-      return 1.0;
-    }
-  if (var_is_numeric (v1) && var_is_numeric (v2))
-    {
-      return (val1->f * val2->f);
-    }
-  if (var_is_numeric (v1) && var_is_alpha (v2))
-    {
-      return val1->f;
-    }
-  if (var_is_numeric (v2) && var_is_alpha (v1))
-    {
-      return val2->f;
-    }
-  else
-    {
-      return 0.0;
-    }
-}
-static double
-update_sum (const struct variable *var, const union value *val, double weight)
-{
-  assert (var != NULL);
-  assert (val != NULL);
-  if (var_is_alpha (var))
-    {
-      return weight;
-    }
-  return val->f;
-}
-static struct covariance_accumulator *
-get_new_covariance_accumulator (const struct variable *v1,
-                               const struct variable *v2,
-                               const union value *val1,
-                               const union value *val2)
-{
-  if ((v1 != NULL) && (v2 != NULL) && (val1 != NULL) && (val2 != NULL))
-    {
-      struct covariance_accumulator *ca;
-      ca = xmalloc (sizeof (*ca));
-      ca->v1 = v1;
-      ca->v2 = v2;
-      ca->val1 = val1;
-      ca->val2 = val2;
-      return ca;
-    }
-  return NULL;
-}
-
-static const struct variable **
-get_covariance_variables (const struct covariance_matrix *cov)
-{
-  return cov->v_variables;
-}
-
-static void
-update_hash_entry_intr (struct hsh_table *c,
-                       const struct variable *v1,
-                       const struct variable *v2,
-                       const union value *val1, const union value *val2, 
-                       const struct interaction_value *i_val1,
-                       const struct interaction_value *i_val2)
-{
-  struct covariance_accumulator *ca;
-  struct covariance_accumulator *new_entry;
-  double iv_f1;
-  double iv_f2;
-
-  iv_f1 = interaction_value_get_nonzero_entry (i_val1);
-  iv_f2 = interaction_value_get_nonzero_entry (i_val2);
-  ca = get_new_covariance_accumulator (v1, v2, val1, val2);
-  ca->dot_product = update_product (ca->v1, ca->v2, ca->val1, ca->val2);
-  ca->dot_product *= iv_f1 * iv_f2;
-  ca->sum1 = update_sum (ca->v1, ca->val1, iv_f1);
-  ca->sum2 = update_sum (ca->v2, ca->val2, iv_f2);
-  ca->ssize = 1.0;
-  new_entry = hsh_insert (c, ca);
-
-  if (new_entry != NULL)
-    {
-      new_entry->dot_product += ca->dot_product;
-      new_entry->ssize += 1.0;
-      new_entry->sum1 += ca->sum1;
-      new_entry->sum2 += ca->sum2;
-      /*
-       If DOT_PRODUCT is null, CA was not already in the hash
-       hable, so we don't free it because it was just inserted.
-       If DOT_PRODUCT was not null, CA is already in the hash table.
-       Unnecessary now, it must be freed here.
-      */
-      free (ca);
-    }
-}
-
-static void
-update_hash_entry (struct hsh_table *c,
-                  const struct variable *v1,
-                  const struct variable *v2,
-                  const union value *val1, const union value *val2)
-{
-  struct covariance_accumulator *ca;
-  struct covariance_accumulator *new_entry;
-
-  ca = get_new_covariance_accumulator (v1, v2, val1, val2);
-  ca->dot_product = update_product (ca->v1, ca->v2, ca->val1, ca->val2);
-  ca->sum1 = update_sum (ca->v1, ca->val1, 1.0);
-  ca->sum2 = update_sum (ca->v2, ca->val2, 1.0);
-  ca->ssize = 1.0;
-  new_entry = hsh_insert (c, ca);
-
-  if (new_entry != NULL)
-    {
-      new_entry->dot_product += ca->dot_product;
-      new_entry->ssize += 1.0;
-      new_entry->sum1 += ca->sum1;
-      new_entry->sum2 += ca->sum2;
-      /*
-       If DOT_PRODUCT is null, CA was not already in the hash
-       hable, so we don't free it because it was just inserted.
-       If DOT_PRODUCT was not null, CA is already in the hash table.
-       Unnecessary now, it must be freed here.
-      */
-      free (ca);
-    }
-}
-
-static void
-inner_intr_loop (struct covariance_matrix *cov, const struct ccase  *ccase, const struct variable *var1,
-                const union value *val1, const struct interaction_variable **i_var, 
-                const struct interaction_value *i_val1, size_t j)
-{
-  struct variable *var2;
-  union value *val2;
-  struct interaction_value *i_val2;
-
-  var2 = interaction_get_variable (i_var[j]);
-  i_val2 = interaction_case_data (ccase, i_var[j]);
-  val2 = interaction_value_get (i_val2);
-  
-  if (!var_is_value_missing (var2, val2, cov->missing_value))
-    {
-      update_hash_entry_intr (cov->ca, var1, var2, val1, val2, i_val1, i_val2);
-    }
-}       
-/*
-  Compute the covariance matrix in a single data-pass. Cases with
-  missing values are dropped pairwise, in other words, only if one of
-  the two values necessary to accumulate the inner product is missing.
-
-  Do not call this function directly. Call it through the struct
-  covariance_matrix ACCUMULATE member function, for example,
-  cov->accumulate (cov, ccase).
- */
-static void
-covariance_accumulate_pairwise (struct covariance_matrix *cov,
-                               const struct ccase *ccase, 
-                               const struct interaction_variable **i_var,
-                               size_t n_intr)
-{
-  size_t i;
-  size_t j;
-  const union value *val1;
-  const union value *val2;
-  const struct variable **v_variables;
-  const struct variable *var1;
-  const struct variable *var2;
-  struct interaction_value *i_val1 = NULL;
-  struct interaction_value *i_val2 = NULL;
-
-  assert (cov != NULL);
-  assert (ccase != NULL);
-
-  v_variables = get_covariance_variables (cov);
-  assert (v_variables != NULL);
-
-  for (i = 0; i < cov->n_variables; ++i)
-    {
-      var1 = v_variables[i];
-      val1 = case_data (ccase, var1);
-      if (!var_is_value_missing (var1, val1, cov->missing_value))
-       {
-         cat_value_update (var1, val1);
-         if (var_is_numeric (var1))
-           cov->update_moments (cov, i, val1->f);
-
-         for (j = i; j < cov->n_variables; j++)
-           {
-             var2 = v_variables[j];
-             val2 = case_data (ccase, var2);
-             if (!var_is_value_missing
-                 (var2, val2, cov->missing_value))
-               {
-                 update_hash_entry (cov->ca, var1, var2, val1, val2);
-               }
-           }
-         for (j = 0; j < cov->n_intr; j++)
-           {
-             inner_intr_loop (cov, ccase, var1, val1, i_var, i_val1, j);
-           }
-       }
-    }
-  for (i = 0; i < cov->n_intr; i++)
-    {
-      var1 = interaction_get_variable (i_var[i]);
-      i_val1 = interaction_case_data (ccase, i_var[i]);
-      val1 = interaction_value_get (i_val1);
-      cat_value_update (var1, val1);
-      if (!var_is_value_missing (var1, val1, cov->missing_value))
-       {
-         for (j = i; j < cov->n_intr; j++)
-           {
-             inner_intr_loop (cov, ccase, var1, val1, i_var, i_val1, j);
-           }
-       }
-    }
-}
-
-/*
-  Compute the covariance matrix in a single data-pass. Cases with
-  missing values are dropped listwise. In other words, if one of the
-  values for any variable in a case is missing, the entire case is
-  skipped. 
-
-  The caller must use a casefilter to remove the cases with missing
-  values before calling covariance_accumulate_listwise. This function
-  assumes that CCASE has already passed through this filter, and
-  contains no missing values.
-
-  Do not call this function directly. Call it through the struct
-  covariance_matrix ACCUMULATE member function, for example,
-  cov->accumulate (cov, ccase).
- */
-static void
-covariance_accumulate_listwise (struct covariance_matrix *cov,
-                               const struct ccase *ccase,
-                               const struct interaction_variable **i_var,
-                               size_t n_intr)
-{
-  size_t i;
-  size_t j;
-  const union value *val1;
-  const union value *val2;
-  const struct variable **v_variables;
-  struct interaction_value *i_val1 = NULL;
-  struct interaction_value *i_val2 = NULL;
-
-  assert (cov != NULL);
-  assert (ccase != NULL);
-
-  v_variables = get_covariance_variables (cov);
-  assert (v_variables != NULL);
-
-  for (i = 0; i < cov->n_variables; ++i)
-    {
-      val1 = case_data (ccase, v_variables[i]);
-      cat_value_update (v_variables[i], val1);
-      if (var_is_numeric (v_variables[i]))
-       cov->update_moments (cov, i, val1->f);
-
-      for (j = i; j < cov->n_variables; j++)
-       {
-         update_hash_entry (cov->ca, v_variables[i], v_variables[j],
-                            val1, val2);
-       }
-    }
-}
-
-/*
-  Call this function during the data pass. Each case will be added to
-  a hash containing all values of the covariance matrix. After the
-  data have been passed, call covariance_matrix_compute to put the
-  values in the struct covariance_matrix. 
- */
-void
-covariance_matrix_accumulate (struct covariance_matrix *cov,
-                             const struct ccase *ccase, void **aux, size_t n_intr)
-{
-  cov->accumulate (cov, ccase, (const struct interaction_variable **) aux, n_intr);
-}
-
-/*
-  Return the value corresponding to subscript TARGET. If that value corresponds
-  to the origin, return NULL.
- */
-static const union value *
-get_value_from_subscript (const struct design_matrix *dm, size_t target)
-{
-  const union value *result = NULL;
-  const struct variable *var;
-  size_t i;
-  
-  var = design_matrix_col_to_var (dm, target);
-  if (var_is_numeric (var))
-    {
-      return NULL;
-    }
-  for (i = 0; i < cat_get_n_categories (var); i++)
-    {
-      result = cat_subscript_to_value (i, var);
-      if (dm_get_exact_subscript (dm, var, result) == target)
-       {
-         return result;
-       }
-    }
-  return NULL;
-}
-
-static bool
-is_covariance_contributor (const struct covariance_accumulator *ca, const struct design_matrix *dm,
-                          size_t i, size_t j)
-{
-  size_t k;
-  const struct variable *v1;
-  const struct variable *v2;
-  
-  assert (dm != NULL);
-  v1 = design_matrix_col_to_var (dm, i);
-  v2 = design_matrix_col_to_var (dm, j);
-  if (v1 == ca->v1)
-    {
-      if (v2 == ca->v2)
-       {
-         k = dm_get_exact_subscript (dm, v1, ca->val1);
-         if (k == i)
-           {
-             k = dm_get_exact_subscript (dm, v2, ca->val2);
-             if (k == j)
-               {
-                 return true;
-               }
-           }
-       }
-    }
-  else if (v1 == ca->v2)
-    {
-      if (v2 == ca->v1)
-       {
-         k = dm_get_exact_subscript (dm, v1, ca->val2);
-         if (k == i)
-           {
-             k = dm_get_exact_subscript (dm, v2, ca->val1);
-             if (k == j)
-               {
-                 return true;
-               }
-           }
-       }
-    }
-  
-  return false;
-}
-static double
-get_sum (const struct covariance_matrix *cov, size_t i)
-{
-  size_t k;
-  double mean;
-  double n;
-  const struct variable *var;
-  const union value *val = NULL;
-
-  assert ( cov != NULL);
-  var = design_matrix_col_to_var (cov->cov, i);
-  if (var != NULL)
-    {
-      if (var_is_alpha (var))
-       {
-         val = get_value_from_subscript (cov->cov, i);
-         k = cat_value_find (var, val);
-         return cat_get_category_count (k, var);
-       }
-      else
-       {
-         k = 0;
-         while (cov->v_variables[k] != var && k  < cov->n_variables)
-           {
-             k++;
-           }
-         if (k < cov->n_variables)
-           {
-             moments1_calculate (cov->m1[k], &n, &mean, NULL, NULL, NULL);
-             return mean * n;
-           }
-       }
-    }
-      
-  return 0.0;
-}
-static void
-update_ssize (struct design_matrix *dm, size_t i, size_t j, struct covariance_accumulator *ca)
-{
-  const struct variable *var;
-  double tmp;
-  var = design_matrix_col_to_var (dm, i);
-  if (ca->v1 == var)
-    {
-      var = design_matrix_col_to_var (dm, j);
-      if (ca->v2 == var)
-       {
-         tmp = design_matrix_get_element (dm, i, j);
-         tmp += ca->ssize;
-         design_matrix_set_element (dm, i, j, tmp);
-       }
-    }
-}
-static void
-covariance_accumulator_to_matrix (struct covariance_matrix *cov)
-{
-  size_t i;
-  size_t j;
-  double sum_i = 0.0;
-  double sum_j = 0.0;
-  double tmp = 0.0;
-  struct covariance_accumulator *entry;
-  struct hsh_iterator iter;
-
-  cov->cov = covariance_matrix_create_s (cov);
-  cov->ssize = covariance_matrix_create_s (cov);
-  entry = hsh_first (cov->ca, &iter);
-  while (entry != NULL)
-    {
-      entry = hsh_next (cov->ca, &iter);
-    }
-
-  for (i = 0; i < design_matrix_get_n_cols (cov->cov); i++)
-    {
-      sum_i = get_sum (cov, i);
-      for (j = i; j < design_matrix_get_n_cols (cov->cov); j++)
-       {
-         sum_j = get_sum (cov, j);
-         entry = hsh_first (cov->ca, &iter);
-         while (entry != NULL)
-           {
-             update_ssize (cov->ssize, i, j, entry);
-             /*
-               We compute the centered, un-normalized covariance matrix.
-             */
-             if (is_covariance_contributor (entry, cov->cov, i, j))
-               {
-                 design_matrix_set_element (cov->cov, i, j, entry->dot_product);
-               }
-             entry = hsh_next (cov->ca, &iter);
-           }
-         tmp = design_matrix_get_element (cov->cov, i, j);
-         tmp -= sum_i * sum_j / design_matrix_get_element (cov->ssize, i, j);
-         design_matrix_set_element (cov->cov, i, j, tmp);
-         design_matrix_set_element (cov->cov, j, i, tmp);
-       } 
-    }
-}
-
-
-/*
-  Call this function after passing the data.
- */
-void
-covariance_matrix_compute (struct covariance_matrix *cov)
-{
-  if (cov->n_pass == ONE_PASS)
-    {
-      covariance_accumulator_to_matrix (cov);
-    }
-}
-
-struct design_matrix *
-covariance_to_design (const struct covariance_matrix *c)
-{
-  if (c != NULL)
-    {
-      return c->cov;
-    }
-  return NULL;
-}
-size_t
-covariance_matrix_get_n_rows (const struct covariance_matrix *c)
-{
-  return design_matrix_get_n_rows (c->cov);
-}
-
-double 
-covariance_matrix_get_element (const struct covariance_matrix *c, size_t row, size_t col)
-{
-  return (design_matrix_get_element (c->cov, row, col));
-}
-
diff --git a/src/math/covariance-matrix.h b/src/math/covariance-matrix.h
deleted file mode 100644 (file)
index c16e5cb..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-/* PSPP - a program for statistical analysis.
-   Copyright (C) 2008 Free Software Foundation, Inc.
-
-   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 3 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, see <http://www.gnu.org/licenses/>. */
-
-/*
-  Create covariance matrices for procedures that need them.
- */
-
-#ifndef COVARIANCE_MATRIX_H
-#define COVARIANCE_MATRIX_H
-
-#include <math/design-matrix.h>
-#include <math/interaction.h>
-
-struct moments1;
-struct ccase;
-struct hsh_table;
-struct covariance_matrix;
-enum
-{ ONE_PASS,
-  TWO_PASS
-};
-
-/*
-  How to deal with missing values.
- */
-enum
-{ LISTWISE,
-  PAIRWISE
-};
-struct design_matrix *covariance_matrix_create (size_t, const struct variable *[]);
-
-void covariance_matrix_destroy (struct covariance_matrix *);
-void covariance_pass_two (struct design_matrix *, double,
-                         double, double, const struct variable *,
-                         const struct variable *, const union value *,
-                         const union value *);
-void covariance_matrix_compute (struct covariance_matrix *);
-struct covariance_matrix *covariance_matrix_init (size_t,
-                                                 const struct variable *[],
-                                                 int, int, enum mv_class);
-void covariance_matrix_free (struct covariance_matrix *);
-void covariance_matrix_accumulate (struct covariance_matrix *,
-                                  const struct ccase *, void **, size_t);
-struct design_matrix *covariance_to_design (const struct covariance_matrix *);
-double covariance_matrix_get_element (const struct covariance_matrix *, size_t, size_t);
-void covariance_interaction_set (struct covariance_matrix *, 
-                                const struct interaction_variable **, size_t);
-#endif
index ba0de0b6968bcb560a4c738495c72f069899ba07..dc3166923d7ddff670d903274caef1dfe548beb4 100644 (file)
@@ -16,6 +16,7 @@
 
 #include <config.h>
 
+#include <libpspp/assertion.h>
 #include "covariance.h"
 #include <gl/xalloc.h>
 #include "moments.h"
 #include <data/case.h>
 #include <data/variable.h>
 #include <libpspp/misc.h>
+#include "categoricals.h"
 
 #define n_MOMENTS (MOMENT_VARIANCE + 1)
 
 
+/* Create a new matrix of NEW_SIZE x NEW_SIZE and copy the elements of
+   matrix IN into it.  IN must be a square matrix, and in normal usage
+   it will be smaller than NEW_SIZE.
+   IN is destroyed by this function.  The return value must be destroyed
+   when no longer required.
+*/
+static gsl_matrix *
+resize_matrix (gsl_matrix *in, size_t new_size)
+{
+  size_t i, j;
+
+  gsl_matrix *out = NULL;
+
+  assert (in->size1 == in->size2);
+
+  if (new_size <= in->size1)
+    return in;
+
+  out = gsl_matrix_calloc (new_size, new_size);
+
+  for (i = 0; i < in->size1; ++i)
+    {
+      for (j = 0; j < in->size2; ++j)
+       {
+         double x = gsl_matrix_get (in, i, j);
+
+         gsl_matrix_set (out, i, j, x);
+       }
+    }
+    
+  gsl_matrix_free (in);
+
+  return out;
+}
+
 struct covariance
 {
-  /* The variables for which the covariance matrix is to be calculated */
+  /* The variables for which the covariance matrix is to be calculated. */
   size_t n_vars;
   const struct variable **vars;
-  
+
+  /* Categorical variables. */
+  struct categoricals *categoricals;
+
+  /* Array containing number of categories per categorical variable. */
+  size_t *n_categories;
+
+  /* Dimension of the covariance matrix. */
+  size_t dim;
+
   /* The weight variable (or NULL if none) */
   const struct variable *wv;
 
@@ -46,6 +92,23 @@ struct covariance
      Only the top triangle is included, and no diagonals */
   double *cm;
   int n_cm;
+
+  /* 1 for single pass algorithm; 
+     2 for double pass algorithm
+  */
+  short passes;
+
+  /*
+    0 : No pass has  been made
+    1 : First pass has been started
+    2 : Second pass has been 
+    
+    IE: How many passes have been (partially) made. */
+  short state;
+
+  /* Flags indicating that the first case has been seen */
+  bool pass_one_first_case_seen;
+  bool pass_two_first_case_seen;
 };
 
 
@@ -65,20 +128,24 @@ covariance_moments (const struct covariance *cov, int m)
 
 
 
-/* Create a covariance struct */
+/* Create a covariance struct.
+ */
 struct covariance *
-covariance_create (size_t n_vars, const struct variable **vars,
-                  const struct variable *weight, enum mv_class exclude)
+covariance_1pass_create (size_t n_vars, const struct variable **vars,
+                        const struct variable *weight, enum mv_class exclude)
 {
   size_t i;
   struct covariance *cov = xmalloc (sizeof *cov);
-  cov->vars = xmalloc (sizeof *cov->vars * n_vars);
+
+  cov->passes = 1;
+  cov->state = 0;
+  cov->pass_one_first_case_seen = cov->pass_two_first_case_seen = false;
+  
+  cov->vars = vars;
 
   cov->wv = weight;
   cov->n_vars = n_vars;
-
-  for (i = 0; i < n_vars; ++i)
-    cov->vars[i] = vars[i];
+  cov->dim = n_vars;
 
   cov->moments = xmalloc (sizeof *cov->moments * n_MOMENTS);
   
@@ -90,6 +157,46 @@ covariance_create (size_t n_vars, const struct variable **vars,
   cov->n_cm = (n_vars * (n_vars - 1)  ) / 2;
 
   cov->cm = xcalloc (sizeof *cov->cm, cov->n_cm);
+  cov->categoricals = NULL;
+
+  return cov;
+}
+
+/*
+  Create a covariance struct for a two-pass algorithm. If categorical
+  variables are involed, the dimension cannot be know until after the
+  first data pass, so the actual covariances will not be allocated
+  until then.
+ */
+struct covariance *
+covariance_2pass_create (size_t n_vars, const struct variable **vars,
+                        size_t n_catvars, const struct variable **catvars, 
+                        const struct variable *wv, enum mv_class exclude)
+{
+  size_t i;
+  struct covariance *cov = xmalloc (sizeof *cov);
+
+  cov->passes = 2;
+  cov->state = 0;
+  cov->pass_one_first_case_seen = cov->pass_two_first_case_seen = false;
+  
+  cov->vars = vars;
+
+  cov->wv = wv;
+  cov->n_vars = n_vars;
+  cov->dim = n_vars;
+
+  cov->moments = xmalloc (sizeof *cov->moments * n_MOMENTS);
+  
+  for (i = 0; i < n_MOMENTS; ++i)
+    cov->moments[i] = gsl_matrix_calloc (n_vars, n_vars);
+
+  cov->exclude = exclude;
+
+  cov->n_cm = -1;
+  cov->cm = NULL;
+
+  cov->categoricals = categoricals_create (catvars, n_catvars, wv, exclude);
 
   return cov;
 }
@@ -104,16 +211,16 @@ static int
 cm_idx (const struct covariance *cov, int i, int j)
 {
   int as;
-  const int n2j = cov->n_vars - 2 - j;
-  const int nj = cov->n_vars - 2 ;
+  const int n2j = cov->dim - 2 - j;
+  const int nj = cov->dim - 2 ;
   
   assert (i >= 0);
-  assert (j < cov->n_vars);
+  assert (j < cov->dim);
 
   if ( i == 0)
     return -1;
 
-  if (j >= cov->n_vars - 1)
+  if (j >= cov->dim - 1)
     return -1;
 
   if ( i <= j) 
@@ -127,27 +234,239 @@ cm_idx (const struct covariance *cov, int i, int j)
 }
 
 
+/*
+  Returns true iff the variable corresponding to the Ith element of the covariance matrix 
+   has a missing value for case C
+*/
+static bool
+is_missing (const struct covariance *cov, int i, const struct ccase *c)
+{
+  const struct variable *var = i < cov->n_vars ?
+    cov->vars[i] : 
+    categoricals_get_variable_by_subscript (cov->categoricals, i - cov->n_vars);
+
+  const union value *val = case_data (c, var);
+
+  return var_is_value_missing (var, val, cov->exclude);
+}
+
+
+static double
+get_val (const struct covariance *cov, int i, const struct ccase *c)
+{
+  if ( i < cov->n_vars)
+    {
+      const struct variable *var = cov->vars[i];
+
+      const union value *val = case_data (c, var);
+
+      return val->f;
+    }
+
+  return categoricals_get_binary_by_subscript (cov->categoricals, i - cov->n_vars, c);
+}
+
+void
+dump_matrix (const gsl_matrix *m)
+{
+  size_t i, j;
+
+  for (i = 0 ; i < m->size1; ++i)
+    {
+      for (j = 0 ; j < m->size2; ++j)
+       printf ("%02f ", gsl_matrix_get (m, i, j));
+      printf ("\n");
+    }
+}
+
+/* Call this function for every case in the data set */
+void
+covariance_accumulate_pass1 (struct covariance *cov, const struct ccase *c)
+{
+  size_t i, j, m;
+  const double weight = cov->wv ? case_data (c, cov->wv)->f : 1.0;
+
+  assert (cov->passes == 2);
+  if (!cov->pass_one_first_case_seen)
+    {
+      assert (cov->state == 0);
+      cov->state = 1;
+    }
+
+  categoricals_update (cov->categoricals, c);
+
+  for (i = 0 ; i < cov->dim; ++i)
+    {
+      double v1 = get_val (cov, i, c);
+
+      if ( is_missing (cov, i, c))
+       continue;
+
+      for (j = 0 ; j < cov->dim; ++j)
+       {
+         double pwr = 1.0;
+
+         if ( is_missing (cov, j, c))
+           continue;
+
+         for (m = 0 ; m <= MOMENT_MEAN; ++m)
+           {
+             double *x = gsl_matrix_ptr (cov->moments[m], i, j);
+
+             *x += pwr * weight;
+             pwr *= v1;
+           }
+       }
+    }
+
+  cov->pass_one_first_case_seen = true;
+}
+
+
 /* Call this function for every case in the data set */
 void
+covariance_accumulate_pass2 (struct covariance *cov, const struct ccase *c)
+{
+  size_t i, j;
+  const double weight = cov->wv ? case_data (c, cov->wv)->f : 1.0;
+
+  assert (cov->passes == 2);
+  assert (cov->state >= 1);
+
+  if (! cov->pass_two_first_case_seen)
+    {
+      size_t m;
+      assert (cov->state == 1);
+      cov->state = 2;
+
+      cov->dim = cov->n_vars +
+       categoricals_total (cov->categoricals) - categoricals_get_n_variables (cov->categoricals);
+
+      cov->n_cm = (cov->dim * (cov->dim - 1)  ) / 2;
+      cov->cm = xcalloc (sizeof *cov->cm, cov->n_cm);
+
+      /* Grow the moment matrices so that they're large enough to accommodate the
+        categorical elements */
+      for (i = 0; i < n_MOMENTS; ++i)
+       {
+         cov->moments[i] = resize_matrix (cov->moments[i], cov->dim);
+       }
+
+      categoricals_done (cov->categoricals);
+
+      /* Populate the moments matrices with the categorical value elements */
+      for (i = cov->n_vars; i < cov->dim; ++i)
+       {
+         for (j = 0 ; j < cov->dim ; ++j) /* FIXME: This is WRONG !!! */
+           {
+             double w = categoricals_get_weight_by_subscript (cov->categoricals, i - cov->n_vars);
+
+             gsl_matrix_set (cov->moments[MOMENT_NONE], i, j, w);
+
+             w = categoricals_get_sum_by_subscript (cov->categoricals, i - cov->n_vars);
+
+             gsl_matrix_set (cov->moments[MOMENT_MEAN], i, j, w);
+           }
+       }
+
+      /* FIXME: This is WRONG!!  It must be fixed to properly handle missing values.  For
+       now it assumes there are none */
+      for (m = 0 ; m < n_MOMENTS; ++m)
+       {
+         for (i = 0 ; i < cov->dim ; ++i)
+           {
+             double x = gsl_matrix_get (cov->moments[m], i, cov->n_vars -1);
+             for (j = cov->n_vars; j < cov->dim; ++j)
+               {
+                 gsl_matrix_set (cov->moments[m], i, j, x);
+               }
+           }
+       }
+
+      /* Divide the means by the number of samples */
+      for (i = 0; i < cov->dim; ++i)
+       {
+         for (j = 0; j < cov->dim; ++j)
+           {
+             double *x = gsl_matrix_ptr (cov->moments[MOMENT_MEAN], i, j);
+             *x /= gsl_matrix_get (cov->moments[MOMENT_NONE], i, j);
+           }
+       }
+    }
+
+  for (i = 0 ; i < cov->dim; ++i)
+    {
+      double v1 = get_val (cov, i, c);
+
+      if ( is_missing (cov, i, c))
+       continue;
+
+      for (j = 0 ; j < cov->dim; ++j)
+       {
+         int idx;
+         double ss ;
+         double v2 = get_val (cov, j, c);
+
+         const double s = pow2 (v1 - gsl_matrix_get (cov->moments[MOMENT_MEAN], i, j)) * weight;
+
+         if ( is_missing (cov, j, c))
+           continue;
+
+         {
+           double *x = gsl_matrix_ptr (cov->moments[MOMENT_VARIANCE], i, j);
+           *x += s;
+         }
+
+         ss = 
+           (v1 - gsl_matrix_get (cov->moments[MOMENT_MEAN], i, j))
+           * 
+           (v2 - gsl_matrix_get (cov->moments[MOMENT_MEAN], i, j))
+           * weight
+           ;
+
+         idx = cm_idx (cov, i, j);
+         if (idx >= 0)
+           {
+             cov->cm [idx] += ss;
+           }
+       }
+    }
+
+  cov->pass_two_first_case_seen = true;
+}
+
+
+/* Call this function for every case in the data set.
+   After all cases have been passed, call covariance_calculate
+ */
+void
 covariance_accumulate (struct covariance *cov, const struct ccase *c)
 {
   size_t i, j, m;
   const double weight = cov->wv ? case_data (c, cov->wv)->f : 1.0;
 
-  for (i = 0 ; i < cov->n_vars; ++i)
+  assert (cov->passes == 1);
+
+  if ( !cov->pass_one_first_case_seen)
+    {
+      assert ( cov->state == 0);
+      cov->state = 1;
+    }
+
+  for (i = 0 ; i < cov->dim; ++i)
     {
       const union value *val1 = case_data (c, cov->vars[i]);
 
-      if ( var_is_value_missing (cov->vars[i], val1, cov->exclude))
+      if ( is_missing (cov, i, c))
        continue;
 
-      for (j = 0 ; j < cov->n_vars; ++j)
+      for (j = 0 ; j < cov->dim; ++j)
        {
          double pwr = 1.0;
          int idx;
          const union value *val2 = case_data (c, cov->vars[j]);
 
-         if ( var_is_value_missing (cov->vars[j], val2, cov->exclude))
+         if ( is_missing (cov, j, c))
            continue;
 
          idx = cm_idx (cov, i, j);
@@ -165,6 +484,8 @@ covariance_accumulate (struct covariance *cov, const struct ccase *c)
            }
        }
     }
+
+  cov->pass_one_first_case_seen = true;
 }
 
 
@@ -176,12 +497,12 @@ static gsl_matrix *
 cm_to_gsl (struct covariance *cov)
 {
   int i, j;
-  gsl_matrix *m = gsl_matrix_calloc (cov->n_vars, cov->n_vars);
+  gsl_matrix *m = gsl_matrix_calloc (cov->dim, cov->dim);
 
   /* Copy the non-diagonal elements from cov->cm */
-  for ( j = 0 ; j < cov->n_vars - 1; ++j)
+  for ( j = 0 ; j < cov->dim - 1; ++j)
     {
-      for (i = j+1 ; i < cov->n_vars; ++i)
+      for (i = j+1 ; i < cov->dim; ++i)
        {
          double x = cov->cm [cm_idx (cov, i, j)];
          gsl_matrix_set (m, i, j, x);
@@ -190,7 +511,7 @@ cm_to_gsl (struct covariance *cov)
     }
 
   /* Copy the diagonal elements from cov->moments[2] */
-  for (j = 0 ; j < cov->n_vars ; ++j)
+  for (j = 0 ; j < cov->dim ; ++j)
     {
       double sigma = gsl_matrix_get (cov->moments[2], j, j);
       gsl_matrix_set (m, j, j, sigma);
@@ -200,14 +521,32 @@ cm_to_gsl (struct covariance *cov)
 }
 
 
+static const gsl_matrix *
+covariance_calculate_double_pass (struct covariance *cov)
+{
+  size_t i, j;
+  for (i = 0 ; i < cov->dim; ++i)
+    {
+      for (j = 0 ; j < cov->dim; ++j)
+       {
+         int idx;
+         double *x = gsl_matrix_ptr (cov->moments[MOMENT_VARIANCE], i, j);
+         *x /= gsl_matrix_get (cov->moments[MOMENT_NONE], i, j);
 
-/* 
-   Return a pointer to gsl_matrix containing the pairwise covariances.
-   The matrix remains owned by the COV object, and must not be freed.
-   Call this function only after all data have been accumulated.
-*/
-const gsl_matrix *
-covariance_calculate (struct covariance *cov)
+         idx = cm_idx (cov, i, j);
+         if ( idx >= 0)
+           {
+             x = &cov->cm [idx];
+             *x /= gsl_matrix_get (cov->moments[MOMENT_NONE], i, j);
+           }
+       }
+    }
+
+  return  cm_to_gsl (cov);
+}
+
+static const gsl_matrix *
+covariance_calculate_single_pass (struct covariance *cov)
 {
   size_t i, j;
   size_t m;
@@ -217,9 +556,9 @@ covariance_calculate (struct covariance *cov)
       /* Divide the moments by the number of samples */
       if ( m > 0)
        {
-         for (i = 0 ; i < cov->n_vars; ++i)
+         for (i = 0 ; i < cov->dim; ++i)
            {
-             for (j = 0 ; j < cov->n_vars; ++j)
+             for (j = 0 ; j < cov->dim; ++j)
                {
                  double *x = gsl_matrix_ptr (cov->moments[m], i, j);
                  *x /= gsl_matrix_get (cov->moments[0], i, j);
@@ -232,9 +571,9 @@ covariance_calculate (struct covariance *cov)
     }
 
   /* Centre the moments */
-  for ( j = 0 ; j < cov->n_vars - 1; ++j)
+  for ( j = 0 ; j < cov->dim - 1; ++j)
     {
-      for (i = j + 1 ; i < cov->n_vars; ++i)
+      for (i = j + 1 ; i < cov->dim; ++i)
        {
          double *x = &cov->cm [cm_idx (cov, i, j)];
          
@@ -251,12 +590,119 @@ covariance_calculate (struct covariance *cov)
 }
 
 
+/* 
+   Return a pointer to gsl_matrix containing the pairwise covariances.
+   The matrix remains owned by the COV object, and must not be freed.
+   Call this function only after all data have been accumulated.
+*/
+const gsl_matrix *
+covariance_calculate (struct covariance *cov)
+{
+  assert ( cov->state > 0 );
+
+  switch (cov->passes)
+    {
+    case 1:
+      return covariance_calculate_single_pass (cov);  
+      break;
+    case 2:
+      return covariance_calculate_double_pass (cov);  
+      break;
+    default:
+      NOT_REACHED ();
+    }
+}
+
+/*
+  Covariance computed without dividing by the sample size.
+ */
+static const gsl_matrix *
+covariance_calculate_double_pass_unnormalized (struct covariance *cov)
+{
+  size_t i, j;
+  for (i = 0 ; i < cov->dim; ++i)
+    {
+      for (j = 0 ; j < cov->dim; ++j)
+       {
+         int idx;
+         double *x = gsl_matrix_ptr (cov->moments[MOMENT_VARIANCE], i, j);
+
+         idx = cm_idx (cov, i, j);
+         if ( idx >= 0)
+           {
+             x = &cov->cm [idx];
+           }
+       }
+    }
+
+  return  cm_to_gsl (cov);
+}
+
+static const gsl_matrix *
+covariance_calculate_single_pass_unnormalized (struct covariance *cov)
+{
+  size_t i, j;
+  size_t m;
+
+  for (i = 0 ; i < cov->dim; ++i)
+    {
+      for (j = 0 ; j < cov->dim; ++j)
+       {
+         double *x = gsl_matrix_ptr (cov->moments[MOMENT_VARIANCE], i, j);
+         *x -= pow2 (gsl_matrix_get (cov->moments[MOMENT_MEAN], i, j))
+           / gsl_matrix_get (cov->moments[MOMENT_NONE], i, j);
+       }
+    }
+  for ( j = 0 ; j < cov->dim - 1; ++j)
+    {
+      for (i = j + 1 ; i < cov->dim; ++i)
+       {
+         double *x = &cov->cm [cm_idx (cov, i, j)];
+         
+         *x -=
+           gsl_matrix_get (cov->moments[MOMENT_MEAN], i, j) 
+           *
+           gsl_matrix_get (cov->moments[MOMENT_MEAN], j, i) 
+         / gsl_matrix_get (cov->moments[MOMENT_NONE], i, j);
+       }
+    }
+
+  return cm_to_gsl (cov);
+}
+
+
+/* 
+   Return a pointer to gsl_matrix containing the pairwise covariances.
+   The matrix remains owned by the COV object, and must not be freed.
+   Call this function only after all data have been accumulated.
+*/
+const gsl_matrix *
+covariance_calculate_unnormalized (struct covariance *cov)
+{
+  assert ( cov->state > 0 );
+
+  switch (cov->passes)
+    {
+    case 1:
+      return covariance_calculate_single_pass_unnormalized (cov);  
+      break;
+    case 2:
+      return covariance_calculate_double_pass_unnormalized (cov);  
+      break;
+    default:
+      NOT_REACHED ();
+    }
+}
+
+
+
 /* Destroy the COV object */
 void
 covariance_destroy (struct covariance *cov)
 {
   size_t i;
-  free (cov->vars);
+
+  categoricals_destroy (cov->categoricals);
 
   for (i = 0; i < n_MOMENTS; ++i)
     gsl_matrix_free (cov->moments[i]);
index 8b8de88e9fa0b1ebfa277f9d25b41e6bf8e5ed0a..3d29dcea8b0193babed4238ef64a988b7fbb92a3 100644 (file)
@@ -27,12 +27,20 @@ struct covariance;
 struct variable;
 struct ccase ;
 
-struct covariance * covariance_create (size_t n_vars, const struct variable **vars, 
-                                      const struct variable *wv, enum mv_class excl);
+struct covariance * covariance_1pass_create (size_t n_vars, const struct variable **vars, 
+                                            const struct variable *wv, enum mv_class excl);
+
+struct covariance *
+covariance_2pass_create (size_t n_vars, const struct variable **vars,
+                        size_t n_catvars, const struct variable **catvars, 
+                        const struct variable *wv, enum mv_class excl);
 
 void covariance_accumulate (struct covariance *, const struct ccase *);
+void covariance_accumulate_pass1 (struct covariance *, const struct ccase *);
+void covariance_accumulate_pass2 (struct covariance *, const struct ccase *);
 
 const gsl_matrix * covariance_calculate (struct covariance *cov);
+const gsl_matrix * covariance_calculate_unnormalized (struct covariance *);
 
 void covariance_destroy (struct covariance *cov);
 
diff --git a/src/math/design-matrix.c b/src/math/design-matrix.c
deleted file mode 100644 (file)
index 8f125c5..0000000
+++ /dev/null
@@ -1,307 +0,0 @@
-/* PSPP - a program for statistical analysis.
-   Copyright (C) 2005 Free Software Foundation, Inc.
-
-   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 3 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, see <http://www.gnu.org/licenses/>. */
-
-/*
-  Create design matrices for procedures that need them.
-*/
-#include <config.h>
-
-#include "design-matrix.h"
-
-#include <assert.h>
-#include <math.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <libpspp/message.h>
-#include <data/variable.h>
-#include <data/category.h>
-#include <data/value.h>
-
-#include <gsl/gsl_machine.h>
-#include <gsl/gsl_vector.h>
-#include <gsl/gsl_matrix.h>
-
-#include "xalloc.h"
-
-#define DM_COLUMN_NOT_FOUND -1
-#define DM_INDEX_NOT_FOUND -3
-
-
-struct design_matrix *
-design_matrix_create (int n_variables,
-                     const struct variable *v_variables[],
-                     const size_t n_data)
-{
-  struct design_matrix *dm;
-  const struct variable *v;
-  size_t i;
-  size_t n_cols = 0;
-  size_t col;
-
-  dm = xmalloc (sizeof *dm);
-  dm->vars = xnmalloc (n_variables, sizeof *dm->vars);
-  dm->n_cases = xnmalloc (n_variables, sizeof (*dm->n_cases));
-  dm->n_vars = n_variables;
-
-  for (i = 0; i < n_variables; i++)
-    {
-      dm->n_cases[i] = 0;
-      v = v_variables[i];
-      assert ((dm->vars + i) != NULL);
-      (dm->vars + i)->v = v;   /* Allows us to look up the variable from
-                                  the design matrix. */
-      (dm->vars + i)->first_column = n_cols;
-      if (var_is_numeric (v))
-       {
-         (dm->vars + i)->last_column = n_cols;
-         n_cols++;
-       }
-      else if (var_is_alpha (v))
-       {
-         size_t n_categories = cat_get_n_categories (v);
-         (dm->vars + i)->last_column =
-           (dm->vars + i)->first_column + n_categories - 2;
-         n_cols += n_categories - 1;
-       }
-    }
-  dm->m = gsl_matrix_calloc (n_data, n_cols);
-  col = 0;
-
-  
-  return dm;
-}
-
-void
-design_matrix_destroy (struct design_matrix *dm)
-{
-  free (dm->vars);
-  gsl_matrix_free (dm->m);
-  free (dm->n_cases);
-  free (dm);
-}
-
-/*
-  Return the index of the variable for the
-  given column.
- */
-const struct variable *
-design_matrix_col_to_var (const struct design_matrix *dm, size_t col)
-{
-  size_t i;
-  struct design_matrix_var v;
-
-  for (i = 0; i < dm->n_vars; i++)
-    {
-      v = dm->vars[i];
-      if (v.first_column <= col && col <= v.last_column)
-       return v.v;
-    }
-  return NULL;
-}
-
-/*
-  Return the number of the first column which holds the
-  values for variable v.
- */
-size_t
-design_matrix_var_to_column (const struct design_matrix * dm,
-                            const struct variable * v)
-{
-  size_t i;
-  struct design_matrix_var tmp;
-
-  for (i = 0; i < dm->n_vars; i++)
-    {
-      tmp = dm->vars[i];
-      if (tmp.v == v)
-       {
-         return tmp.first_column;
-       }
-    }
-  return DM_COLUMN_NOT_FOUND;
-}
-
-/* Last column. */
-static size_t
-dm_var_to_last_column (const struct design_matrix *dm,
-                      const struct variable *v)
-{
-  size_t i;
-  struct design_matrix_var tmp;
-
-  for (i = 0; i < dm->n_vars; i++)
-    {
-      tmp = dm->vars[i];
-      if (tmp.v == v)
-       {
-         return tmp.last_column;
-       }
-    }
-  return DM_COLUMN_NOT_FOUND;
-}
-
-/*
-  Set the appropriate value in the design matrix,
-  whether that value is from a categorical or numeric
-  variable. For a categorical variable, only the usual
-  binary encoding is allowed.
- */
-void
-design_matrix_set_categorical (struct design_matrix *dm, size_t row,
-                              const struct variable *var,
-                              const union value *val)
-{
-  size_t col;
-  size_t is_one;
-  size_t fc;
-  size_t lc;
-  double entry;
-
-  assert (var_is_alpha (var));
-  fc = design_matrix_var_to_column (dm, var);
-  lc = dm_var_to_last_column (dm, var);
-  assert (lc != DM_COLUMN_NOT_FOUND);
-  assert (fc != DM_COLUMN_NOT_FOUND);
-  is_one = fc + cat_value_find (var, val);
-  for (col = fc; col <= lc; col++)
-    {
-      entry = (col == is_one) ? 1.0 : 0.0;
-      gsl_matrix_set (dm->m, row, col, entry);
-    }
-}
-
-void
-design_matrix_set_numeric (struct design_matrix *dm, size_t row,
-                          const struct variable *var, const union value *val)
-{
-  size_t col;
-
-  assert (var_is_numeric (var));
-  col = design_matrix_var_to_column ((const struct design_matrix *) dm, var);
-  assert (col != DM_COLUMN_NOT_FOUND);
-  gsl_matrix_set (dm->m, row, col, val->f);
-}
-
-struct design_matrix *
-design_matrix_clone (const struct design_matrix *dm)
-{
-  struct design_matrix *result;
-  size_t i;
-  
-  assert (dm != NULL);
-  result = xmalloc (sizeof *result);
-  result->vars = xnmalloc (dm->n_vars, sizeof *dm->vars);
-  result->n_vars = dm->n_vars;
-  result->m = gsl_matrix_alloc (dm->m->size1, dm->m->size2);
-  
-  gsl_matrix_memcpy (result->m, dm->m);
-  for (i = 0; i < result->n_vars; i++)
-    {
-      result->vars[i] = dm->vars[i];
-    }
-  return result;
-}
-
-/*
-  Increment the number of cases for V.
- */
-void 
-design_matrix_increment_case_count (struct design_matrix *dm, const struct variable *v)
-{
-  size_t i;
-  assert (dm != NULL);
-  assert (dm->n_cases != NULL);
-  assert (v != NULL);
-  i = design_matrix_var_to_column (dm, v);
-  dm->n_cases[i]++;
-}
-
-/*
-  Set the number of cases for V.
- */
-void 
-design_matrix_set_case_count (struct design_matrix *dm, const struct variable *v, size_t n)
-{
-  size_t i;
-  assert (dm != NULL);
-  assert (dm->n_cases != NULL);
-  assert (v != NULL);
-  i = design_matrix_var_to_column (dm, v);
-  dm->n_cases[i] = n;
-}
-
-/*
-  Get the number of cases for V.
- */
-size_t 
-design_matrix_get_case_count (const struct design_matrix *dm, const struct variable *v)
-{
-  size_t i;
-  assert (dm != NULL);
-  assert (dm->n_cases != NULL);
-  assert (v != NULL);
-  i = design_matrix_var_to_column (dm, v);
-  return dm->n_cases[i];
-}
-
-size_t
-design_matrix_get_n_cols (const struct design_matrix *d)
-{
-  return d->m->size2;
-}
-
-size_t
-design_matrix_get_n_rows (const struct design_matrix *d)
-{
-  return d->m->size1;
-}
-
-double
-design_matrix_get_element (const struct design_matrix *d, size_t row, size_t col)
-{
-  return (gsl_matrix_get (d->m, row, col));
-}
-
-void
-design_matrix_set_element (const struct design_matrix *d, size_t row, size_t col, double x)
-{
-  gsl_matrix_set (d->m, row, col, x);
-}
-
-/*
-  Return the subscript of the column of the design matrix
-  corresponding to VAL. If VAR is categorical with d categories, its
-  first category should correspond to the origin in d-dimensional
-  Euclidean space, so there is no subscript for this value.
- */
-size_t
-dm_get_exact_subscript (const struct design_matrix *dm, const struct variable *var,
-                    const union value *val)
-{
-  size_t result;
-
-  result = design_matrix_var_to_column (dm, var);
-  if (var_is_alpha (var))
-    {
-      if (cat_is_origin (var, val))
-       {
-         return -1u;
-       }
-      result += cat_value_find (var, val) - 1;
-    }
-  return result;
-}
diff --git a/src/math/design-matrix.h b/src/math/design-matrix.h
deleted file mode 100644 (file)
index b1cda5a..0000000
+++ /dev/null
@@ -1,100 +0,0 @@
-/* PSPP - a program for statistical analysis.
-   Copyright (C) 2005 Free Software Foundation, Inc.
-
-   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 3 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, see <http://www.gnu.org/licenses/>. */
-
-/*
-  Create design matrices for procedures that need them.
- */
-
-#ifndef DESIGN_MATRIX_H
-#define DESIGN_MATRIX_H
-
-#include <gsl/gsl_matrix.h>
-#include <stdbool.h>
-#include <data/category.h>
-
-struct design_matrix_var
-{
-  size_t first_column;         /* First column for this variable in
-                                  the design_matix. If this variable
-                                  is categorical, its values are
-                                  stored in multiple, contiguous
-                                  columns, as dictated by its vector
-                                  encoding in the variable's struct
-                                  cat_vals.
-                                */
-  size_t last_column;
-  const struct variable *v;
-};
-
-struct design_matrix
-{
-  gsl_matrix *m;
-  struct design_matrix_var *vars;      /* Element i corresponds to
-                                          the variable whose values
-                                          are stored in at least one
-                                          column of m. If that
-                                          variable is categorical
-                                          with more than two
-                                          categories, its values are
-                                          stored in multiple,
-                                          contiguous columns. The
-                                          variable's values are then
-                                          stored in the columns
-                                          first_column through
-                                          last_column of the
-                                          design_matrix_var
-                                          structure.
-                                        */
-  size_t *n_cases; /* Element i is the number of valid cases for this
-                     variable.
-                   */
-  size_t n_vars;
-};
-
-
-struct design_matrix *design_matrix_create (int, const struct variable *[],
-                                           const size_t);
-
-void design_matrix_destroy (struct design_matrix *);
-
-void design_matrix_set_categorical (struct design_matrix *, size_t,
-                                   const struct variable *,
-                                   const union value *);
-
-void design_matrix_set_numeric (struct design_matrix *, size_t,
-                                   const struct variable *,
-                                   const union value *);
-
-struct design_matrix *design_matrix_clone (const struct design_matrix *);
-
-size_t design_matrix_var_to_column (const struct design_matrix *,
-                                   const struct variable *);
-
-const struct variable *design_matrix_col_to_var (const struct design_matrix *,
-                                          size_t);
-void design_matrix_increment_case_count (struct design_matrix *, const struct variable *);
-
-void design_matrix_set_case_count (struct design_matrix *, const struct variable *, size_t);
-
-size_t design_matrix_get_case_count (const struct design_matrix *, const struct variable *);
-size_t design_matrix_get_n_cols (const struct design_matrix *);
-size_t design_matrix_get_n_rows (const struct design_matrix *);
-double design_matrix_get_element (const struct design_matrix *, size_t, size_t);
-void design_matrix_set_element (const struct design_matrix *, size_t, size_t, double);
-size_t dm_get_exact_subscript (const struct design_matrix *, const struct variable *,
-                                  const union value *);
-
-#endif
index c03af4672955f4dd20514291faf8cf06bebb49e5..462a07852fe7fc04cb275f8298874fc0b0055fc2 100644 (file)
 #include <gsl/gsl_cblas.h>
 #include <gsl/gsl_errno.h>
 #include <gsl/gsl_fit.h>
+#include <gsl/gsl_linalg.h>
 #include <gsl/gsl_multifit.h>
 #include <linreg/sweep.h>
-#include <math/coefficient.h>
 #include <math/linreg.h>
-#include <math/coefficient.h>
-#include <math/design-matrix.h>
-#include <src/data/category.h>
 #include <src/data/variable.h>
 #include <src/data/value.h>
 #include <gl/xalloc.h>
 */
 
 
-/*
-  Get the mean and standard deviation of a vector
-  of doubles via a form of the Kalman filter as
-  described on page 32 of [3].
- */
-static int
-linreg_mean_std (gsl_vector_const_view v, double *mp, double *sp, double *ssp)
+const struct variable **
+linreg_get_vars (const linreg *c)
 {
-  size_t i;
-  double j = 0.0;
-  double d;
-  double tmp;
-  double mean;
-  double variance;
-
-  mean = gsl_vector_get (&v.vector, 0);
-  variance = 0;
-  for (i = 1; i < v.vector.size; i++)
-    {
-      j = (double) i + 1.0;
-      tmp = gsl_vector_get (&v.vector, i);
-      d = (tmp - mean) / j;
-      mean += d;
-      variance += j * (j - 1.0) * d * d;
-    }
-  *mp = mean;
-  *sp = sqrt (variance / (j - 1.0));
-  *ssp = variance;
-
-  return GSL_SUCCESS;
+  return c->indep_vars;
 }
 
 /*
-  Set V to contain an array of pointers to the variables
-  used in the model. V must be at least C->N_COEFFS in length.
-  The return value is the number of distinct variables found.
+  Allocate a linreg and return a pointer to it. n is the number of
+  cases, p is the number of independent variables.
  */
-int
-pspp_linreg_get_vars (const void *c_, const struct variable **v)
-{
-  const pspp_linreg_cache *c = c_;
-  const struct variable *tmp;
-  int i;
-  int j;
-  int result = 0;
-
-  /*
-     Make sure the caller doesn't try to sneak a variable
-     into V that is not in the model.
-   */
-  for (i = 0; i < c->n_coeffs; i++)
-    {
-      v[i] = NULL;
-    }
-  for (j = 0; j < c->n_coeffs; j++)
-    {
-      tmp = pspp_coeff_get_var (c->coeff[j], 0);
-      assert (tmp != NULL);
-      /* Repeated variables are likely to bunch together, at the end
-         of the array. */
-      i = result - 1;
-      while (i >= 0 && v[i] != tmp)
-       {
-         i--;
-       }
-      if (i < 0 && result < c->n_coeffs)
-       {
-         v[result] = tmp;
-         result++;
-       }
-    }
-  return result;
-}
-
-/*
-  Allocate a pspp_linreg_cache and return a pointer
-  to it. n is the number of cases, p is the number of
-  independent variables.
- */
-pspp_linreg_cache *
-pspp_linreg_cache_alloc (const struct variable *depvar, const struct variable **indep_vars,
-                        size_t n, size_t p)
+linreg *
+linreg_alloc (const struct variable *depvar, const struct variable **indep_vars,
+             double n, size_t p)
 {
+  linreg *c;
   size_t i;
-  pspp_linreg_cache *c;
 
-  c = (pspp_linreg_cache *) malloc (sizeof (pspp_linreg_cache));
+  c = xmalloc (sizeof (*c));
   c->depvar = depvar;
-  c->indep_vars = indep_vars;
+  c->indep_vars = xnmalloc (p, sizeof (*indep_vars));
+  for (i = 0; i < p; i++)
+    {
+      c->indep_vars[i] = indep_vars[i];
+    }
   c->indep_means = gsl_vector_alloc (p);
   c->indep_std = gsl_vector_alloc (p);
-  c->ssx = gsl_vector_alloc (p);       /* Sums of squares for the
-                                          independent variables.
-                                        */
+
   c->ss_indeps = gsl_vector_alloc (p); /* Sums of squares for the
                                           model parameters.
                                         */
   c->n_obs = n;
   c->n_indeps = p;
-  c->n_coeffs = 0;
-  for (i = 0; i < p; i++)
-    {
-      if (var_is_numeric (indep_vars[i]))
-       {
-         c->n_coeffs++;
-       }
-      else
-       {
-         c->n_coeffs += cat_get_n_categories (indep_vars[i]) - 1;
-       }
-    }
-
-  c->cov = gsl_matrix_alloc (c->n_coeffs + 1, c->n_coeffs + 1);
+  c->n_coeffs = p;
+  c->coeff = xnmalloc (p, sizeof (*c->coeff));
+  c->cov = gsl_matrix_calloc (c->n_coeffs + 1, c->n_coeffs + 1);
+  c->dft = n - 1;
+  c->dfm = p;
+  c->dfe = c->dft - c->dfm;
+  c->intercept = 0.0;
+  c->depvar_mean = 0.0;
+  c->depvar_std = 0.0;
   /*
      Default settings.
    */
-  c->method = PSPP_LINREG_SWEEP;
-  c->predict = pspp_linreg_predict;
-  c->residual = pspp_linreg_residual;  /* The procedure to compute my
-                                          residuals. */
-  c->get_vars = pspp_linreg_get_vars;  /* The procedure that returns
-                                          pointers to model
-                                          variables. */
-  c->resid = NULL;             /* The variable storing my residuals. */
-  c->pred = NULL;              /* The variable storing my predicted values. */
+  c->method = LINREG_SWEEP;
+  c->pred = NULL;
+  c->resid = NULL;
 
   return c;
 }
 
 bool
-pspp_linreg_cache_free (void *m)
+linreg_free (void *m)
 {
-  int i;
-
-  pspp_linreg_cache *c = m;
+  linreg *c = m;
   if (c != NULL)
     {
       gsl_vector_free (c->indep_means);
       gsl_vector_free (c->indep_std);
-      gsl_vector_free (c->ss_indeps);
       gsl_matrix_free (c->cov);
-      gsl_vector_free (c->ssx);
-      for (i = 0; i < c->n_coeffs; i++)
-       {
-         pspp_coeff_free (c->coeff[i]);
-       }
+      free (c->indep_vars);
       free (c->coeff);
       free (c);
     }
   return true;
 }
-static void
-cache_init (pspp_linreg_cache *cache)
-{
-  assert (cache != NULL);
-  cache->dft = cache->n_obs - 1;
-  cache->dfm = cache->n_indeps;
-  cache->dfe = cache->dft - cache->dfm;
-  cache->intercept = 0.0;
-}
 
 static void
-post_sweep_computations (pspp_linreg_cache *cache, const struct design_matrix *dm,
-                        gsl_matrix *sw)
+post_sweep_computations (linreg *l, gsl_matrix *sw)
 {
   gsl_matrix *xm;
   gsl_matrix_view xtx;
@@ -232,19 +134,19 @@ post_sweep_computations (pspp_linreg_cache *cache, const struct design_matrix *d
   int rc;
   
   assert (sw != NULL);
-  assert (cache != NULL);
+  assert (l != NULL);
 
-  cache->sse = gsl_matrix_get (sw, cache->n_indeps, cache->n_indeps);
-  cache->mse = cache->sse / cache->dfe;
+  l->sse = gsl_matrix_get (sw, l->n_indeps, l->n_indeps);
+  l->mse = l->sse / l->dfe;
   /*
     Get the intercept.
   */
-  m = cache->depvar_mean;
-  for (i = 0; i < cache->n_indeps; i++)
+  m = l->depvar_mean;
+  for (i = 0; i < l->n_indeps; i++)
     {
-      tmp = gsl_matrix_get (sw, i, cache->n_indeps);
-      cache->coeff[i]->estimate = tmp;
-      m -= tmp * pspp_linreg_get_indep_variable_mean (cache, design_matrix_col_to_var (dm, i));
+      tmp = gsl_matrix_get (sw, i, l->n_indeps);
+      l->coeff[i] = tmp;
+      m -= tmp * linreg_get_indep_variable_mean (l, i);
     }
   /*
     Get the covariance matrix of the parameter estimates.
@@ -255,37 +157,37 @@ post_sweep_computations (pspp_linreg_cache *cache, const struct design_matrix *d
     The loops below do not compute the entries related
     to the estimated intercept.
   */
-  for (i = 0; i < cache->n_indeps; i++)
-    for (j = i; j < cache->n_indeps; j++)
+  for (i = 0; i < l->n_indeps; i++)
+    for (j = i; j < l->n_indeps; j++)
       {
-       tmp = -1.0 * cache->mse * gsl_matrix_get (sw, i, j);
-       gsl_matrix_set (cache->cov, i + 1, j + 1, tmp);
+       tmp = -1.0 * l->mse * gsl_matrix_get (sw, i, j);
+       gsl_matrix_set (l->cov, i + 1, j + 1, tmp);
       }
   /*
     Get the covariances related to the intercept.
   */
-  xtx = gsl_matrix_submatrix (sw, 0, 0, cache->n_indeps, cache->n_indeps);
-  xmxtx = gsl_matrix_submatrix (cache->cov, 0, 1, 1, cache->n_indeps);
-  xm = gsl_matrix_calloc (1, cache->n_indeps);
+  xtx = gsl_matrix_submatrix (sw, 0, 0, l->n_indeps, l->n_indeps);
+  xmxtx = gsl_matrix_submatrix (l->cov, 0, 1, 1, l->n_indeps);
+  xm = gsl_matrix_calloc (1, l->n_indeps);
   for (i = 0; i < xm->size2; i++)
     {
       gsl_matrix_set (xm, 0, i, 
-                     pspp_linreg_get_indep_variable_mean (cache, design_matrix_col_to_var (dm, i)));
+                     linreg_get_indep_variable_mean (l, i));
     }
-  rc = gsl_blas_dsymm (CblasRight, CblasUpper, cache->mse,
+  rc = gsl_blas_dsymm (CblasRight, CblasUpper, l->mse,
                       &xtx.matrix, xm, 0.0, &xmxtx.matrix);
   gsl_matrix_free (xm);
   if (rc == GSL_SUCCESS)
     {
-      tmp = cache->mse / cache->n_obs;
-      for (i = 1; i < 1 + cache->n_indeps; i++)
+      tmp = l->mse / l->n_obs;
+      for (i = 1; i < 1 + l->n_indeps; i++)
        {
-         tmp -= gsl_matrix_get (cache->cov, 0, i)
-           * pspp_linreg_get_indep_variable_mean (cache, design_matrix_col_to_var (dm, i - 1));
+         tmp -= gsl_matrix_get (l->cov, 0, i)
+           * linreg_get_indep_variable_mean (l, i - 1);
        }
-      gsl_matrix_set (cache->cov, 0, 0, tmp);
+      gsl_matrix_set (l->cov, 0, 0, tmp);
       
-      cache->intercept = m;
+      l->intercept = m;
     }
   else
     {
@@ -294,454 +196,295 @@ post_sweep_computations (pspp_linreg_cache *cache, const struct design_matrix *d
       exit (rc);
     }
 }  
-  
+
 /*
-  Fit the linear model via least squares. All pointers passed to pspp_linreg
-  are assumed to be allocated to the correct size and initialized to the
-  values as indicated by opts.
+  Predict the value of the dependent variable with the new set of
+  predictors. VALS are assumed to be in the order corresponding to the
+  order of the coefficients in the linreg struct.
  */
-int
-pspp_linreg (const gsl_vector * Y, const struct design_matrix *dm,
-            const pspp_linreg_opts * opts, pspp_linreg_cache * cache)
+double
+linreg_predict (const linreg *c, const double *vals, size_t n_vals)
 {
-  int rc;
-  gsl_matrix *design = NULL;
-  gsl_matrix_view xtx;
-  gsl_vector_view xty;
-  gsl_vector_view xi;
-  gsl_vector_view xj;
-  gsl_vector *param_estimates;
-  struct pspp_coeff *coef;
-  const struct variable *v;
-  const union value *val;
-
-  size_t i;
   size_t j;
-  double tmp;
-  double m;
-  double s;
-  double ss;
+  double result;
 
-  if (cache == NULL)
+  assert (n_vals = c->n_coeffs);
+  if (vals == NULL || c == NULL)
     {
-      return GSL_EFAULT;
+      return GSL_NAN;
     }
-  if (opts->get_depvar_mean_std)
+  if (c->coeff == NULL)
     {
-      linreg_mean_std (gsl_vector_const_subvector (Y, 0, Y->size),
-                      &m, &s, &ss);
-      cache->depvar_mean = m;
-      cache->depvar_std = s;
-      cache->sst = ss;
+      /* The stupid model: just guess the mean. */
+      return c->depvar_mean;
     }
-  cache_init (cache);
-  cache->n_coeffs = dm->m->size2;
-  for (i = 0; i < dm->m->size2; i++)
-    {
-      if (opts->get_indep_mean_std[i])
-       {
-         linreg_mean_std (gsl_matrix_const_column (dm->m, i), &m, &s, &ss);
-         v = design_matrix_col_to_var (dm, i);
-         val = NULL;
-         if (var_is_alpha (v))
-           {
-             j = i - design_matrix_var_to_column (dm, v);
-             val = cat_subscript_to_value (j, v);
-           }
-         coef = pspp_linreg_get_coeff (cache, v, val);
-         pspp_coeff_set_mean (coef, m);
-         pspp_coeff_set_sd (coef, s);
-         gsl_vector_set (cache->ssx, i, ss);
+  result = c->intercept;
 
-       }
+  for (j = 0; j < n_vals; j++)
+    {
+      result += linreg_coeff (c, j) * vals[j];
     }
 
-  if (cache->method == PSPP_LINREG_SWEEP)
+  return result;
+}
+
+double
+linreg_residual (const linreg *c, double obs, const double *vals, size_t n_vals)
+{
+  if (vals == NULL || c == NULL)
     {
-      gsl_matrix *sw;
-      /*
-         Subtract the means to improve the condition of the design
-         matrix. This requires copying dm->m and Y. We do not divide by the
-         standard deviations of the independent variables here since doing
-         so would cause a miscalculation of the residual sums of
-         squares. Dividing by the standard deviation is done GSL's linear
-         regression functions, so if the design matrix has a poor
-         condition, use QR decomposition.
-
-         The design matrix here does not include a column for the intercept
-         (i.e., a column of 1's). If using PSPP_LINREG_QR, we need that column,
-         so design is allocated here when sweeping, or below if using QR.
-       */
-      design = gsl_matrix_alloc (dm->m->size1, dm->m->size2);
-      for (i = 0; i < dm->m->size2; i++)
-       {
-         v = design_matrix_col_to_var (dm, i);
-         m = pspp_linreg_get_indep_variable_mean (cache, v);
-         for (j = 0; j < dm->m->size1; j++)
-           {
-             tmp = (gsl_matrix_get (dm->m, j, i) - m);
-             gsl_matrix_set (design, j, i, tmp);
-           }
-       }
-      sw = gsl_matrix_calloc (cache->n_coeffs + 1, cache->n_coeffs + 1);
-      xtx = gsl_matrix_submatrix (sw, 0, 0, cache->n_coeffs, cache->n_coeffs);
+      return GSL_NAN;
+    }
+  return (obs - linreg_predict (c, vals, n_vals));
+}
 
-      for (i = 0; i < xtx.matrix.size1; i++)
-       {
-         tmp = gsl_vector_get (cache->ssx, i);
-         gsl_matrix_set (&(xtx.matrix), i, i, tmp);
-         xi = gsl_matrix_column (design, i);
-         for (j = (i + 1); j < xtx.matrix.size2; j++)
-           {
-             xj = gsl_matrix_column (design, j);
-             gsl_blas_ddot (&(xi.vector), &(xj.vector), &tmp);
-             gsl_matrix_set (&(xtx.matrix), i, j, tmp);
-           }
-       }
+double linreg_get_indep_variable_sd (linreg *c, size_t j)
+{
+  assert (c != NULL);
+  return gsl_vector_get (c->indep_std, j);
+}
 
-      gsl_matrix_set (sw, cache->n_coeffs, cache->n_coeffs, cache->sst);
-      xty = gsl_matrix_column (sw, cache->n_coeffs);
-      /*
-         This loop starts at 1, with i=0 outside the loop, so we can get
-         the model sum of squares due to the first independent variable.
-       */
-      xi = gsl_matrix_column (design, 0);
-      gsl_blas_ddot (&(xi.vector), Y, &tmp);
-      gsl_vector_set (&(xty.vector), 0, tmp);
-      tmp *= tmp / gsl_vector_get (cache->ssx, 0);
-      gsl_vector_set (cache->ss_indeps, 0, tmp);
-      for (i = 1; i < cache->n_coeffs; i++)
-       {
-         xi = gsl_matrix_column (design, i);
-         gsl_blas_ddot (&(xi.vector), Y, &tmp);
-         gsl_vector_set (&(xty.vector), i, tmp);
-       }
+void linreg_set_indep_variable_sd (linreg *c, size_t j, double s)
+{
+  assert (c != NULL);
+  gsl_vector_set (c->indep_std, j, s);
+}
 
-      /*
-         Sweep on the matrix sw, which contains XtX, XtY and YtY.
-       */
-      reg_sweep (sw);
-      post_sweep_computations (cache, dm, sw);
-      gsl_matrix_free (sw);
-    }
-  else if (cache->method == PSPP_LINREG_CONDITIONAL_INVERSE)
+/*
+  Mean of the independent variable.
+ */
+double linreg_get_indep_variable_mean (linreg *c, size_t j)
+{
+  assert (c != NULL);
+  return gsl_vector_get (c->indep_means, j);
+}
+
+void linreg_set_indep_variable_mean (linreg *c, size_t j, double m)
+{
+  assert (c != NULL);
+  gsl_vector_set (c->indep_means, j, m);
+}
+static void invert_r (gsl_matrix *r, gsl_matrix *r_inv)
+{
+  size_t i;
+  size_t j;
+  size_t k;
+  size_t row;
+  double tmp;
+
+  for (i = 0; i < r->size1; i++)
     {
-      /*
-       Use the SVD of X^T X to find a conditional inverse of X^TX. If
-       the SVD is X^T X = U D V^T, then set the conditional inverse
-       to (X^T X)^c = V D^- U^T. D^- is defined as follows: If entry
-       (i, i) has value sigma_i, then entry (i, i) of D^- is 1 /
-       sigma_i if sigma_i > 0, and 0 otherwise. Then solve the normal
-       equations by setting the estimated parameter vector to 
-       (X^TX)^c X^T Y.
-       */
+      gsl_matrix_set (r_inv, i, i, 1.0 / gsl_matrix_get (r, i, i));
     }
-  else
+  for (i = 0; i < r->size1; i++)
     {
-      gsl_multifit_linear_workspace *wk;
-      /*
-         Use QR decomposition via GSL.
-       */
-
-      param_estimates = gsl_vector_alloc (1 + dm->m->size2);
-      design = gsl_matrix_alloc (dm->m->size1, 1 + dm->m->size2);
-
-      for (j = 0; j < dm->m->size1; j++)
+      row = 0;
+      for (j = row + 1 + i; j < r->size2; j++)
        {
-         gsl_matrix_set (design, j, 0, 1.0);
-         for (i = 0; i < dm->m->size2; i++)
+         tmp = 0.0;
+         for (k = 1; k <= j - row; k++)
            {
-             tmp = gsl_matrix_get (dm->m, j, i);
-             gsl_matrix_set (design, j, i + 1, tmp);
+             tmp += gsl_matrix_get (r, row, row + k) 
+               * gsl_matrix_get (r_inv, row + k, j);
            }
-       }
-
-      wk = gsl_multifit_linear_alloc (design->size1, design->size2);
-      rc = gsl_multifit_linear (design, Y, param_estimates,
-                               cache->cov, &(cache->sse), wk);
-      for (i = 0; i < cache->n_coeffs; i++)
-       {
-         cache->coeff[i]->estimate = gsl_vector_get (param_estimates, i + 1);
-       }
-      cache->intercept = gsl_vector_get (param_estimates, 0);
-      if (rc == GSL_SUCCESS)
-       {
-         gsl_multifit_linear_free (wk);
-         gsl_vector_free (param_estimates);
-       }
-      else
-       {
-         fprintf (stderr, "%s:%d: gsl_multifit_linear returned %d\n",
-                  __FILE__, __LINE__, rc);
+         gsl_matrix_set (r_inv, row, j, -tmp / gsl_matrix_get (r, row, row));
+         row++;
        }
     }
-
-
-  cache->ssm = cache->sst - cache->sse;
-  /*
-     Get the remaining sums of squares for the independent
-     variables.
-   */
-  m = 0;
-  for (i = 1; i < cache->n_indeps; i++)
-    {
-      j = i - 1;
-      m += gsl_vector_get (cache->ss_indeps, j);
-      tmp = cache->ssm - m;
-      gsl_vector_set (cache->ss_indeps, i, tmp);
-    }
-
-  gsl_matrix_free (design);
-  return GSL_SUCCESS;
 }
 
-/*
-  Is the coefficient COEF contained in the list of coefficients
-  COEF_LIST?
- */
-static int
-has_coefficient (const struct pspp_coeff **coef_list, const struct pspp_coeff *coef,
-                size_t n)
+static void
+linreg_fit_qr (const gsl_matrix *cov, linreg *l)
 {
-  size_t i = 0;
+  gsl_matrix *xtx;
+  gsl_matrix *q;
+  gsl_matrix *r;
+  gsl_vector *xty;
+  gsl_vector *tau;
+  gsl_vector *params;
+  double tmp = 0.0;
+  size_t i;
+  size_t j;
+
+  xtx = gsl_matrix_alloc (cov->size1 - 1, cov->size2 - 1);
+  xty = gsl_vector_alloc (cov->size1 - 1);
+  tau = gsl_vector_alloc (cov->size1 - 1);
+  params = gsl_vector_alloc (cov->size1 - 1);
 
-  while (i < n)
+  for (i = 0; i < xtx->size1; i++)
     {
-      if (coef_list[i] == coef)
+      gsl_vector_set (xty, i, gsl_matrix_get (cov, cov->size2 - 1, i));
+      for (j = 0; j < xtx->size2; j++)
        {
-         return 1;
+         gsl_matrix_set (xtx, i, j, gsl_matrix_get (cov, i, j));
        }
-      i++;
     }
-  return 0;
-}
-/*
-  Predict the value of the dependent variable with the
-  new set of predictors. PREDICTORS must point to a list
-  of variables, each of whose values are stored in VALS,
-  in the same order.
- */
-double
-pspp_linreg_predict (const struct variable **predictors,
-                    const union value **vals, const void *c_, int n_vals)
-{
-  const pspp_linreg_cache *c = c_;
-  int j;
-  size_t next_coef = 0;
-  const struct pspp_coeff **coef_list;
-  const struct pspp_coeff *coe;
-  double result;
-  double tmp;
+  gsl_linalg_QR_decomp (xtx, tau);
+  q = gsl_matrix_alloc (xtx->size1, xtx->size2);
+  r = gsl_matrix_alloc (xtx->size1, xtx->size2);
 
-  if (predictors == NULL || vals == NULL || c == NULL)
+  gsl_linalg_QR_unpack (xtx, tau, q, r);
+  gsl_linalg_QR_solve (xtx, tau, xty, params);
+  for (i = 0; i < params->size; i++)
     {
-      return GSL_NAN;
+      l->coeff[i] = gsl_vector_get (params, i);
     }
-  if (c->coeff == NULL)
+  l->sst = gsl_matrix_get (cov, cov->size1 - 1, cov->size2 - 1);
+  l->ssm = 0.0;
+  for (i = 0; i < l->n_indeps; i++)
     {
-      /* The stupid model: just guess the mean. */
-      return c->depvar_mean;
+      l->ssm += gsl_vector_get (xty, i) * l->coeff[i];
     }
-  coef_list = xnmalloc (c->n_coeffs, sizeof (*coef_list));
-  result = c->intercept;
+  l->sse = l->sst - l->ssm;
 
-  /*
-     The loops guard against the possibility that the caller passed us
-     inadequate information, such as too few or too many values, or
-     a redundant list of variable names.
-   */
-  for (j = 0; j < n_vals; j++)
+  gsl_blas_dtrsm (CblasLeft, CblasLower, CblasNoTrans, CblasNonUnit, linreg_mse (l),
+                 r, q);
+  /* Copy the lower triangle into the upper triangle. */
+  double intercept_variance = 0.0;
+  for (i = 0; i < q->size1; i++)
     {
-      coe = pspp_linreg_get_coeff (c, predictors[j], vals[j]);
-      if (!has_coefficient (coef_list, coe, next_coef))
+      gsl_matrix_set (l->cov, i + 1, i + 1, gsl_matrix_get (q, i, i));
+      for (j = i + 1; j < q->size2; j++)
        {
-         tmp = pspp_coeff_get_est (coe);
-         if (var_is_numeric (predictors[j]))
-           {
-             tmp *= vals[j]->f;
-           }
-         result += tmp;
-         coef_list[next_coef++] = coe;
+         intercept_variance -= 2.0 * gsl_matrix_get (q, i, j) *
+           linreg_get_indep_variable_mean (l, i) *
+           linreg_get_indep_variable_mean (l, j);
+         gsl_matrix_set (q, i, j, gsl_matrix_get (q, j, i));
        }
     }
-  free (coef_list);
-
-  return result;
-}
-
-double
-pspp_linreg_residual (const struct variable **predictors,
-                     const union value **vals,
-                     const union value *obs, const void *c, int n_vals)
-{
-  double pred;
-  double result;
-
-  if (predictors == NULL || vals == NULL || c == NULL || obs == NULL)
+  l->intercept = linreg_get_depvar_mean (l);
+  tmp = 0.0;
+  for (i = 0; i < l->n_indeps; i++)
     {
-      return GSL_NAN;
+      tmp = linreg_get_indep_variable_mean (l, i);
+      l->intercept -= l->coeff[i] * tmp;
+      intercept_variance += tmp * tmp * gsl_matrix_get (q, i, i);
     }
-  pred = pspp_linreg_predict (predictors, vals, c, n_vals);
 
-  result = isnan (pred) ? GSL_NAN : (obs->f - pred);
-  return result;
+  /* Covariances related to the intercept. */
+  intercept_variance += linreg_mse (l) / linreg_n_obs (l);
+  gsl_matrix_set (l->cov, 0, 0, intercept_variance);  
+  double intcpt_coef = 0.0;
+  for (i = 0; i < q->size1; i++)
+    {
+      for (j = 0; j < q->size2; j++)
+       {
+         intcpt_coef -= gsl_matrix_get (q, i, j) 
+           * linreg_get_indep_variable_mean (l, j);
+       }
+      gsl_matrix_set (l->cov, 0, i + 1, intcpt_coef);
+      gsl_matrix_set (l->cov, i + 1, 0, intcpt_coef);
+      intcpt_coef = 0.0;
+    }
+      
+  gsl_matrix_free (q);
+  gsl_matrix_free (r);
+  gsl_vector_free (xty);
+  gsl_vector_free (tau);
+  gsl_matrix_free (xtx);
+  gsl_vector_free (params);
 }
 
 /*
-  Which coefficient is associated with V? The VAL argument is relevant
-  only to categorical variables.
- */
-struct pspp_coeff *
-pspp_linreg_get_coeff (const pspp_linreg_cache * c,
-                      const struct variable *v, const union value *val)
+  Estimate the model parameters from the covariance matrix. This
+  function assumes the covariance entries corresponding to the
+  dependent variable are in the final row and column of the covariance
+  matrix.
+*/
+void
+linreg_fit (const gsl_matrix *cov, linreg *l)
 {
-  if (c == NULL)
+  assert (l != NULL);
+  assert (cov != NULL);
+
+  l->sst = gsl_matrix_get (cov, cov->size1 - 1, cov->size2 - 1);
+  if (l->method == LINREG_SWEEP)
     {
-      return NULL;
+      gsl_matrix *params;
+      params = gsl_matrix_calloc (cov->size1, cov->size2);
+      gsl_matrix_memcpy (params, cov);
+      reg_sweep (params);
+      post_sweep_computations (l, params);  
+      gsl_matrix_free (params);
     }
-  if (c->coeff == NULL || c->n_indeps == 0 || v == NULL)
+  else if (l->method == LINREG_QR)
     {
-      return NULL;
+      linreg_fit_qr (cov, l);
     }
-  return pspp_coeff_var_to_coeff (v, c->coeff, c->n_coeffs, val);
 }
-/*
-  Return the standard deviation of the independent variable.
- */
-double pspp_linreg_get_indep_variable_sd (pspp_linreg_cache *c, const struct variable *v)
+
+double linreg_mse (const linreg *c)
 {
-  if (var_is_numeric (v))
-    {
-      const struct pspp_coeff *coef;
-      coef = pspp_linreg_get_coeff (c, v, NULL);
-      return pspp_coeff_get_sd (coef);
-    }
-  return GSL_NAN;
+  assert (c != NULL);
+  return (c->sse / c->dfe);
 }
 
-void pspp_linreg_set_indep_variable_sd (pspp_linreg_cache *c, const struct variable *v, 
-                                       double s)
+double linreg_intercept (const linreg *c)
 {
-  if (var_is_numeric (v))
-    {
-      struct pspp_coeff *coef;
-      coef = pspp_linreg_get_coeff (c, v, NULL);
-      pspp_coeff_set_sd (coef, s);
-    }
+  return c->intercept;
 }
 
-/*
-  Mean of the independent variable.
- */
-double pspp_linreg_get_indep_variable_mean (pspp_linreg_cache *c, const struct variable *v)
+gsl_matrix *
+linreg_cov (const linreg *c)
 {
-  if (var_is_numeric (v))
-    {
-      struct pspp_coeff *coef;
-      coef = pspp_linreg_get_coeff (c, v, NULL);
-      return pspp_coeff_get_mean (coef);
-    }
-  return 0.0;
+  return c->cov;
 }
 
-void pspp_linreg_set_indep_variable_mean (pspp_linreg_cache *c, const struct variable *v, 
-                                         double m)
+double 
+linreg_coeff (const linreg *c, size_t i)
 {
-  if (var_is_numeric (v))
-    {
-      struct pspp_coeff *coef;
-      coef = pspp_linreg_get_coeff (c, v, NULL);
-      pspp_coeff_set_mean (coef, m);
-    }
+  return (c->coeff[i]);
 }
 
-/*
-  Make sure the dependent variable is at the last column, and that
-  only variables in the model are in the covariance matrix. 
- */
-static struct design_matrix *
-rearrange_covariance_matrix (const struct covariance_matrix *cm, pspp_linreg_cache *c)
+const struct variable *
+linreg_indep_var (const linreg *c, size_t i)
 {
-  const struct variable **model_vars;
-  struct design_matrix *cov;
-  struct design_matrix *result;
-  size_t *permutation;
-  size_t i;
-  size_t j;
-  size_t k;
-  size_t n_coeffs = 0;
+  return (c->indep_vars[i]);
+}
 
-  assert (cm != NULL);
-  cov = covariance_to_design (cm);
-  assert (cov != NULL);
-  assert (c != NULL);
-  assert (cov->m->size1 > 0);
-  assert (cov->m->size2 == cov->m->size1);
-  model_vars = xnmalloc (1 + c->n_indeps, sizeof (*model_vars));
+size_t 
+linreg_n_coeffs (const linreg *c)
+{
+  return c->n_coeffs;
+}
 
-  /*
-    Put the model variables in the right order in MODEL_VARS.
-    Count the number of coefficients.
-   */
-  for (i = 0; i < c->n_indeps; i++)
-    {
-      model_vars[i] = c->indep_vars[i];
-    }
-  model_vars[i] = c->depvar;
-  result = covariance_matrix_create (1 + c->n_indeps, model_vars);
-  permutation = xnmalloc (design_matrix_get_n_cols (result), sizeof (*permutation));
+double
+linreg_n_obs (const linreg *c)
+{
+  return c->n_obs;
+}
 
-  for (j = 0; j < cov->m->size2; j++)
-    {
-      k = 0;
-      while (k < result->m->size2)
-       {
-         if (design_matrix_col_to_var (cov, j) == design_matrix_col_to_var (result, k)) 
-           {
-             permutation[k] = j;
-           }
-         k++;
-       }
-    }
-  for (i = 0; i < result->m->size1; i++)
-    for (j = 0; j < result->m->size2; j++)
-      {
-       gsl_matrix_set (result->m, i, j, gsl_matrix_get (cov->m, permutation[i], permutation[j]));
-      }
-  free (permutation);
-  free (model_vars);
-  return result;
+double
+linreg_sse (const linreg *c)
+{
+  return c->sse;
 }
-/*
-  Estimate the model parameters from the covariance matrix only. This
-  method uses less memory than PSPP_LINREG, which requires the entire
-  data set to be stored in memory.
-
-  The function assumes FULL_COV may contain columns corresponding to
-  variables that are not in the model. It fixes this in
-  REARRANG_COVARIANCE_MATRIX. This allows the caller to compute a
-  large covariance matrix once before, then pass it to this without
-  having to alter it. The problem is that this means the caller must
-  set CACHE->N_COEFFS.
-*/
-void
-pspp_linreg_with_cov (const struct covariance_matrix *full_cov, 
-                     pspp_linreg_cache * cache)
+
+double
+linreg_ssreg (const linreg *c)
+{
+  return (c->sst - c->sse);
+}
+
+double linreg_sst (const linreg *c)
 {
-  struct design_matrix *cov;
+  return c->sst;
+}
 
-  assert (full_cov != NULL);
-  assert (cache != NULL);
+double 
+linreg_dfmodel ( const linreg *c)
+{
+  return c->dfm;
+}
 
-  cov = rearrange_covariance_matrix (full_cov, cache);
-  cache_init (cache);
-  reg_sweep (cov->m);
-  post_sweep_computations (cache, cov, cov->m);  
-  design_matrix_destroy (cov);
+void
+linreg_set_depvar_mean (linreg *c, double x)
+{
+  c->depvar_mean = x;
 }
 
-double pspp_linreg_mse (const pspp_linreg_cache *c)
+double 
+linreg_get_depvar_mean (linreg *c)
 {
-  assert (c != NULL);
-  return (c->sse / c->dfe);
+  return c->depvar_mean;
 }
index f9d8c9b3f740abfc161ea7df2ecf20131985f700..349d5a909c300c4713ee14a0196d967abbbcb5b6 100644 (file)
 #include <gsl/gsl_math.h>
 #include <gsl/gsl_vector.h>
 #include <gsl/gsl_matrix.h>
-#include <src/math/coefficient.h>
-#include <math/covariance-matrix.h>
 
 enum
 {
-  PSPP_LINREG_CONDITIONAL_INVERSE,
-  PSPP_LINREG_QR,
-  PSPP_LINREG_SWEEP,
+  LINREG_CONDITIONAL_INVERSE,
+  LINREG_QR,
+  LINREG_SWEEP,
 };
 
 
@@ -89,9 +87,9 @@ typedef struct pspp_linreg_opts_struct pspp_linreg_opts;
 */
 
 
-struct pspp_linreg_cache_struct
+struct linreg_struct
 {
-  int n_obs;                   /* Number of observations. */
+  double n_obs;                        /* Number of observations. */
   int n_indeps;                        /* Number of independent variables. */
   int n_coeffs;                 /* The intercept is not considered a
                                   coefficient here. */
@@ -102,8 +100,7 @@ struct pspp_linreg_cache_struct
   const struct variable *depvar;
   const struct variable **indep_vars;
 
-  gsl_vector *residuals;
-  struct pspp_coeff **coeff;
+  double *coeff;
   double intercept;
   int method;                  /* Method to use to estimate parameters. */
   /*
@@ -132,11 +129,6 @@ struct pspp_linreg_cache_struct
                                   dfe, but since it is the best unbiased
                                   estimate of the population variance, it
                                   has its own entry here. */
-  gsl_vector *ssx;             /* Centered sums of squares for independent
-                                  variables, i.e. \sum (x[i] - mean(x))^2. */
-  double ssy;                  /* Centered sums of squares for dependent
-                                  variable.
-                                */
   /*
      Covariance matrix of the parameter estimates.
    */
@@ -148,79 +140,57 @@ struct pspp_linreg_cache_struct
   double dfe;
   double dfm;
 
-  /*
-     'Hat' or Hessian matrix, i.e. (X'X)^{-1}, where X is our
-     design matrix.
-   */
-  gsl_matrix *hat;
-
-  double (*predict) (const struct variable **, const union value **,
-                    const void *, int);
-  double (*residual) (const struct variable **,
-                     const union value **,
-                     const union value *, const void *, int);
-  /*
-     Returns pointers to the variables used in the model.
-   */
-  int (*get_vars) (const void *, const struct variable **);
-  struct variable *resid;
   struct variable *pred;
-
+  struct variable *resid;
 };
 
-typedef struct pspp_linreg_cache_struct pspp_linreg_cache;
+typedef struct linreg_struct linreg;
 
 
 
-/*
-  Allocate a pspp_linreg_cache and return a pointer
-  to it. n is the number of cases, p is the number of
-  independent variables.
- */
-pspp_linreg_cache *pspp_linreg_cache_alloc (const struct variable *, const struct variable **, 
-                                           size_t, size_t);
+linreg *linreg_alloc (const struct variable *, const struct variable **, 
+                     double, size_t);
 
-bool pspp_linreg_cache_free (void *);
+bool linreg_free (void *);
 
 /*
   Fit the linear model via least squares. All pointers passed to pspp_linreg
   are assumed to be allocated to the correct size and initialized to the
   values as indicated by opts.
  */
-int
-pspp_linreg (const gsl_vector *, const struct design_matrix *,
-            const pspp_linreg_opts *, pspp_linreg_cache *);
+void
+linreg_fit (const gsl_matrix *, linreg *);
 
 double
-pspp_linreg_predict (const struct variable **, const union value **,
-                    const void *, int);
+linreg_predict (const linreg *, const double *, size_t);
 double
-pspp_linreg_residual (const struct variable **, const union value **,
-                     const union value *, const void *, int);
-/*
-  All variables used in the model.
- */
-int pspp_linreg_get_vars (const void *, const struct variable **);
+linreg_residual (const linreg *, double, const double *, size_t);
+const struct variable ** linreg_get_vars (const linreg *);
 
-struct pspp_coeff *pspp_linreg_get_coeff (const pspp_linreg_cache
-                                                      *,
-                                                      const struct variable
-                                                      *,
-                                                      const union value *);
 /*
   Return or set the standard deviation of the independent variable.
  */
-double pspp_linreg_get_indep_variable_sd (pspp_linreg_cache *, const struct variable *);
-void pspp_linreg_set_indep_variable_sd (pspp_linreg_cache *, const struct variable *, double);
+double linreg_get_indep_variable_sd (linreg *, size_t);
+void linreg_set_indep_variable_sd (linreg *, size_t, double);
 /*
   Mean of the independent variable.
  */
-double pspp_linreg_get_indep_variable_mean (pspp_linreg_cache *, const struct variable *);
-void pspp_linreg_set_indep_variable_mean (pspp_linreg_cache *, const struct variable *, double);
-
-/*
-  Regression using only the covariance matrix.
- */
-void pspp_linreg_with_cov (const struct covariance_matrix *, pspp_linreg_cache *);
-double pspp_linreg_mse (const pspp_linreg_cache *);
+double linreg_get_indep_variable_mean (linreg *, size_t);
+void linreg_set_indep_variable_mean (linreg *, size_t, double);
+
+double linreg_mse (const linreg *);
+
+double linreg_intercept (const linreg *);
+
+gsl_matrix * linreg_cov (const linreg *);
+double linreg_coeff (const linreg *, size_t);
+const struct variable * linreg_indep_var (const linreg *, size_t);
+size_t linreg_n_coeffs (const linreg *);
+double linreg_n_obs (const linreg *);
+double linreg_sse (const linreg *);
+double linreg_ssreg (const linreg *);
+double linreg_dfmodel (const linreg *);
+double linreg_sst (const linreg *);
+void linreg_set_depvar_mean (linreg *, double);
+double linreg_get_depvar_mean (linreg *);
 #endif