I ett annat inlägg gick vi igenom regressionsanalys med interaktionseffekter. Variablerna hade där bara två värden. Men hur gör man när en eller båda variablerna i interaktionen är kontinuerliga skalor, med många värden? I princip gör man samma sak, men man får presentera och tolka resultaten på lite annat sätt. Det kommer vi att gå igenom i det här inlägget. För den som vill läsa mer rekommenderas också denna standardartikel på området.
För att ha något att jobba med kommer vi i det här exemplet att använda oss av data från den amerikanska General Social Survey, som är en enkätundersökning med vanliga medborgare, med frågor om allt möjligt. Vi kommer använda versionen från 2016. Ladda ned den och lägg den i projektmappen för att följa med i exemplet. Jag har lagt den i en undermapp som heter data, och anger därför också det när jag öppnar filen.
För att spara plats i inlägget har koden för omkodningar komprimerats, och förklaras inte här. Om du vill läsa mer om vad det är som händer, se det tidigare inlägget.
cd "/Users/xsunde/Dropbox/Jupyter/stathelp"
use "data/GSS2016.dta", clear
recode sex (1=0) (2=1), generate(woman)
recode childs (0=0) (1/8 = 1), generate(dum_kids)
I det tidigare inlägget såg vi att effekten av att ha barn skiljde sig åt mellan kvinnor och män. Men variabeln för barn vi använde där var en så kallad dummyvariabel, med värdena 0 (inga barn) och 1 (ett eller fler barn). Nu ska vi istället använda en kontinuerlig barnvariabel, childs, som visar hur många barn man har i siffror. Variabeln är dock kapad så att värdet 8 indikerar 8 eller fler barn.
Först gör vi en vanlig regressionsanalys, utan interaktion:
reg realrinc woman childs age
Koefficienten för childs visar nu den förväntade effekten av att öka variabeln ett steg, dvs ha ett barn till. Den är svagt negativ och inte signifikant. Det verkar alltså inte vara någon större skillnad mellan de som har få och de som har många barn. Nu lägger vi till interaktionen med woman-variabeln. Det gör vi automatiskt genom att skriva in i regressionskommandot att de två variablerna hör ihop. Vi måste dock nu lägga till ett c. framför childs-variabeln, för att visa att det är en continous variabel, en skala.
reg realrinc woman##c.childs age
Som vanligt när man gör interaktioner gäller det att komma ihåg att man inte kan tolka koefficienterna i interaktionen på vanligt sätt. Woman betyder nu "effekten" av att vara kvinna för de som har noll barn. Childs betyder nu effekten av att få ett barn till för de som har 0 variabeln woman, dvs män. Termen c.woman#c.childs är interaktionstermen, och visar alltså effekten av den nya variabeln som är värdet på woman gånger värdet på childs. I praktiken blir det hur koefficienterna förändrar sig när man ändrar på den andra variabeln.
För att räkna ut effekten av barnafödande för båda värdena av woman tar vi grundkoefficienten för childs, och adderar sedan koefficienten för interaktionstermen, gånger värdet på womanvariabeln. Alltså:
För woman = 0 (män): $855.1288 -2060.054*0 = 855.1288$
För woman = 1 (kvinnor): $855.1288 -2060.054*1 = -1204.9252$
Vi ser alltså att män som får ett barn till tjänar lite mer, medan kvinnor tjänar mindre. Skillnaden i effekt mellan grupperna är signifikant, ser vi på signifikansvärdet på interaktionstermen. Men - det betyder inte att effekterna i sig är signifikanta, om vi jämför med noll. Dvs, i gruppen kvinnor, är effekten av barnafödande signifikant negativ? Och i gruppen män, är effekten av barnafödande signifikant positiv? För att räkna ut det använder vi marginskommandot, och kör direkt efter kommandot marginsplot för att illustrera koefficienterna.
margins, dydx(childs) at(woman=(0 1))
marginsplot, yline(0)
Som vi räknade ut manuellt ser vi att effekten av childs är positiv för de som har noll på variabeln woman, dvs männen, och negativ för kvinnorna. Men effekterna i sig är inte signifikant skilda från noll. Det betyder att vi kan vara rätt säkra på att effekten av barnafödande i populationen (och inte bara i urvalet) är olika för kvinnor och män, men vi kan samtidigt inte vara säkra på att någon av dem är något annat än noll! Det här kan vara lite svårt att greppa.
Men det man behöver tänka är att "inte signifikant skild från noll" inte betyder att den definitivt är noll. Det är bara mer än 5% risk att den är noll. Men om man ser på grafen ser vi att konfidensintervallen för de två koefficienterna bara överlappar lite grann. För att de sanna effekterna ska vara desamma måste alltså effekten för män vara i den nedersta delen av intervallet, samtidigt som effekten för kvinnor är i den översta. Sammanlagt blir den sannolikheten mindre än 5%. Klurigt, men rimligt.
Nu ska vi räknar ut vad skillnaden mellan män och kvinnor är, för olika värden av variabeln childs. Det gör vi på genom att ta grundkoefficienten för woman, och sedan addera interaktionstermen gånger olika värden av barn.
0 barn: -6100.754 -2060.054 0 = -6100.754
1 barn: -6100.754 -2060.054 1 = -8160.808
2 barn: -6100.754 -2060.054 2 = -10220.862
3 barn: -6100.754 -2060.054 3 = -12280.916
4 barn: -6100.754 -2060.054 4 = -14340.97
5 barn: -6100.754 -2060.054 5 = -16401.024
6 barn: -6100.754 -2060.054 6 = -18461.078
7 barn: -6100.754 -2060.054 7 = -20521.132
8 barn: -6100.754 -2060.054 * 8 = -22581.186
Det blir alltså åtta olika koefficienter, och varje blir 2060.054 mindre än den föregående. Nu kan man inte ha 3.5 barn, men det går lika bra att göra interaktioner även med variabler som har decimalvärden. Då är det bara att sätta in dem i multiplikationen.
Nu tar vi fram koefficienterna med marginskommandot för att också få ut signifikansnivåer och konfidensintervall:
margins, dydx(woman) at(childs=(0/8))
marginsplot, yline(0)
De åtta punkterna med konfidensintervall visar alltså de åtta koefficienterna vi nyss räknade ut. Vi ser att koefficienten för woman - alltså skillnaden mellan kvinnor och män - blir större och större ju fler barn man har. Alla konfidensintervall är också skilda från noll, vilket betyder att effekten är signifikant överallt.
Att konfidensintervallen varierar har att göra med var observationerna befinner sig. Regressionslinjen kommer dras genom observationernas tyngdpunkt, och varierar mer i ändarna kring den. Därför är intervallen som smalast där det finns flest observationer - mellan 1 och 3 barn. Medelvärdet i datan är 1,8 barn.
Slutligen tar vi fram predicerade värden, med hjälp av marginskommandot. Det enklaste sättet är då att visa förväntad inkomst för kvinnor och män, vid olika antal barn. Tänk här på att det spelar roll i vilken ordning man skriver variablerna inom at-option. Variabeln som står först kommer hamna på x-axeln, och den andra styr linjernas färger. Tabellen blir också rätt stor, eftersom vi nu ber om 18 (9 * 2) olika koefficienter.
margins, at(childs=(0/8) woman=(0 1))
marginsplot
Nu är det dags att komplicera det hela ytterligare. Hur blir det om vi har två variabler som båda är skalor med många värden? I grund och botten gör vi exakt samma sak som vi gjort i de två tidigare fallen. Vi får bara tänka på att tolka det hela rätt.
Säg att vi nu vill titta på sambandet mellan barnafödande och ålder, istället för kön. Det blir lite mystiskt i och med att hur många barn man har är så starkt förknippat med ålder, men vi prövar, för exemplets skull. Vi kör en regression där vi interagerar antal barn med ålder (och skriver c. framför båda variablerna, eftersom de är skalor):
reg realrinc woman c.childs##c.age
Faktum är alltså att det finns en interaktionseffekt. Eftersom interaktionstermen är negativ blir effekten av barnafödande mer negativ ju äldre man blir, och motsvarande blir effekten av ålder mer negativ ju fler barn man har.
För att till exempel få fram effekten av att få ett barn till vid olika åldrar räknar vi på följande sätt:
20 år gammal: 6347.314 - 138.2845 20 = 3581.624
30 år gammal: 6347.314 - 138.2845 30 = 2198.779
40 år gammal: 6347.314 - 138.2845 40 = 815.934
50 år gammal: 6347.314 - 138.2845 50 = -566.9108
60 år gammal: 6347.314 - 138.2845 * 60 = -1949.756
Det kan som vanligt illustreras med margins och marginsplot:
margins, dydx(childs) at(age=(20(10)60))
marginsplot, yline(0)
Och för att få fram effekten av att bli ett år äldre vid olika antal barn räknar vi:
0 barn: 474.4715 - 138.2845 0 = 474.4715
2 barn: 474.4715 - 138.2845 2 = 197.9026
4 barn: 474.4715 - 138.2845 4 = -78.6664
6 barn: 474.4715 - 138.2845 6 = -355.2354
8 barn: 474.4715 - 138.2845 * 8 = 631.8044
margins, dydx(age) at(childs=(0(2)8))
marginsplot, yline(0)
Klurigast blir det om vi ska räkna ut predicerade värden. Låt oss säga att vi vill ha ålder på x-axeln. Då får vi en linje för varje antal barn. Men för att det inte ska bli för plottrigt ritar vi bara ut några valda värden, till exempel 0, 3 och 6 barn. De andra linjerna dras ju emellan.
margins, at(age=(20(10)70) childs=(0 3 6))
marginsplot
Här ser vi alltså att de som har 0 barn förväntas tjäna mer och mer ju äldre de blir. Och de som har tre barn tjänar lika mycket hela tiden. Medan de som har 6 barn tjänar mindre och mindre.
Sen får man tänka på att vi nu har delat in datan i ganska många undergrupper, och vi hade bara ca 1600 observationer att jobba med. Ju fler interaktioner man gör, desto känsligare blir datan för outliers, observationer med extrema värden. Om det till exempel är någon person som är väldigt gammal eller har väldigt många barn kommer den få stor betydelse för hur linjerna dras. Ofta är det därför bättre att slå ihop värden så att man till exempel jämför de med och utan barn, eller de över och under 40 år, osv.
Interaktionsanalyser är ofta teoretiskt motiverade, och kan visa på intressanta skillnader i datan. Men tänk på att målsättningen vanligtvis inte är att bygga en karta i skala 1:1 av verkligheten, utan att koka ner stora mängder data till något enkelt och begripligt. Bara för att det går att hitta en signifikant interaktion betyder inte det att den är intressant, eftersom det alltid finns en risk för "overfitting", att man bygger en modell som passar perfekt till just det urval vi jobbar med för stunden.