Den här veckans fråga fick jag klura på ett tag, och för att hålla frågan på sekretessnivå har jag hittat på helt nya variabler i själva frågan (åldersgrupp och arbetslöshet).
Fråga:
Jag har en datafil
med hundra variabler och mer än 160 000 poster Jag vill dra slumpmässigt urval
stratifierat efter variabeln Åldersgrupp med 1000 personer per strata och kravet
vilka som ska slumpas ut är endast arbetslösa mer än 3 månader.
Steg 4 - Skapa en urvalsvariabel 3 med koden 1 för ALLA de som tillhör åldersgrupp 3 eller 4.
Steg 5 - Skapa ett slutligt urval för de som har valts ut (dvs har koden 1) i steg 2,3 eller 4.
(Jag är medveten om att steg 4 och 5 hade kunnat läggas ihop i samma steg, men ville få det pedagogiskt).
****************** RECEPT **************
Hela instruktionen nedan visas steg för steg via menyer, men rekommenderas varmt att spara ned som syntax, för att du ska kunna ha kontroll och sen kunna återanvända detta.
Syntaxkurs för nybörjare i april, (Statistikakademin) kan rekommenderas om du inte känner dig bekväm.
Steg 1 - Här rekommenderar jag att du först sparar ner din originalfil med ett helt nytt namn, och sen tar du bort de som inte ska tillhöra urvalsramen (dvs som inte får vara med i utslumpningen).
a) Jag har sparat filen med namnet "urvalsram datafil.sav"
b) Sen kan du tryggt ta bort de som inte får vara med, dvs vi ska selektera ut alla som är arbetslösa och har varit arbetslösa i mer än 3 månader.Kommando : Data - Select cases
Själva utslumpningen - Här ska jag slumpa ut 10 st från de 34 st i åldersgrupp 1 (18-25 år) och sen 10 st från åldersgrupp 2. Och därefter behålla alla som tillhör de 2 äldsta åldersgrupperna eftersom de är så få.
Det går egentligen att slumpa ut 10 st direkt från en fil, men eftersom jag endast ska göra det från åldersgrupp 1 (och sen åldersgrupp 2), så har jag löst det i några steg så här (tips emottages om ni har andra lösningar):
a) Skapa en slumpvariabel för de som tillhör åldersgrupp 1.
Kommando : Transform - Compute Variable
Fyll i detta:
c) Continue. OK.
Du har då fått 1 ny variabel (slump1) med utslumpade tal mellan 0 och 1 för den yngsta åldersgruppen :
d) Sortera nu datafilen utifrån slump1 i fallande ordning.
e) Vi ska nu skapa en ny variabel (urval1) som kodas 1 för de första 10 individerna i filen, det kommer alltså bli uppmärkningen för det slumpmässiga urvalet för exakt 10 personer i yngsta åldersgrupen.
Kommandot: Transform - Compute
och fyll sen i detta:
Så ser det ut så här sen:
Steg 3 -
a) Skapa nu en till slumpvariabel på exakt samma sätt som steg 2, men kalla slumpvariabeln för slump2 och välj villkoret Åldersgrupp=2 istället
Steg 4 -
a) Skapa en tredje urvalsvariabel som du kallar urval3 med koden 1 för ALLA de som tillhör åldersgrupp 3 eller 4.
Välj igen kommandot: Transform - Compute
b) Klicka på reset (så inga gamla villkor ligger kvar).
c) Fyll i detta.
OK.
Så här ser nu filen ut. Jag har ringat in exempel på det sista vi skapade.
Steg 5 -
a) Skapa slutligen en urvalsvariabel som väljer ut de med 1 på variablerna urval1, urval2 och urval3 , dvs de som slumpats ut alternativt valts ut i steg 2-4.
Kommando : Transform - Compute Variable
OK.
Då har SPSS skapat koden 1 när variablerna haft koden 1 i någon av de 3 variablerna (urval1-3), se inringade 1:orna.
Dubbelkolla med en korstabell att det blivit korrekta antal:
Om steg 2-5 hade gjorts som syntax så hade det bara varit den här lilla programmeringen:
Tack för titten, och en liten fråga till er:
Hade ni löst det på något annat sätt.?
/Gunilla
Kan inte säga att följande förslag är enklare, men det bygger på en rätt enkel upprepning av några rätt enkla steg. Proceduren utnyttjar den del av Select Cases som ger slumpurval direkt. I syntax ser det ut så här:
SvaraRadera*Här förutsätts att det redan finns ett dataset som fått namnet urvalsram.
DATASET ACTIVATE urvalsram.
DATASET COPY urval1.
DATASET ACTIVATE urval1.
FILTER OFF.
USE ALL.
SELECT IF åldersgrupp=1.
SAMPLE 10 from 20.
*Antalet 10 kunde vara 1000 och 20 kunde vara totalt antal i den aktuella åldersgruppen som också uppfyller kravet på arbetslös>3 mån.
DATASET ACTIVATE urvalsram.
DATASET COPY urval2.
DATASET ACTIVATE urval2.
FILTER OFF.
USE ALL.
SELECT IF åldersgrupp=2.
SAMPLE 10 from 20.
DATASET ACTIVATE urvalsram.
DATASET COPY urval3.
DATASET ACTIVATE urval3.
FILTER OFF.
USE ALL.
SELECT IF åldersgrupp=3.
SAMPLE 10 from 20.
DATASET ACTIVATE urvalsram.
DATASET COPY urval4.
DATASET ACTIVATE urval4.
FILTER OFF.
USE ALL.
SELECT IF åldersgrupp=4.
SAMPLE 10 from 20.
DATASET ACTIVATE urvalsram.
DATASET COPY urval5.
DATASET ACTIVATE urval5.
FILTER OFF.
USE ALL.
SELECT IF åldersgrupp=5.
SAMPLE 10 from 20.
*Packa ihop delarna. Med menyerna görs detta med Data/LMerge Files/Add Cases, men jag tror att den varianten bara accepterar två dataset i ett svep. Med syntax kan många fler packas ihop.
ADD FILES
/FILE=urval1
/FILE=urval2
/FILE=urval3
/FILE=urval4
/FILE=urval5.
DATASET NAME urval WINDOW=FRONT.
Kom på att det saknas en detalj: variabeln åldersgrupp säger ju inget om personen ifråga uppfyller kravet på arbetslöshet. Så det borde petas in en inledande konstruktion typ
RaderaCOMPUTE arblos=(Arbetslös=1) AND (Arbetslös_längd>3).
COMPUTE grupp=1*(ågrp=1 AND arblos) + 2*(ågrp=2 AND arblos)+3*(ågrp=3 AND arblos)+4*(ågrp=4 AND arblos+5*(ågrp=5 AND arblos).
Den variabeln (arblos) får sedan ersätta åldersgrupp ovan. Har inte testat, men det borde fungera.