merge
¶Ofta när man gör statistiska analyser behöver man kombinera olika datamängder. Man kanske hämtar information om den oberoende variabeln från en källa, och vill samköra den med en beroende variabel från en annan källa. Vi har alltså samma analysenheter i de båda datamängderna, men vill kombinera variablerna. Då ska vi använda kommandot merge
.
Ett annat scenario är deär man har olika datamängder med samma variabler, fast med olika analysenheter. Då ska man istället använda kommandot append
- det är egentligen som att klistra in fler observationer längst ner i datamängden. Men eftersom merge
är lite klurigare ska vi fokusera på det här.
Med merge
-kommandot kan vi göra tre (eller egentligen två) olika typer av sammanslagningar. Enklast är 1:1
. Då har vi samma analysenheter i båda datamängderna. Tex samma individer, eller samma länder, och vill lägga till ny information om dem. Vi behöver en matchningsvariabel som visar landets eller personens identitet så att vi kan matcha ihop dem.
Men vi kan också matcha m:1
. Det betyder att vi har många analysenheter i datamängden som är öppen i Stata, och vill matcha på data från ett färre antal enheter på en högre nivå. Till exempel kanske vi har data på personer i Europa, och nu vill vi lägga till variabler på landsnivå. Vi kanske har gjort en enkätundersökning, och nu vill vi se hur svaren påverkas av om man bor i ett EU-land eller inte. Alla personer i Sverige kommer då få samma värde - vi bor i ett EU-land. Alla personer i Norge får också samma värde - de bor inte i ett EU-land. I vår individdatamängd kan vi då alltså ha tusentals personer, och kombinera det med en datamängd med et trettiotal observationer (en för varje land).
Nästan samma sak är att matcha 1:m
. Det är precis samma grej, men vi börjar då med att land-datamängden i Stata, och lägger till individdatan.
Vi börjar med den enklaste varianten - när vi har samma typ av analysenheter i de båda datamängderna, och vill lägga till fler variabler. Säg att vi vill kombinera information om graden av demokrati i ett land, med graden av korruption i landet. Vi kan hämta information om demokratin från Freedom House. Datan finns i Excelformat, men det är bara att klippa ut de relevanta bitarna och lägga in i ett Stata-dataset. Sen hämtar vi information om korruption från Transparency International, och gör på samma sätt där.
Vi har nu två dataset, fh2017.dta
och cpi2018.dta
. Nedan laddar vi in fh2017.dta
och kollar på de fem första raderna i datamängden.
cd "/Users/anderssundell/Dropbox/Jupyter/stathelp/data"
use "fh2017.dta", clear
list in 1/5
Vi har alltså fyra variabler: landsnamnet country
, graden av politiska rättigheter från 1-7 fh_pr
, graden av medborgerliga rättigheter fh_cl
och en sammanfattande beskrivning fh_status
. Nu gör vi samma sak med korruptionsdatan.
use "cpi2018.dta", clear
list in 1/5
Här har vi bara två variabler: landsnamnet country
och graden av korruption cpi2018
(där låga värden betyder mer korruption). Nu ska vi slå ihop de två datamängderna.
country
. Dvs, graden av demokrati i Afghanistan ska matchas ihop med graden av korruption i Afghanistan. Har man ingen sådan identifikationsvariabel går inte sammanslagningen att göra. Generellt sett är det dock att föredra om ID-variabeln är ett nummer, och inte en textvariabel. Det minskar risken för stavningsfel osv. Man kan också matcha på flera variabler - en vanlig tillämpning är att man matchar på både land och år. Dvs Sverige 2008 ska matchas ihop med Sverige 2008, osv.Vi använder kommandot merge
. Strukturen är att man skriver merge
, sedan vilken typ av matchning man vill göra, sedan vad matchningsvariabeln är, och sedan vilken datamängd man vill matcha ihop den öppna datan med. Vi vill matcha 1:1
, och göra det med demokratidatan. Det ser ut såhär:
merge 1:1 country using "fh2017.dta"
Nu är sammanslagningen klar. Men det finns felaktigheter att åtgärda. Tabellen visar att 168 observationer matchades framgångsrikt. Men vi kan också se att det var 50 enheter som inte kunde matchas: 12 från "master"-datamängden, dvs den vi hade inladdad först (dvs korruptionsdatan). Det var också 38 länder i "using"-datan, dvs demokratidatan, som inte kunda matchas ihop.
Ibland är det här inget större problem, tex om man matchar ihop data om EU-länder med data för hela världen. Då kommer det såklart inte gå att matcha ihop afrikanska länder med EU-datan.
Men här har vi möjliga problem, eftersom det finns länder i båda datamängderna som inte hittade någon match. Ofta beror det på att det är fel i identifikationsvariabeln.
Som tur är hjälper Stata oss att lätt identifiera de felaktiga observationerna, eftersom det har skapats en ny variabel som heter _merge
. Den visar resultatet av matchningen. Observationer med koden 1 fanns bara i den ursprungliga datan - observationer med värdet 2 fanns bara i den nya datan. Observationer med värdet 3 matchades ihop bra. Vi kan lista alla observationer som inte matchades, dvs alla som inte hade värdet 3:
list country _merge if _merge!=3
Nästa steg är att se efter om det finns några länder som dyker upp i båda listorna. Ett slående exempel är USA. Vi ser att landet i ena datamängden heter "United States of America" och i andra "United States". På samma sät ser vi att Sydkorea heter "Korea, South" i ena datan och "South Korea" i den andra. När så är fallet kan Stata inte matcha ihop observationerna.
Vi måste därför rätta till datan så att identifikationsvariablerna stämmer överens. Vi går då in i datan och ändrar på variabeln - tex kan vi i demokratidatan byta från "United States" till "United States of America" och "Korea, South" till "South Korea". När vi sedan kör om vår dofil bör antalet omatchade länder ha minskat.
_merge
-variabeln¶När vi är nöjda med matchningen kan vi ta bort data vi inte behöver. Till exempel den omatchade datan, eller observationer som inte fanns med i vår ursprungliga datamängd. Om vi till exempel vill ta bort observationer som bara fanns i demokratidatan skriver vi:
drop if _merge==2
Sedan kan vi droppa _merge
-variabeln. Det är ett måste om vi vill lägga till mer data - Stata protesterar om det redan finns en sådan. Därför skriver vi:
drop _merge
Nu kan vi istället tänka att vi har en datamängd med individer, som tex visar varje persons kön och dennes nöjdhet med demokratin. Jag har här hittat på lite data. Vi laddar in den och kollar på de 10 första personerna (det är bara 15 i hela datamängden):
use "satisfactiontest.dta", clear
list in 1/10
Vi har alltså personer från Afghanistan och Albanien, som är olika nöjda med demokratin, och där vissa är kvinnor, och andra inte är det. Nu provar vi att matcha på demokratidatan med hjälp av merge m:1
. Men det är fortfarande country
som är matchningsvariabeln.
merge m:1 country using "fh2017.dta"
15 observationer matchades, som det var tänkt. 203 observationer matchades visserligen inte, men alla de återfanns i demokratidatan. Vi hade ju bara personer från 3 länder, så alla andra länder blir omatchade.
Nu tittar vi igen på de första 10 personerna:
list in 1/10
Notera nu att alla variablerna från demokratidatan - fh_pr
, fh_cl
och fh_status
har samma värde för alla personer från ett visst land. Dvs, alla personer från Afghanistan har samma värde på variabeln fh_pr
, eftersom graden av politiska rättigheter är densamma för alla invånare i Afghanistan. Variabeln varierar bara på landsnivå.
Om vi hade börjat med att ha landsdatan inladdat i stata hade vi fått skriva merge 1:m using "satisfactiontest.dta"
istället, men slutresultatet hade blivit detsamma.
_merge
-variabeln när du är färdig med matchningen, så att det går lätt att matcha på igen.Merge
-kommandot passar alltså bra när vi ska lägga till fler variabler. Vill vi lägga till observationer, som har information på samma variabler, ska vi istället använda append
. Det skulle till exempel kunna vara att kombinera enkätundersökningar med identiska frågor som gjordes 2018 och 2019. Vi kan då med append
lägga de olika enkätsvaren i en och samma datamängd.