Manual för Epi-Info: Ex på analysprogram -
Sumscore och transformering
Denna sida är uppdaterad 2005-07-31
För att förstå den här sidan bör du först ha läst:
Epi-Info översikt
Innehållsförteckning för manualen till statistikprogrammet
Epi-Info
Introduktion till Epi-Info
Här beskrivs det statistikprogram nedanstående kod passar till
(hela statistikprogrammet kan laddas ner gratis)
Modulen Analyze data
Beskriver den del av statistikprogrammet som används när man
analyserar inmatade data. I denna modul körs programkod
Analysprogram i Analyze Data
Beskriver vad ett analysprogram i modulen Analyze Data är och hur
det fungerar. Exempel ges.
Nedan ses ett exempel på analysprogram använt vid en studie där man vill summera delfrågor i en enkät till sumscore och sedan räkna fram hur sumscore förändras över tid. Vidare ville man sedan jämföra dessa nya framräknade förändringsmått mellan en interventionsgrupp och en kontrollgrupp och det här resultatet skulle lagras i en fil som man sedan kan skriva ut och läsa när det passar. I det här projektet användes Linton's enkät för att skatta risk för långvariga ländryggsbesvär, Roland och Morris funktionsskattning och Borg's smärtskattning. Förändringar i sumscore bör behandlas på ett speciellt sätt. Av detta skälet valdes att dels jämföra förändringar i sumscore direkt mellan grupperna och dels att jämföra transformerade förändringar där de egentliga förändringarna i sumscore omvandlas till förbättrade (får mätvärdet +1), oförändrade (får mätvärdet 0) och försämrade (får mätvärdet -1). Rader som föregås av * är kommentarer som hoppas över när programmet körs. Det är ofta bra att lägga in kommentarer för sin egen skull annars kan man lätt gå vilse bland programraderna.
När man gör ett analysprogram brukar man ha två delar. En förberedande del (låt oss kalla den del 1) som räknar ut nya variabler. Den egentliga statistiken tas fram av del 2 som bland annat använder de nya framräknade variablerna för att räkna den egentliga statistiken. Analysprogrammet som gör detta i ländryggsprojektet återfinns nedan. När man ser ett sådant här program första gången kan det verka skrämmande krångligt. Efter ett tag ser man att det egentligen inte är så svårt. Nedanför programscriptet kommer några förklaringar som underlättar förståelsen.
*Först läser
vi in data med readkommandot
READ 'C:\Epi_Info\landryggsstudie':viewformulär1
*
*
*
*Del 1 - Räkna ut nya variabler
*
*Räkna ut sumscore på Linton vid mätning A
DEFINE sumla
DEFINE sumla_temp1
DEFINE sumla_temp2
DEFINE sumla_temp3
ASSIGN sumla_temp1=L05a+L06a+L07a+L08a+L09a+L10a+L11a
ASSIGN sumla_temp2=L12a+L13a+L14a+L15a+L16a+L17a+L18a
ASSIGN sumla_temp3=L19a+L20a+L21a+L22a+L23a+L24a+L25a
ASSIGN sumla = sumla_temp1 + sumla_temp2 + sumla_temp3
*
*Räkna ut sumscore på Linton vid mätning C
DEFINE sumlc
DEFINE sumlc_temp1
DEFINE sumlc_temp2
DEFINE sumlc_temp3
ASSIGN sumlc_temp1=L05c+L06c+L07c+L08c+L09c+L10c+L11c
ASSIGN sumlc_temp2=L12c+L13c+L14c+L15c+L16c+L17c+L18c
ASSIGN sumlc_temp3=L19c+L20c+L21c+L22c+L23c+L24c+L25c
ASSIGN sumlc = sumlc_temp1 + sumlc_temp2 + sumlc_temp3
*
*Förändring i sumscore på Linton mellan mätning A och C
DEFINE sumlac
ASSIGN sumlac = sumla - sumlc
*
*Omvandla förändring i Linton till +1, 0 resp -1
DEFINE sumlac_trans
RECODE sumlac TO sumlac_trans
LOVALUE - -0.0001 = -1
0 = 0
0.0001 - HIVALUE = 1
END
*
*Sumscore på Roland och Morris vid mätning A
DEFINE sumRa
DEFINE sumRa_temp1
DEFINE sumRa_temp2
DEFINE sumRa_temp3
ASSIGN sumRa_temp1=R01a+R02a+R03a+R04a+R05a+R06a+R07a+R08a
ASSIGN sumRa_temp2=R09a+R10a+R11a+R12a+R13a+R14a+R15a+R16a
ASSIGN sumRa_temp3=R17a+R18a+R19a+R20a+R21a+R22a+R23a+R24a
ASSIGN sumRa=sumRa_temp1 + sumRa_temp2 + sumRa_temp3
*
*Sumscore på Roland och Morris vid mätning B
DEFINE sumRb
DEFINE sumRb_temp1
DEFINE sumRb_temp2
DEFINE sumRb_temp3
ASSIGN sumRb_temp1=R01b+R02b+R03b+R04b+R05b+R06b+R07b+R08b
ASSIGN sumRb_temp2=R09b+R10b+R11b+R12b+R13b+R14b+R15b+R16b
ASSIGN sumRb_temp3=R17b+R18b+R19b+R20b+R21b+R22b+R23b+R24b
ASSIGN sumRb= sumRb_temp1 + sumRb_temp2 + sumRb_temp3
*
*Sumscore på Roland och Morris vid mätning C
DEFINE sumRc
DEFINE sumRc_temp1
DEFINE sumRc_temp2
DEFINE sumRc_temp3
ASSIGN sumRc_temp1=R01c+R02c+R03c+R04c+R05c+R06c+R07c+R08c
ASSIGN sumRc_temp2=R09c+R10c+R11c+R12c+R13c+R14c+R15c+R16c
ASSIGN sumRc_temp3=R17c+R18c+R19c+R20c+R21c+R22c+R23c+R24c
ASSIGN sumRc= sumRc_temp1 + sumRc_temp2 + sumRc_temp3
*
*Förändring i sumscore på Roland och Morris mätning A-B
DEFINE sumRab
ASSIGN sumRab= sumRa - sumRb
*
*Omvandla förändring A-B i R&M till +1, 0 resp -1
DEFINE sumRab_trans
RECODE sumRab TO sumRab_trans
LOVALUE - -0.0001 = -1
0 = 0
0.0001 - HIVALUE = 1
END
*
*Förändring i sumscore på Roland och Morris mätning A-C
DEFINE sumRac
ASSIGN sumRac= sumRa-sumRc
*
*Omvandla förändring A-C i R&M till +1, 0 resp -1
DEFINE sumRac_trans
RECODE sumRac TO sumRac_trans
LOVALUE - -0.0001 = -1
0 = 0
0.0001 - HIVALUE = 1
END
*
*Förändring A-C i R&M till +1, 0 resp -1 med ny gräns
*(Liten förändring klassas som ingen förändring)
DEFINE sumRac_trans3
RECODE sumRac TO sumRac_trans3
LOVALUE - -3.0001 = -1
-3 - 3 = 0
3.0001 - HIVALUE = 1
END
*
*Förändring i smärtskattning på BORG mätning A-B
DEFINE borgab
ASSIGN borgab= borga - borgb
*
*Omvandla förändring A-B i BORG till +1, 0 resp -1
DEFINE borgab_trans
RECODE borgab TO borgab_trans
LOVALUE - -0.0001 = -1
0 = 0
0.0001 - HIVALUE = 1
END
*
*Förändring A-B i R&M till +1, 0 resp -1 med ny *gräns
*(Liten förändring klassas som ingen förändring)
DEFINE sumRab_trans3
RECODE sumRab TO sumRab_trans3
LOVALUE - -3.0001 = -1
-3 - 3 = 0
3.0001 - HIVALUE = 1
END
*
*Förändring i smärtskattning på BORG mätning A-C
DEFINE borgac
ASSIGN borgac= borga - borgc
*
*Omvandla förändring i BORG till +1, 0 resp -1
DEFINE borgac_trans
RECODE borgac TO borgac_trans
LOVALUE - -0.0001 = -1
0 = 0
0.0001 - HIVALUE = 1
END
*
*Förändring av sjukskrivningsgrad LINTONS FRÅGA 6 mätning A-C
DEFINE d106ac
ASSIGN d106ac= l06a-l06c
*Omvandla förändring A-C i LINTONS FRÅGA 6 till +1, 0 resp -1
DEFINE d106ac_trans
RECODE d106ac TO d106ac_trans
LOVALUE - -0.0001 = -1
0 = 0
0.0001 - HIVALUE = 1
END
*
*
*
*Del 2 - Räkna fram baselinedata och analytisk statistik
*
*resultatet läggs i en resultatfil som kan skrivas ut
ROUTEOUT 'Resultat_Landrygg' REPLACE
*
*Baselinedata (Grupperna jämförs)
MEANS age group
TABLES sex group
TABLES l03a group
TABLES l04a group
MEANS l06a group
MEANS l07a group
MEANS vantetid group
TABLES sokvag group
MEANS borga group
MEANS sumRa group
MEANS sumla group
*
*Vad som gjordes i de två grupperna (Grupperna jämförs)
MEANS beh group
MEANS franvaro_efter group
MEANS franvaro_c group
MEANS vardkons_annan group
MEANS vardk_lak group
MEANS vardkons_sgy group
TABLES atgardA group
TABLES atgardE group
TABLES atgardg group
TABLES atgardP group
*
*Jämförelse i utfall mellan grupper
*Som ses nedan väljer vi att analysera förändring i tre
*nivåer (-1, 0 och +1) med means (Mann-Whitney's test)
*och inte tables (Chi-två). Det beror på att den
*transformerade förändringen har en inbördes ordning,
*det är alltså inte är inte nominaldata.
*
MEANS borgab group
MEANS borgab_trans group
MEANS borgac group
MEANS borgac_trans group
MEANS sumRab group
MEANS sumRab_trans group
MEANS sumRac group
MEANS sumRac_trans group
MEANS sumlac group
MEANS sumlac_trans group
*
*Sluta skriva till resultatfil
CLOSEOUT
Beskrivning av de kommandon som används ovan
ASSIGN | Betyder tilldela det som står till vänster om = värdet av det som står
till höger om =. Oftast används ganska enkel matematik, sällan mer avancerat
än de fyra räknesätten. Det som står till höger om = måste omges med " om
det är text. Man kan börja med ASSIGN eller LET eller så skippar man dessa
kommandoord. Exempel på ASSIGN-kommandot: ===================== ASSIGN County = "Yellow Medicine" ===================== LET Address = StreetNumber & " " &StreetName &" " & AptNumber ===================== now = systemtime ===================== duration = uears(01/01/88, dateonset) ===================== group = 1 (Om grupp är en numerisk variabel ) ===================== group = "1" (Om grupp är en textvariabel) ===================== |
DEFINE | Betyder skapa en ny variabel. Man kan
se en variabel som varande kolumnen i en tabell där raderna (kallas även
poster) är varje registrerad individ (om det nu är individer som man
registrerar). Nästa steg är att fylla kolumnen med värden som räknas fram ur
de kolumner som fanns tidigare. Define följs alltså nästan alltid av
kommandot assign eller recode. Direkt när en ny variabel är skapad med
define accepterar den att man fyller den med siffror eller text. Om man
första gången fyller variabeln med siffror kan den sedan inte ta emot text
(och tvärtom). Om man gör fel får man använda kommandot undefine och sedan
göra rätt. Den nya variabeln kan göras så att den lagras
permanent eller bara tillfälligt. Om man inte gör annat än att skriva define
lagras den tillfälligt vilket innebär att när man avslutar programmet
Analyze Data eller kör ett nytt read-kommando försvinner variabeln (såvida
man inte genom write-kommandot har skrivit den till en annan datatabell). Om
man efter define-kommandot lägger till global sparas värdet tills modulen
Analyze Data stängs av. Lägger man till permanent sparas informationen (även
om datorn stängs av) till man använder kommandot undefine. Exempel på
define-kommandot: ===================== DEFINE change ===================== DEFINE totalitems GLOBAL ===================== DEFINE totalitems PERMANENT ===================== Endast tillfälliga variabler innehåller vanligen data (ett värde) för varje post/rad i tabellen. Variabler som är globala/permanenta kan bara innehålla ett enda värde. |
CLOSEOUT | Om man har kört kommandot routeout så gör kommandot closeout att man slutar skriva resultat till en resultatfil. Resultatet syns därefter enbart på bildskärmen. |
MEANS | Används för att ta fram medelvärde och median och passande
spridningsmått. Efter kommandot means
kommer den variabel man vill ha medelvärdet för. Om man efter den variabeln
anger en andra variabel som härbärgerar gruppindelningen så ger means medel
och median separat för grupperna och dessutom görs en
signifikansanalys där sannolikheten för att
man har fel när man påstår att grupperna skiljer sig åt beräknas (det så
kallade p-värdet). P-värdet räknas fram med både
parametriska och icke parametriska statistiska
metoder. Den parametriska metoden som används är
one way anova vilket för två
grupper är detsamma som t-test. Den
icke parametriska metoden är
Kruskal-Wallis one way analysis of variance vilket för två grupper är
detsamma som Mann-Whitney's U-test.
Eftersom programmet självt omöjligt kan veta om siffror representerar en
kvantitativ eller kvalitativ variabel måste
man själv avgöra om man skall använda resultatet framräknat med
parametrisk eller icke parametrisk metod.
Mellan resultatet framräknat med anova respektive Kruskal-Wallis presenteras
Bartlett's test som testar om spridningen är ungefär lika i grupperna. Detta
är nämligen ett av kraven för att få göra anova / Student's t-test. Exempel
på detta kommando. ===================== MEANS change ===================== MEANS change group |
READ | Läser in de data man vill använda. Oftast lagras alla data till ett
projekt i en separat fil. Har man registrerat data i Epi Info ligger de
lagrade i en fil med ändelsen .mdb (samma filformat som access). Registrerar
man data i andra program har filen en annan ändelse. Excel har .xls.
Read-kommandot kan läsa excelfiler förutsatt att de bara innehåller data och
att översta raden anger variabelns namn. När man använder read-kommandot
försvinner tillfälliga variabler man räknat fram. Det gör oftast inget för
de kan snabbt räknas fram igen från grunddata. Exempel på READ-kommandot: ===================== READ 'c:\epi_info\cts.mdb':viewbasdata ===================== READ "Excel 8.0" 'c:\epi_info\projekt_a':'visits$' FILESPEC HDR="YES" END ===================== READ "dBASE IV" 'c:\epi_info\burkinaFaso.dbf' ===================== READ "Epi6" 'c:\epi_info\sf36.rec' LINKNAME=sf36 ===================== READ "ODBC" sqldatadsn:bigtable LINKNAME=projekt_b FILESPEC UID="Username" PWD="Password" END ===================== Om filnamnet innehåller ett mellanslag måste det omges av '-tecken. Det finns ingen nackdel med att använda '-tecken om mellanslag saknas. Om filen som innehåller rådata inte är i filformatet för Epi2000 eller Microsoft Access måste en länk till rådata skapas. Om man inte anger ett speciellt länknamn skapas en tillfällig länk som kallas lnk# där # är ett löpnummer. Den tillfälliga länken (men inte filen med rådata) raderas när man gör ett nytt READ-kommando. Man kan skapa en permanent länk genom att ange ett LINKNAME. Denna permanenta länk (bara länkinformation, inte alla data) sparas i den senast använda Epi2000-filen. Om man vill kan man skapa en egen Epi2000-fil utan egna data som används för att härbärgera länkinformation till en mängd externa databasfiler. Om man läser in en Excelfil som innehåller flera blad anges namnet på bladet sist följt av $. |
RECODE | Innebär att en variabel skall fyllas med data från en annan variabel på
ett speciellt sätt. Kommandot avslutas med END. Om man använder flera (>3-4)
korta RECODE-kommandon (eller ett långt) behöver man mellanlagra data innan man fortsätter. Detta
beror på en begränsning i Epi-Info. Denna begränsning kringgås lätt genom en
mellanlagring. Mellanlagringen görs rent praktiskt genom att man skriver
data till en ny datatabell. Därefter läser man in tabellen med rådata igen,
länkar till den nya datatabellen och fortsätter. Detta medför några extra
rader programkod som enkelt kopieras om förfarandet behöver upprepas. Man
kan inte ha mer än 12 nivåer av värden i ett enskilt recode-kommando. Behövs
fler får man köra flera recode-kommandon med mellanlagring. Exempel på ett
recode-kommando: ===================== RECODE age TO agegroup LOVALUE - 10 = "0-10" 10 - 20 = ">10 - 20" 20 - 30 = ">20 - 30" 30 - 40 = ">30 - 40" 40 - 50 = ">40 - 50" 50 - 60 = ">50 - 60" 60 - 70 = ">60 - 70" 70 - 80 = ">70 - 80" 80 - 90 = ">80 - 90" 90 - 100 = ">90 - 100" 100 - HIVALUE = ">100" END |
ROUTEOUT | Innebär att resultatet av alla kommandon som normalt ger ett resultat på
bildskärmen (freq, tables, means regress, etc) lagras i en fil med
det namn som anges efter kommandot. Filen kommer att ha filformatet html
vilket kan läsas dels av varje webbläsare men även av de flesta
ordbehandlare, exempelvis Word. Detta är praktiskt om man vill göra
många analyser och sedan läsa en utskrift i lugn och ro. Skriver man replace efter raderas filen
först om den redan finns. Skriver man inte replace lagras resultaten sist i
filen. För att sluta skriva data i en fil körs man kommandot closeout.
Exempel: ===================== ROUTEOUT 'cts_statistik' APPEND ===================== ROUTEOUT 'cts_statistik' REPLACE |
TABLES | Används för att jämföra procentuella fördelningar mellan grupper. Efter kommandot tables kommer den variabel man vill ha fördelningen för. Om man efter den
variabeln anger en andra variabel som härbärgerar gruppindelningen så ger
tables fördelningen separat för grupperna och dessutom görs en
signifikansanalys där sannolikheten för att
man har fel när man påstår att grupperna skiljer sig åt beräknas (det så
kallade p-värdet). P-värdet räknas fram med
icke parametriska statistiska metoder. Vid 2x2-tabell levereras odds
ratio, relativ risk, chitvå-test
samt Fisher's exakta test. Vid en
större tabell än 2x2 levereras enbart chitvå. Man kan även göra flera
2x2-tabeller och få en sammanställning av dem. Används när man vill se om en
viss variabel interagerar. Exempel: ===================== TABLES ill group ===================== TABLES ill group STRATAVAR=sex ===================== I första exemplet vill vi se om två olika grupper skiljer sig åt i andelen sjuka individer. I sistnämnda exemplet vill man se om kön interagerar med hur de två grupperna är sjuka. Ett alternativ vore att istället göra logistisk regression. |
Åter till innehållsförteckningen för Epi-Info
Denna webbsida är författad av
Doc. Ronny Gunnarsson
Distriktsläkare/Familjeläkare
Läs om regler för ansvar och copyright som gäller för denna webbsida.