Manual för Epi-Info: Ex på analysprogram -
Summering
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.
I ett projekt ville man studera karaktären vid besök hos distriktsläkare (=general practitionar =gp). 20 läkare valdes ut slumpmässigt. Från vardera av dessa läkare valdes 20 besök ut. Det visade sig senare att i alla besök var det unika patienter, dvs ingen patient är med mer än en gång. Vi har nu 557 diagnoser satta vid 400 patientbesök hos 20 läkare, alltså tre olika datanivåer. Nedanstående programkod ger ett enkelt exempel på hur man kan ta hänsyn till en sådan flernivåmodell. 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 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 till varje enskilt kommando.
*Vi börjar med att läsa in
rådata
READ "Excel 8.0" 'C:\Epi_Info\besok.xls':'visits$'
FILESPEC HDR="YES" END
SET STATISTICS=COMPLETE
*
*Vi kodar om kön på gp
DEFINE sex_gp_new
RECODE sex_gp TO sex_gp_new
1 = 0
2 = 1
END
*Vi kodar om kön på patient
DEFINE sex_pat_new
RECODE sex_pat TO sex_pat_new
1 = 0
2 = 1
END
*
*Första analysen baseras på diagnoser (n=557)
ROUTEOUT 'results_diagnose_project' REPLACE
TYPEOUT "Är diagnosgrupperna fördelade olika mellan könen?" (BOLD) TEXTFONT +2
TABLES diaggroup_code sex_pat_new
TYPEOUT "Är diagnosgrupperna fördelade olika mellan könen om man tar hänsyn till
ålder och kön hos gp?" (BOLD) TEXTFONT +2
LOGISTIC sex_pat_new = (diaggroup_code) age_gp age_pat (sex_gp_new)
TYPEOUT "Har manliga resp kvinnliga gp olika diagnosprofil?" (BOLD) TEXTFONT +2
LOGISTIC sex_gp_new = (diaggroup_code) age_gp age_pat (sex_pat_new)
CLOSEOUT
*
*Andra analysen skall baseras på patienter (n=400).
*I rådata finns en rad per diagnos (557 rader)
*Variabeln id_journal betecknar enskilda patienter/besök (400st)
*Nu skapar vi en ny tabell med en rad per patient
SUMMARIZE diagnoses_per_visits_patients::COUNT(diag_code), age_gp::AVG(age_gp),
sex_gp::AVG(sex_gp_new), id_gp::AVG(id_gp), age_pat::AVG(age_pat),
sex_pat::AVG(sex_pat_new) TO table_patients STRATAVAR=id_journal
*Vår rådatafil var en Excel-fil. Den datatabell
*vi nu skapade lades i vår senast öppnade Epi-Info
*fil, i vårt exempel är det C:\Epi_Info\Sample.mdb.
*Vi läser nu in den nya tabellen med 400 poster.
READ 'C:\Epi_Info\Sample.mdb':table_patients
*Vi skapar sedan från denna tabell med besök/patienter
*en ny tabell med en rad per gp (dvs 20 rader)
SUMMARIZE diagnoses_per_visits_gps::AVG(diagnoses_per_visits_patients),
age_gp::AVG(age_gp), sex_gp::AVG(sex_gp), sex_pat_gps::AVG(sex_pat),
age_pat_gps::AVG(age_pat) TO table_gps STRATAVAR=id_gp
*
*Nu gör vi fler analyser
ROUTEOUT 'results_diagnose_project'
*Först tittar vi på antalet diagnoser per besök
TYPEOUT "Antal diagnoser per besök (400 besök)" (BOLD) TEXTFONT +2
MEANS diagnoses_per_visits_patients
*Könsfördelningen av patienterna
TYPEOUT "Andel män av patienterna (400 patienter/besök)" (BOLD) TEXTFONT +2
FREQ sex_pat
*Patienternas medelålder
TYPEOUT "Patienternas medelålder (400 patienter/besök)" (BOLD) TEXTFONT +2
MEANS age_pat
CLOSEOUT
*
*Vi vill i den multipla linjära regressionsanalysen inkludera
**gp's genomsnittliga antal diagnoser per besök.
*För att få med den variabeln måste vi relatera de två tabellerna
*den ena för patienter/besök och den andra för gp
RELATE table_gps id_gp :: id_gp
*
*Nu fortsätter vi analyserna om patientbesöken (n=400)
*Här vill vi i en flernivåmodell ta fram om antalet diagnoser
*per besök samvarierar med patientens kön och ålder.
*Samtidigt vill vi justera för det faktum att besöken är
*grupperade i grupper om 20 och 20. Varje grupp är speciell
*och det försöker vi beskriva med gp's kön, ålder och benägenhet
*att ställa diagnoser.
ROUTEOUT 'results_diagnose_project'
TYPEOUT "Vilka variabler som samvarierar med antal diagnoser per besök (400
besök)" (BOLD) TEXTFONT +2
REGRESS diagnoses_per_visits_patients = age_gp (sex_gp) age_pat (sex_pat)
diagnoses_per_visits_gps
*Vad styr om man väljer manlig resp kvinnlig GP?
*Finns det någon samvariation mellan läkarens kön
*och patientens kön eller ålder?
TYPEOUT "Faktorer som samvarierar med valet av GP's kön (400 besök)" (BOLD)
TEXTFONT +2
LOGISTIC sex_gp = age_pat (sex_pat)
CLOSEOUT
*
*Tredje gruppen analyser baseras på gp (n=20)
READ 'C:\Epi_Info\Sample.mdb':table_gps
ROUTEOUT 'results_diagnose_project'
*Först tittar vi på antalet diagnoser gp brukar ställa
TYPEOUT "Antal diagnoser per gp (20 gp)" (BOLD) TEXTFONT +2
MEANS diagnoses_per_visits_gps id_gp
*Könsfördelningen av gp's patienter
TYPEOUT "Andel män av gp's patienter (20 gp)" (BOLD) TEXTFONT +2
MEANS sex_pat_gps id_gp
*Medelålder av gp's patienter
TYPEOUT "Medelålder av gp's patienter (20 gp)" (BOLD) TEXTFONT +2
MEANS age_pat_gps id_gp
TYPEOUT "Vilka variabler som samvarierar med antal diagnoser per besök som gp
brukar ställa (20 gp)" (BOLD) TEXTFONT +2
REGRESS diagnoses_per_visits_gps = age_gp (sex_gp) age_pat_gps sex_pat_gps
CLOSEOUT
Beskrivning av de kommandon som används ovan
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. |
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. |
FREQ | Används för att ta presentera procentuella fördelningar. Efter kommandot
freq kommer den variabel man vill ha fördelningen för. Om variabeln är binär
ges även konfidensintervall. Exempel: ===================== FREQ ill ===================== FREQ blodgroup |
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 |
LOGISTIC | Detta kommando gör en enkel eller multipel logistisk regression. Om man
vill se hur en binär variabel samvarierar med en annan binär variabel ger
kommandot tables samma resultat. Vill man se hur en binär variabel
samvarierar med flera andra variabler är kommandot logistic lämpligt. De
oberoende variablerna kan vara både
kvantitativa respektive kvalitativa. Kommandot har
möjlighet att använda dummyvariabler, multipla interaktioner och viktning av
varje ingående post. Exempel: ===================== LOGISTIC grupp = age (sex) lakare vc omrade WEIGHTVAR = viktning ===================== Mer om logistic-kommandot hittar du på sidan om logistisk regression |
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 |
REGRESS | Detta kommando gör en enkel eller multipel regression. Minsta
kvadratmetoden används för att bestämma koefficienter. Kommandot har
möjlighet att använda dummyvariabler, multipla interaktioner och viktning av
varje ingående post. Exempel: ===================== REGRESS diagnoses_per_visits_patients = age_gp ===================== REGRESS diagnoses_per_visits_patients = age_gp (sex_gp) age_pat (sex_pat) diagnoses_per_visits_gps ===================== REGRESS lakare = age (sex) (grupp) vc omrade WEIGHTVAR = viktning ===================== Mer om regress-kommandot hittar du på sidan om multipel linjär regression |
RELATE | Efter ett read-kommando finns en datatabell i datorns minne. Vill man
länka en annan tabell används relate-kommandot. Den nya tabellens variabler
kan då bearbetas som om de hade funnits i den första tabellen. Normalt döljs
poster som inte representeras i båda tabellerna. Om man lägger till ALL
visas alla poster i den första tabellen även om en del av posterna inte är
representerade i den andra tabellen. Det vanliga är att man bara länkar
tabeller där varje post finns representerad i båda tabellerna. När man anger
relate måste man givetvis ange vilket fält som identifierar varje post. Det
här fältet bör innehålla ett unikt värde för varje post (rad). Fälten som
identifierar posterna kan ha olika namn i de två tabellerna. Dessa fältnamn
anges i kommandot separerade av dubbelkolon. Man kan köra flera
relate-kommandon efter varandra och på så sätt länka flera tabeller med den
som är inläst med senaste read-kommandot. Ju fler tabeller som relateras
desto mer ansträngande för datorn. Även om du kan ha oändligt många tabeller
avråds från att samtidigt länka fler än 5-10 st (beroende på din dators
internminne och processorhastighet). Nästa gång du kär ett read-kommando
bryts länkarna. Begränsningen i antalet samtidiga länkade tabeller är sällan
ett problem eftersom man efter en eller ett par analyskommandon kan köra ett
read-kommando på den första tabellen och sedan länka andra tabeller varvid
man gör andra analyser. Exempel på relate-kommandot: ===================== RELATE sf36x1_dim_pf UniqueKey::UniqueKey ===================== RELATE viewPatient famidnum :: famidnum |
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. |
WRITE | Detta kommando kopierar (exporterar) alla variabler och deras innehåll
till en annan datatabell. Datatabellen kan vara en annan tabell i en
Epi-Info fil. Det kan också vara en helt annan filtyp, exempelvis excelfil,
dBase, Foxpro, text, etc. Man kan välja om man skall skriva över den andra
tabellen om den finns eller om data läggs till som nya poster. Man kan styra
om alla tillgängliga variabler skall exporteras (anges med *) eller bara
några. Exempel: ===================== WRITE APPEND "Epi Info" 'd:\epi_info\demo1.mdb':table1 * ===================== WRITE APPEND "Epi Info" 'd:\epi_info\demo1.mdb':table1 age sex group ===================== WRITE APPEND "Epi Info" 'd:\epi_info\demo1.mdb':test1 * EXCEPT bohid boh aliennumber ===================== WRITE REPLACE "Excel 4.0" 'C:\Epi_Info\projekt_a.xls' * ===================== |
Å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.