Úloha:
- Máme v SPSS sadu proměnných odpovídající jedné otázce. Např. “Znalost značky” nebo “Co se líbí na reklamě”.
- Při kódování takových otázek, které mohou být otevřené nebo polootevřené, vzniká několik typů chyb, které je potřeba pročistit.
Typy čištěných chyb:
- respondent na příslušnou otázku neodpověděl (v žádné proměnné není žádný kód) => do první proměnné vložíme kód příslušný odpovědi typu “DK/NA” (“Nevím, bez odpovědi”)
- respondent na otázku neměl odpovídat, ale při kódování nebo špatným filtrem se zde odpovědi dostaly (bývalo spíše dříve u papírových dotazníků) => všechny zakódované hodnoty se smažou
- je uveden vícekrát stejný kód (chybou kodéra nebo respondent 2x uvedl to samé) => kód tam zůstane pouze jednou a ten dříve uvedený
- je N kódů, ale ty nejsou naskládané v prvních N proměnných => seskládají se do prvních N proměnných s tím, že pořadí kódů zůstane zachováno
- jsou uvedeny korektní kódy, ale současně je uveden kód pro odpověď “DK/NA” (např. u odpovědi “značka1, značka2 a víc už nevím” kodér nesmyslně zakóduje kód pro “DK/NA”) => kód pro “DK/NA” se smaže
- Makro vždy zachová původní pořadí odpovědí a první proměnná v sadě tak lze použít pro výstup typu “první uvedená odpověď”.
Vše lze snadno pročistit díky tomuto SPSS makru:
- Makro funkční pro SPSS verze 11 nebo vyšší je zde ke stažení. Nebo si níže zkopírujte zdrojový kód.
PŘÍKLAD a pokyny ke správnému spouštění makra:
- !mac_clean_multi vars [var_1 to var_N] dkna [-1] filter [var=1].
- vars [var_1 to var_N] – zadání sady multiple proměnných, které se mají pročistit
- musí být zadáno formou “první_proměnná to poslední_proměnná” a to i v případě, že jsou v sadě jen 2 proměnné
- pokud by proměnné byly zadány výčtem, tak čištění neproběhne správně
- DKNA [-1] – zadání hodnoty, která odpovídá odpovědi typu “DK/NA” (“Nevím, bez odpovědi”)
- musí být zadána hodnota, která byla použita již při kódování
- pokud by byla zadána jiná hodnota, než při kódování, pak se tento typ odpovědí nepročistí správně
- filter [var=1] – zadání podmínky, která definuje řádky k pročištění
- zadává se hlavně v případě, že na otázku odpovídala jen část respondentů (pod nějakým filtrem)
- pokud na otázku odpovídali všichni a není potřeba filtr, zadá se jednoduše filter [1]
- lze zadat jakoukoliv složitou podmínku, kterou SPSS zpracuje v příkazu IF, např. filter [var_A=1 and (any(var_B,3,4,5) or sum(var_c,var_d)=0)]
- Zkoušejte, testujte a pište komentáře, jestli makro funguje, nebo zda vás napadají další vylepšení.
DEFINE !mac_clean_multi (vars = !ENCLOSE('[',']') / dkna = !ENCLOSE('[',']') / filter = !ENCLOSE('[',']') )
do if (~(!filter)).
recode !vars (else=sys).
end if.
vector vec = !vars.
do if (!filter).
loop #i = 1 to (nvalid(!vars) + nmissing(!vars)).
if (sys(vec(#i)) or vec(#i)=!dkna) vec(#i) = -1.
end loop.
loop #i = (nvalid(!vars) + nmissing(!vars)) to 2 by -1.
loop #j = (#i-1) to 1 by -1.
if (vec(#i) = vec(#j)) vec(#i) = -1.
end loop.
end loop.
loop #i = (nvalid(!vars) + nmissing(!vars) - 1) to 1 by -1.
do if (vec(#i) = -1).
loop #j = #i to (nvalid(!vars) + nmissing(!vars) - 1) BY 1.
compute vec(#j) = vec(#j+1).
end loop.
compute vec(nvalid(!vars) + nmissing(!vars)) = -1.
end if.
end loop.
if (vec(1)=-1) vec(1) = !dkna.
loop #i = 2 to (nvalid(!vars) + nmissing(!vars)).
if (vec(#i) = -1) vec(#i) = $sysmis.
end loop.
end if.
execute.
!ENDDEFINE.