Basishandelingen in SPSS
de gereedschapskist — het menu en de syntax naast elkaar
De gereedschapskist
Waarvoor deze pagina is: de handelingen die ónder elke analyse liggen. Een kolom bijmaken, een kolom anders indelen, een nulpunt verschuiven. Geen les — naslag. Je slaat hem open op het moment dat een oefening erom vraagt, en klapt hem daarna weer dicht.
Deze kist is nog niet vol. Er staan nu twee handelingen in: hercoderen en centreren. Mis je iets — inlezen, filteren, samenvatten — kijk dan zolang in de gereedschapskist van het R-broertje; de handeling is daar dezelfde, alleen de knoppen zijn anders.
Alles hieronder draait op de diamantjes: de twaalf steentjes uit het boek. Twaalf rijen die je in één blik overziet, en genoeg kolommen om alles op te oefenen. Openen doe je met File → Open → Data, bestandstype op CSV.
⬇ Download de data — diamantjes.csv
| kolom | wat |
|---|---|
naam |
Anna, Bram, Cees … Leen |
karaat |
gewicht van het steentje |
glans |
0–100 |
gladheid |
0–10, hoe goed geslepen |
merk |
golfje of sterretje |
D |
1 als het een sterretje is, anders 0 |
DxG |
D × gladheid — het product, voor moderatie |
gepakt |
1 als de kraai het steentje die nacht oppakte, anders 0 |
mooi |
1 als de glans boven de 50 ligt, anders 0 |
Dat is het kortste lijstje, genoeg om verder te kunnen. Wil je van dit bestand of van een van de andere weten waar het vandaan komt, wat de eenheid is en wat er precies in staat, sla dan De datasets op.
Twee routes, één handeling
Alles in SPSS bestaat twee keer. Er is het menu — dialoogvensters met vakjes waar je variabelen in schuift — en er is de syntax, dezelfde opdracht als tekst in een syntaxvenster (File → New → Syntax, draaien met het groene pijltje of Ctrl-R).
Het is verleidelijk om te denken dat de syntax voor gevorderden is. Dat is het niet; het is de enige van de twee die onthoudt wat je gedaan hebt. Een uur klikken laat geen spoor na, en over drie weken weet niemand meer of die ene kolom nou op 50 of op 51 gesplitst was.
Onderin elk dialoogvenster staat naast OK een knop Paste. Die voert je opdracht niet uit, maar schrijft hem als syntax in je syntaxvenster.
Klik hem in het begin élke keer, ook als je gewoon door wilt. Je hoeft dan niets uit je hoofd te leren: je klikt zoals je gewend bent, en SPSS dicteert je ondertussen de taal. Na een week of wat merk je dat je de regel sneller typt dan opklikt — en dan heb je meteen een bestandje waarin staat wat je met je data hebt uitgehaald.
En sluit af met EXECUTE. Opdrachten als COMPUTE, IF en RECODE zet SPSS in de wacht tot er iets gebeurt waarvoor hij de gegevens toch moet doorlopen. EXECUTE. is dat duwtje. Vergeet je hem, dan blijft je nieuwe kolom leeg in beeld staan terwijl je opdracht gewoon goed was — een half uur zoeken naar een fout die er niet is. Elke regel eindigt trouwens op een punt; dat is voor SPSS het teken dat de opdracht af is.
Nieuwe variabelen maken en hercoderen
Hercoderen is: dezelfde gegevens, een andere indeling. Je trekt een grens en houdt twee groepen over, je hakt een getal in klassen, of je maakt van een woord een nul en een één. Aan de meting zelf verandert niets — alleen aan hoe je hem groepeert.
Doe dat altijd in een nieuwe kolom. SPSS biedt je bij het hercoderen keurig Recode into Same Variables aan, en die overschrijft je origineel — waarna je alleen nog kunt hopen dat het klopte. Into Different Variables is één klik meer en scheelt je een keer opnieuw beginnen.
Een grens leggen: twee groepen uit één getal
We splitsen de glans op 50: alles daarboven heet hoog, de rest laag.
- Transform → Compute Variable.
- Bij Target Variable typ je
hoog. - Bij Numeric Expression typ je
glans >= 50. - OK — of beter: Paste, en draai de regel uit je syntaxvenster.
Wil je er de woorden hoog en laag in plaats van 1 en 0, klik dan op Type & Label, kies String, en gebruik twee keer If (de knop linksonder) met glans >= 50 en glans < 50.
Als 1 en 0 — een logische vraag levert in SPSS gewoon een 1 of een 0 op:
COMPUTE hoog = (glans >= 50).
EXECUTE.
Als woorden — dan moet je de kolom eerst als tekst aankondigen:
STRING hoog_tekst (A8).
IF (glans >= 50) hoog_tekst = 'hoog'.
IF (glans < 50) hoog_tekst = 'laag'.
EXECUTE.
Tel na wat eruit komt. Analyze → Descriptive Statistics → Frequencies, hoog erin, OK. Er horen 7 hoge en 5 lage steentjes te staan, samen 12. Doe dat elke keer: een hercodering die één kant op scheef staat zie je hier meteen, en verderop in je analyse nooit meer.
Een getal in klassen hakken
Drie vakjes deze keer: mat, middel en helder.
- Transform → Recode into Different Variables.
- Schuif
glansnaar het middenvak; geef bij Output Variable de naamklasseen klik Change. - Klik Old and New Values. Gebruik driemaal Range: Lowest through 40 →
1, 40 through 60 →2, 60 through Highest →3. - Continue, dan OK.
RECODE glans (LOWEST THRU 40 = 1) (40 THRU 60 = 2) (60 THRU HIGHEST = 3)
INTO klasse.
VALUE LABELS klasse 1 'mat' 2 'middel' 3 'helder'.
EXECUTE.
Uitkomst: 5 mat, 3 middel, 4 helder. Samen 12 — en dát is de som die je moet natellen.
Die grenzen overlappen, en dat mag. In 40 THRU 60 zit de 40 óók, en die stond al in de regel ervoor. SPSS lost dat op door van links naar rechts te kijken en de eerste regel te pakken die past: een glans van precies 40 is dus mat. Zo hoort een waarde die op een grens ligt altijd bij het vakje eronder.
In deze twaalf steentjes is dat geen theorie. Er ligt er precies één met een glans van 60, en die belandt daardoor in middel en niet in helder. Draai je de volgorde van je regels om, dan verhuist hij — zonder dat SPSS er iets van zegt.
RECODE doet niets met een waarde die in geen enkele regel past: die blijft leeg in je nieuwe kolom. Dat is meestal precies goed, maar het gebeurt geruisloos.
Wil je zeker weten dat je niemand kwijt bent, tel dan je nieuwe kolom na met Frequencies en kijk of het totaal nog klopt — de tabel zet ontbrekende waarden apart onder Missing.
Een woordkolom omzetten in een nul en een één
REGRESSION kan niet rekenen met het woord sterretje. Er moet een getal van komen, en het simpelste getal is: hoort dit steentje bij die groep, ja of nee.
Transform → Compute Variable, Target Variable D2, en bij Numeric Expression: merk = 'sterretje'.
COMPUTE D2 = (merk = 'sterretje').
EXECUTE.
Let op het enkele =. SPSS gebruikt hetzelfde teken om iets toe te wijzen én om iets te vergelijken; welke van de twee het is, leidt hij af uit waar het staat. In R zijn dat twee verschillende tekens (= en ==) en levert het door elkaar halen een foutmelding op. Hier niet — hier is het gewoon goed.
Zes enen en zes nullen, en je nieuwe D2 is regel voor regel gelijk aan de kolom D die al in het bestand zat. Zo’n 0/1-kolom heet een dummy. Dat woord klinkt alsof er iets nep aan is, maar er is niets nep aan: het is de eerlijkste vertaling die er bestaat van een naam naar een getal. Wat je wel moet weten, is wie er nul werd.
Wie krijgt de nul — de referentiecategorie
De groep die de nul krijgt heet de referentiecategorie, en dat is geen bijrol. Alles wat je model daarna over de andere groep zegt, zegt het ten opzichte van díé groep.
Draai een regressie met alleen D erin:
REGRESSION
/STATISTICS COEFF R ANOVA
/DEPENDENT glans
/METHOD=ENTER D.
| wat er in Coefficients staat | wat het betekent |
|---|---|
| (Constant) = 40.00 | de gemiddelde glans van de golfjes, de groep met de nul |
B voor D = 20.00 |
zoveel glanzender zijn de sterretjes — bovenop die 40 |
Ga het zelf na met Analyze → Compare Means → Means: de golfjes zitten op 40 glans, de sterretjes op 60. Die 60 zet SPSS nergens in je Coefficients-tabel neer. Hij geeft je het ijkpunt en de afstand ernaartoe, en het optellen laat hij aan jou.
Met meer dan twee groepen maak je de dummy’s zelf. Bij drie groepen worden het er twee, niet drie — je laat er één weg, en die weggelaten groep is je ijkpunt. Precies dat doet Transform → Recode into Different Variables voor je: bij de pinguïns maak je is_Chinstrap en is_Gentoo, en de Adélie’s blijven over als referentie.
Kom je dus een tabel tegen met drie groepen in de tekst en twee rijen in het model, dan ontbreekt er niets. De derde is het ijkpunt, en een ijkpunt heeft geen eigen rij nodig.
Waar dit over gáát — waarom een groep een getal mag worden, en wat je daarmee wint — staat in het boek bij W9 · Groepen zijn ook getallen.
Centreren
Centreren is aftrekken en verder niets: van elke waarde gaat het gemiddelde af. De steentjes blijven onderling precies even ver uit elkaar liggen, de volgorde verandert niet, de spreiding niet. Er verhuist één ding, en dat is de nul — het punt waar je meetlat begint. Dat je uitvoer er daarna anders uitziet zegt dus niets over je steentjes en alles over waar je model zijn verhaal laat beginnen.
In SPSS kost dat twee zetten in plaats van één. En tussen die twee zetten ligt een valstrik die er volkomen onschuldig uitziet.
karaat - MEAN(karaat)
Deze regel lijkt te zeggen wat je bedoelt, draait zonder klacht, en levert een kolom vol nullen op:
COMPUTE karaat_c = karaat - MEAN(karaat). /* FOUT */
MEAN() in een COMPUTE rekent namelijk over de rij, niet over de kolom. Je vraagt om het gemiddelde van één variabele binnen één steentje, en dat is dat steentje zelf. Je trekt karaat van karaat af.
Geen foutmelding, geen waarschuwing, een keurige nieuwe kolom. Alleen staat er overal nul in.
Het gemiddelde van een kolom moet je in SPSS dus eerst laten uitrekenen en als kolom erbij zetten. Dat doet AGGREGATE.
- Data → Aggregate.
- Laat Break Variable(s) leeg — dan rekent SPSS over het hele bestand.
- Zet
karaatbij Summaries of Variables; de functie staat standaard op MEAN. Noem de uitkomstkaraat_gem. - Kies onderin Add aggregated variables to the active dataset en klik OK. Er komt een kolom bij waarin in elke rij hetzelfde getal staat.
- Transform → Compute Variable:
karaat_c=karaat - karaat_gem.
AGGREGATE
/OUTFILE=* MODE=ADDVARIABLES
/BREAK=
/karaat_gem = MEAN(karaat).
COMPUTE karaat_c = karaat - karaat_gem.
EXECUTE.
/BREAK= zonder variabele erachter betekent: niet groeperen, maar het hele bestand als één hoop nemen.
Merk op wat er met MEAN gebeurde: dezelfde vier letters, maar bínnen AGGREGATE rekenen ze wél over de kolom. De functie doet dus iets anders naargelang waar hij staat. Dat is de hele val uit het kader hierboven, in één zin.
Zet karaat_c in Descriptives: het gemiddelde hoort 0 te zijn. Dat is geen toevalstreffer maar de definitie — je hebt er net het gemiddelde afgehaald. Staat er -1.1E-016 of iets van die strekking, dan is dat gewoon nul met wat rekenstof eromheen.
Zoek voor jezelf van die momentjes om te controleren. Je hebt net iets gedaan, je weet wat eruit zou moeten komen, en je kijkt of dat er staat — dat is alles. Wie het pas achteraf opschrijft heeft niets gecontroleerd, want dan is elk getal goed.
Je kunt het gemiddelde ook gewoon opzoeken — Analyze → Descriptive Statistics → Descriptives zegt je dat karaat gemiddeld 1.60 is — en dan tikken:
COMPUTE karaat_c = karaat - 1.60.
Dat werkt, vandaag. Maar je hebt nu een getal in je syntax staan dat uit je data komt, terwijl je data nog kan veranderen: je gooit een uitbijter eruit, je zet een Select Cases-filter aan, er komen twaalf steentjes bij. Het gemiddelde verschuift mee — en die 1.60 niet. Je kolom is dan stil verkeerd, en niets in de uitvoer zegt het.
AGGREGATE heeft dat probleem niet: die rekent het gemiddelde elke keer opnieuw uit als je hem draait. Een getal dat uit je gegevens volgt, laat je uitrekenen.
Wat er verschuift, en wat niet
Draai twee keer dezelfde regressie, eerst met karaat en dan met karaat_c:
REGRESSION
/STATISTICS COEFF R ANOVA
/DEPENDENT glans
/METHOD=ENTER karaat.
REGRESSION
/STATISTICS COEFF R ANOVA
/DEPENDENT glans
/METHOD=ENTER karaat_c.
| (Constant) | B voor karaat | |
|---|---|---|
ruw (karaat) |
−1.43 | 32.14 |
gecentreerd (karaat_c) |
50.00 | 32.14 |
De rij karaat verandert niet. In allebei de uitvoeren staat onder B dezelfde 32.14 glanspunten per karaat. Dat hóórt ook: je hebt aan de steentjes niets veranderd, alleen aan waar je begint te tellen.
De rij (Constant) verhuist wél, en daar zit de hele winst. Ruw leest hij −1.43 — de voorspelling voor een steentje van nul karaat. Zo’n steentje ligt er niet, en een negatieve glans kan al helemaal niet: een keurig uitgerekend antwoord op een vraag die niemand gesteld heeft. Gecentreerd leest diezelfde rij 50.00, en dat is de gemiddelde glans van een gemiddeld steentje. Datzelfde getal vind je terug als je glans door Descriptives haalt — je model vertelt je nu iets wat je kunt navertellen.
En bij een interactie wordt het menens
Met één voorspeller is centreren een kwestie van prettig lezen. Met een interactie erbij wordt het een kwestie van goed of fout.
Centreer eerst gladheid op dezelfde manier — het gemiddelde is 5 — en bouw daarna het product opnieuw:
AGGREGATE
/OUTFILE=* MODE=ADDVARIABLES
/BREAK=
/gladheid_gem = MEAN(gladheid).
COMPUTE gladheid_c = gladheid - gladheid_gem.
COMPUTE DxG_c = gladheid_c * D.
EXECUTE.
REGRESSION
/DEPENDENT glans
/METHOD=ENTER gladheid_c D DxG_c.
B voor D |
interactie | R² | |
|---|---|---|---|
ruw (gladheid, D, DxG) |
1.84 | 2.64 | .97 |
gecentreerd (gladheid_c, D, DxG_c) |
15.03 | 2.64 | .97 |
Dezelfde data, hetzelfde model, dezelfde verklaringskracht, dezelfde interactierij — en de rij D leest de ene keer 1.84 en de andere keer 15.03. Ruim acht keer zo groot, in een uitvoer die er verder identiek uitziet.
Ze zijn allebei waar. Ze beantwoorden alleen een andere vraag. Zodra er een interactie in je model staat, is elk hoofdeffect het effect bij nul van de ander — en dus hangt het antwoord aan de vraag waar die nul ligt:
- ruw leest als: hoeveel glans scheelt een sterretje met een golfje wanneer je ze allebei óngeslepen naast elkaar legt.
gladheidloopt in dit bestand van 1 tot 8, dus zo’n steen heb je nooit in handen gehad. Die 1.84 gaat over een plek waar je niet gemeten hebt. - gecentreerd leest als: hoeveel glans dat scheelt bij gemiddelde slijping. Dáár liggen je twaalf steentjes omheen.
Onthoud het zo: zolang er een interactie in je model zit, hangt elk hoofdeffect aan een nulpunt. Centreer je, dan wordt dat nulpunt het gemiddelde en kun je de kolom B van boven naar beneden voorlezen zonder er nog iets bij te rekenen. Aan de interactierij zelf verandert nooit iets — die gaat niet over wáár je meet, maar over hoe hard de twee hellingen uit elkaar lopen.
DxG laten staan
Hierboven staat één regel die je makkelijk overslaat: COMPUTE DxG_c = gladheid_c * D.
DxG zit kant-en-klaar in het bestand, en dat is het product van de ruwe gladheid. Zet je gladheid_c in je model maar laat je die oude DxG erin staan, dan gebeurt dit:
in /METHOD=ENTER |
B voor D |
interactie | R² |
|---|---|---|---|
gladheid_c D DxG |
1.84 | 2.64 | .97 |
gladheid_c D DxG_c |
15.03 | 2.64 | .97 |
Lees die eerste regel nog eens. Je hebt netjes gecentreerd, SPSS zegt niets, de Model Summary is tot achter de komma dezelfde — en in de rij D staat weer precies het getal waar je vanaf wilde. Er is niets aan te zien. Dat maakt dit de vervelendste fout op deze pagina, en de reden dat die ene COMPUTE-regel er staat.
Waaróm het zo netjes misgaat, is het nakijken waard. De oude DxG is (gladheid_c + 5) × D. Die 5 zit nog in de term, en bij het uitvermenigvuldigen schuift hij door naar de D-rij — waar hij je oude antwoord weer in elkaar zet:
\[1.84 + 5 \times 2.64 = 15.03\]
Wat je bij gladheid van tafel haalde, stond via het oude product nog gewoon in je model.
In het boek staat het waaróm: W8 · Meer dan één verschil gaat over wat de constante nog betekent zodra er meerdere voorspellers naast elkaar staan, en W10 · Verschil in verschil over hellingen die niet parallel lopen. Deze pagina beperkt zich tot de knoppen.