torsdag 24 februari 2022

Stora bokstäver till små innan merge files

 

Fråga: Sitter och klurar på hur man gör om stora bokstäver till små i en datafil.

Jag ska merga ihop två filer där Id i ena är små bokstäver och den andra stora, (och då behöver jag ändra i ena filen annars mergas dem inte.)

Ex, ID ”AbC123” ska bli ID ”abc123” 

Har du nåt tips?

 

Svar

Hej, bra fråga!

Jag hittade inne i compute under STRING-delen

LOWER (Strexpr) för att göra om versaler till små.

I parentesen ska alltså själva STRING-variabeln ligga.

[För vetskap kan man göra tvärtom också genom att använda kommandot: 

UPCASE (strexpr) för att göra om små bokstäver till versaler.]

 

Exempel vad som händer innan och efter

I mitt exempel kommer vi märka att det inte fungerar att slå ihop dessa 2 filer där nyckelvariabeln är ID. Kommandot för att slå ihop 2 filer med en gemensam nyckelvariabel: här Id görs med detta kommando, men innan ska du se till att du tar säkerhetskopior av båda filerna: 

Data - Merge Files - Add variables

Men resultatet kommer tyvärr bli detta:

Dvs den enda personen som lyckades matchas korrekt med båda filerna var a1b2c3 som hade små bokstäver i BÅDA filerna. De andra blev uppsplittade.

Så lösningen är att göra om den första filen så att ALLA bokstäverna blir små, eftersom de är små i den andra filen (Fil2).

Kommandot är

Transform - Compute

Den nya variabeln som du skapar här (dvs Id2) måste få formatet string innan du klickar OK. Det gör du på det här sättet.

Avsluta med Continue och sen OK:

Resultatet blir en ny variabel (Id2) som endast innehåller små bokstäver:

Döp om variablerna så att den du ska ha som nyckelvariabel heter Id istället (för säkerhets skull har jag behållit den gamla Id-variabeln men döpt den till Id_old.

Nu kommer det fungera bättre att slå ihop de 2 filerna med nyckelvariabeln Id.

Lycka till! 

/Gunilla




torsdag 17 februari 2022

Mann Whitney eller Kruskal Wallis?

Hej, en kursdeltagare ställde för några veckor sen en bra statistisk fråga, som jag faktiskt fick tänka till på, och kanske någon annan skulle svara annorlunda?

Så här löd emailen med frågan:

Tack igen för dina nyhetsbrev!

Jag undrar över en sak, som du kanske kan?

Jag undrar om jag i följande analys bör använda Mann Whitney U-test för båda följande analyser, eller bara delar av Kruskal-Wallis test?

 

Det jag vill är: jämföra värden mellan Grupp 1 och Grupp 2 samt Grupp 1 och Grupp 3. Inga individer överlappar (oberoende grupper). Jag avser inte att jämföra grupp 2 mot grupp 3. Blir det då jämförelse mellan två oberoende grupper (en grupp mot en annan åt gången), eller tre oberoende grupper (men att jag bortser från den tredje jämförelsen i testet)?


Svar:

Hej Lina, eftersom dina 2 hypoteser är att bara jämföra dessa grupper dvs grupp1 mot 2 och grupp 1 mot 3 så skulle jag kalla det för 2 st testningar (2 hypoteser) där du använder Mann Whitney U test.

 

Hade du velat se om ALLA 3 grupper skiljer sig från varandra på något sätt så hade du 1) gjort Kruskal Wallis och 2) ifall Kruskal Wallis skulle vara signifikant, göra eftertest med Mann Whitney U test  och då skulle du ha testat 1 mot 2, 1 mot 3, 2 mot 3. Så det här sista förslaget blir då inte aktuellt för dig, utan du kör det jag föreslagit och utgår från att du har två hypoteser. 

För att se exempel på Kruskal Wallis gå in på denna länk från ett tidigare blogginlägg. 

**********************************

Gunillas exempel

Säg att vi vill endast jämföra åldersgrupp1  med åldersgrupp2 och åldersgrupp 1 mot åldersgrupp 3, vad gäller löner.

Så här ser mitt exempel ut:

Det verkar vara högst lön för de som är i åldersgrupp 1 (18-25 år), skiljer sig lönerna då vi jämför åldersgrupp 2 och skiljer sig lönerna  om vi jämför åldersgruppgrupp 1 med åldersgrupp 3? Jag har 2 hypoteser alltså som jag vill testa.

Testa grupp 1 mot 2: 

Kommando

Från Analyze-menyn väljer du följande:



Så lön mot åldersgrupp, och sen väljer du grupp 1 och 2 via knappen "Define Groups" (se nedan). 


Resultatet visar att det finns ingen signifikant skillnad mellan åldersgrupp 1 och 2 (p=0.850), och vi kan se att medel-rangerna ser lika ut. :

Testa grupp 1 mot 3: 

Gör samma test igen men byt ut grupperna till nedanståend: 


Resultatet visar att det FINNS en signifikant skillnad mellan åldersgrupp 1 och32 (p<0.001), och vi kan se att lönerna ligger högre i den yngre gruppen eftersom medel-rangen är högre där (104,88). Du redovisar dock normalt sett inte mean rank (de flesta förstår inte innebörden) utan medelvärde + medianer som du såg i första tabellen. :


Lycka till med statistiken och vill ni repetera in det här med tester, så rekommenderar jag kursen SPSS 1 för nybörjare, på Statistikakademin.

Hälsn Gunilla






Fler svar på stratifierade urval

 Fler svar på lösningar till förra veckans stratifierade urval kommer från 2 SPSS-användare. Stort tack!:

Här är Eriks svar:

Hej igen.

 

Jag jobbar löpande med stratiferade urval och har använt mig av två olika sätt. Beskriver de nedan utifrån ditt exempel.

 

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.

 

Så här gör jag i grova drag.

 

Jag tar in utsökningen i spss och kontrollerar att variabler så som datum inte förstörs av SPSS. Har blivit klart svårare att få till det med senare versioner av SPSS. Kontrollerar även typsnitt på de variabler jag ska jobba med, string eller numeric.

 

Selekterar bort de som inte tillhör målgruppen, dvs här de som är arbetslösa mer än tre månader. Sparar ner filen

 

Skapar en numerisk variabel som jag döper till urvalsgrupp. Kodar sen urvalsgrupp utifrån vilken åldersgrupp personen hör till (antar att åldersgrupp finns i utsökningen, annars får jag skapa den).

 

DO IF ((Åldersgrupp = 1)).

RECODE urvalsgrupp (MISSING=1).

END IF.

EXECUTE.

 

Och så vidare för alla åldersgrupper.

 

Sen skapar jag en slumpvariabel och sparar ner filen igen

 

COMPUTE Slumptal=RV.UNIFORM(0,1).

EXECUTE.

 

 

RANK VARIABLES=Slumptal (A)

  /RANK

  /PRINT=YES

  /TIES=MEAN.

 

 

Sen skapar jag en ny variabel ”Urvalet” och kör fram urvalet enligt:

 

USE ALL.

COMPUTE filter_$=(Åldersgrupp = 1).

VARIABLE LABELS filter_$ "Åldersgrupp = 1' (FILTER)".

VALUE LABELS filter_$ 0 'Not Selected' 1 'Selected'.

FORMATS filter_$ (f1.0).

FILTER BY filter_$.

EXECUTE.

SORT CASES BY filter_$(D) RSlumpta(A).

IF  ($CASENUM <=1200) Urvalet=1.

EXECUTE.

 

Kör så för alla åldersgrupper och sparar ner den slutliga filen i excelformat för utskick av enkäter via webbenkätverktyg eller papper. Så jag kör oftast bara med en urvalsvariabel som alla grupper kodas in i.



Här är Roberts svar:


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:

*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.


Tillägg: 

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

COMPUTE 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.


Tack för titten!

 

torsdag 10 februari 2022

Stratifierat urval

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.

 Svar:

Det här måste göras i flera steg. Jag har ett mindre dataset så jag byter ut 1000 mot 10 st i exemplet.

Steg 1  - gör en datafil med endast de som får slumpas ut , dvs arbetslösa mer än 3 månader.

Steg 2 - Skapa en urvalsvariabel 1 med koden 1 för de 10 som slumpats ut för åldersgrupp 1. 

Steg 3 - Skapa en urvalsvariabel 2 med koden 1 för de 10 som slumpats ut för åldersgrupp 2. 

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 



c) Jobba nu vidare i din nya fil.


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):



Steg 2 - 

a) Skapa en slumpvariabel för de som tillhör åldersgrupp 1.

Kommando : Transform - Compute Variable

Fyll i detta: 





b) Klicka på knappen "if" längst ned till vänster och fyll i detta (villkoret): 

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






















 

torsdag 3 februari 2022

Visa både variabelnamn och etikett (label) i resultaten

 Har ni gjort en större tabell där alla etiketter dvs labels kommit ut, till exempel frågorna ur en enkät, men så undrar du över vad själva variabeln till varje etikett heter?

I det här exemplet vill jag analysera några attitydvariabler som har korta variabelnamn att1, att2, att3 osv 



Att1 till exempel har etiketten/label: "Jag gillar att gå på bio"

När jag analyserar några av dessa attitydvariabler ser det ut så här, dvs jag får med automatik ut etiketterna i resultatet (tex "Jag gillar att gå på bio"):


Jag vill se vilka variabelnamn var och en har, för att underlätta andra analyser.

Gå till menyvalet: Edit - Options och välj fliken output:

Ändra till Names and Labels där du ser den röda inringningen: 


För kännedom: Du kan även välja att se både kod och etikett till koden också, då väljer du samma sak i rutan under den röda ringen.

Gör om analysen och du ser nu både variabelnamn (se röd pil)  och etikett. 


Trevlig helg!

Gunilla






Manualer att ladda ner

SPSS manualer går att ladda ner som PDF-filer.  Länken : https://www.ibm.com/support/pages/ibm-spss-statistics-29-documentation#en Vill du h...