Løsning til øvelsesopgaver dag 4 spg 5-9 5: Den multiple model Vi tilføjer nu yderligere to variable til vores model : Køn og kolesterol SBP = a + b*age + c*chol + d*mand hvor mand er 1 for mænd, 0 for kvinder (en såkaldt dummy-variabel). Det betyder at modellen siger SBP = a + b*age + c*chol + d SBP = a + b*age + c*chol for mænd for kvinder Vi bruger modellen til at sige noget om forskellene i middelværdier: Her angiver d altså forskellen i middel SBP for mænd og kvinder med samme alder og samme kolesteroltal. Tilsvarende angiver b forskellen i middel SBP for to personer af samme køn og samme kolesteroltal men med et år imellem. Endelig angiver c forskellen i middel SBP for to personer af samme køn og samme alder men med en forskel på 1 i kolesteroltal. Disse tre størrelser er indbyrdes justerede. Dvs de hver især beskriver effekten af hver enkelt variabel justeret for de øvrige variable. Vi finder estimaterne vha SAS (bemærk at sex er en klassevariabel og derfor sættes i class-linien). model sbp= sex age chol / solution clparm; Den interessante del af output Standard Parameter Estimate Error t Value Pr > t 95% Confidence Limits Intercept 87.51350710 B 8.64150885 10.13 <.0001 70.56182660 104.46518760 sex 1-7.38989613 B 1.47884982-5.00 <.0001-10.29089295-4.48889932 sex 2 0.00000000 B..... age 1.01473606 0.15232970 6.66 <.0001 0.71591737 1.31355475 chol 0.04648699 0.01601080 2.90 0.0037 0.01507928 0.07789470 Lad os prøve at køre den samme analyse med mand-variablen i stedet for: Kommentar [SR1]: a Kommentar [SR2]: d bemærk at kvinderne er referencen (vi får et 0 for kvinder). Dvs de -7.4=d skal trækkes fra for mænd Kommentar [SR3]: b Kommentar [SR4]: c data framing; set framing; mand=sex; if sex=2 then mand=0; class mand; model sbp= mand age chol / solution clparm;
Vi ser at interceptet ændres og at effekten svarende til køn vendes rundt (her er mænd referencen): Standard Parameter Estimate Error t Value Pr > t 95% Confidence Limits Intercept 80.12361097 B 8.56354654 9.36 <.0001 63.32486580 96.92235613 mand 0 7.38989613 B 1.47884982 5.00 <.0001 4.48889932 10.29089295 mand 1 0.00000000 B..... age 1.01473606 0.15232970 6.66 <.0001 0.71591737 1.31355475 chol 0.04648699 0.01601080 2.90 0.0037 0.01507928 0.07789470 Se min video på http://youtu.be/9qz9d3r4aio hvor jeg forklarer og sammenligner disse to output. Prøv nu at køre en analyse hvor du bruger dummy-variablen mand som kvantitativ, dvs model sbp= mand age chol / solution clparm; Her vil du få præcis samme tal ud som i det første output ovenfor (baseret på sex som klassevariabel). Det vi reelt gør i denne analyse med mand som kvantitativ er at benytte mand som regressionsvariabel. Men da mand kun har koderne 0 og 1 betyder det at vi i vores model kun får lagt et tal til for mænd som har kode 1. Dette tal er præcis d i vores model SBP = a + b*age + c*chol + d*mand Altså har vi snydt SAS til at estimere et niveau for hhv mænd og kvinder pba en kvantitativ variabel. Vi skal nu videre i opgaven og lave modelkontrol. Vi skal derfor have SAS til for hver person i vores datasæt at bestemme residualer og prædikterede værdier. Se SAS hjemmesiden hvordan vi klarer dette ved at tilføje en outputlinie til glm: model sbp= sex age chol / solution clparm; output out=resdata p=pred r=res; Dermed giver SAS os et nyt datasæt ved navn resdata at arbejde videre med. Dette datasæt er en kopi af det oprindelige datasæt framing men har tilføjet to variable med navnene pred og res som indeholder hhv de prædikterede værdier og residualerne. Vi laver et print for at se vores nye datasæt: proc print data=resdata (obs=5); age Obs id sex age frw sbp sbp10 dbp chol cig chd yrschd death yrsdth cause Sq pred res 1 1070 2 45 93 100 110 62 220 0 0 18 0 18 0 2025 143.404-43.4038 2 1081 1 48 93 108 120 70 340 0 0 18 0 18 0 2304 144.637-36.6365 3 1123 2 45 91 160. 100 171 0 0 14 9 15 4 2025 141.126 18.8741 4 1215 1 50 110 110 130 70 224 0 0 18 0 18 0 2500 141.273-31.2735 5 1267 1 48 85 110 130 70 229 25 0 18 0 18 0 2304 139.476-29.4765 Kommentar [SR5]: Observeret SBP for person nr 1 Kommentar [SR6]: Prædikteret værdi for person nr 1 = 87.5+1.01*45+0.05*220=143.4 Iflg estimaterne ovenfor (det er en kvinde, derfor ikke noget tal svarende til køn) Kommentar [SR7]: Residualet, forskellen mellem observeret og prædikteret værdi, 100-143.4=-43.4
Vi arbejder nu videre med residualerne og de prædikterede værdier i dette datasæt a) Check af varianshomogenitet plot af residualer mod prædikterede værdier. loess x=pred y=res; I dette plot skal punkterne helst lige i en pølse dvs spredt lige meget over og under y=0 og med samme spredning over hele x-aksen. Har vi det kan vi antage at varianserne er ens uanset om personerne har høj eller lav SBP (høj eller lav prædikteret værdi). Der er måske en tendens til at variationen stiger med stigende prædikteret værdi. b) normalitet qqplot af residualerne proc univariate data=resdata noprint; qqplot res / normal( mu=est sigma=est);
Væmmeligt plot! Residualerne er for store i den højre ende (højreskæv) og for store i den lave ende (mast ind fra venstre). Dette kan en log-transformation tit hjælpe på fordi den gør forskellen større blandt de små observationer og maser de høje observationer sammen. Histogrammet af residualerne afslører det samme: histogram res; density res; Vi vil gerne trække i residualerne til venstre, mase dem til højre for at få noget der kommer tættere på normalfordelingen. c) Linearitet grafisk check ved plot af residualer mod de kvantitative variable:
Plotter først residualer mod age incl en udglatning for let at kunne spotte tendens: loess x=age y=res; Det ser ret godt ud intet tegn på tendenser. Den udglattede kurve er praktisk talt flad. Tilsvarende plotter vi residualerne mod chol: loess x=chol y=res; Her bøjer udglatningen måske en anelse nedad for de store værdier. Det betyder at vi for de høje kolesterolværdier har fået overestimeret middelværdien residualerne er for negative (for små), i dette område rammer vores regressionslinie ikke helt i midten af observationerne. Vi har dog meget sparsomt materiale i denne ende af skalaen og vi har derfor næppe et problem med lineariteten. Dette kunne vi lave et formelt test for ved at udvide vores model til SBP = a + b*alder + c*chol + d*mand + e*(chol*chol)
og undersøge om kvadratleddet kan testes væk (svarende til at e=0). Mere om kvadratledstest i den multiple model nedenfor. 7 : Vi forsøger os nu med en logaritmetransformation af responsen SBP for at se om vi kan få antagelserne til at være bedre opfyldt. Vi definerer først vores nye responsvariabel logsbp, laver derefter helt den samme analyse som ovenfor men med logsbp som respons og derefter laver vi helt de samme plots. data framing; set framing; logsbp=log(sbp); model logsbp= sex age chol / solution clparm; output out=resdata p=pred r=res; Laver først et print af mit nye resdata datasæt det gamle overskrives og derfor får jeg nye prædikterede værdier og residualer : y y l s r d r c a o b c s e s a g m g p O s a f s p d h c c c a d u e a S r r b i e g r b 1 b o i h h t t s S n B e e s d x e w p 0 p l g d d h h e q d P d s 1 1070 2 45 93 100 110 62 220 0 0 18 0 18 0 2025 0 4.60517 4.95075-0.34558 2 1081 1 48 93 108 120 70 340 0 0 18 0 18 0 2304 1 4.68213 4.96034-0.27821 3 1123 2 45 91 160. 100 171 0 0 14 9 15 4 2025 0 5.07517 4.93610 0.13908 4 1215 1 50 110 110 130 70 224 0 0 18 0 18 0 2500 1 4.70048 4.93871-0.23823 5 1267 1 48 85 110 130 70 229 25 0 18 0 18 0 2304 1 4.70048 4.92716-0.22668 Når jeg skal lave plots som ovenfor kan jeg bare copy-paste mine kommandoer ovenfor. Alt hvad jeg skal bruge ligger i datasættet resdata og prædikterede værdier og residualer har samme variabelnavne som før. Kommentar [SR8]: Vores nye respons logsbp Kommentar [SR9]: Prædikteret værdi af logsbp Kommentar [SR10]: Residualet 4.6-4.95 loess x=pred y=res; proc univariate data=resdata noprint; qqplot res / normal( mu=est sigma=est); histogram res; density res; loess x=age y=res; loess x=chol y=res; Vi får plots: Homogenitet (resisdualer vs prædikterede) en anelse bedre end det tilsvarende plot ovenfor.
Normalitet (bedre end ovenfor men logaritmen er ikke tilstrækkelig til at opnå en normalfordeling). Linearitet af alder (residualer vs age) - ok
Linearitet af kolesterol (residualer vs chol) ok Overordnet giver logaritmetransformationen af responsen det bedste fit en anelse mht homogenitet men mest mht normalitet selvom den langt fra er opfyldt. Mit valg er derfor at arbejde videre med logaritmetransformeret respons, logsbp. 8 : Formelle test for linearitet af age og chol. Vi udvider den multiple lineære regressionsmodel: logsbp = a + b*age + c*chol + d*mand + e*(age*age) + f*(chol*chol) og undersøger om vi kan fjerne disse fra modellen. Vi fitter først denne model: model logsbp= sex age chol age*age chol*chol / solution clparm;
I dette output skal vi KUN interessere os for p-værdierne for age*age og chol*chol. Vi kan ikke fjerne dem begge på en gang i det hvert test er betinget af at alle de andre variable er med i modellen. Vi vælger derfor at fjerne age*age fordi vi her har den højeste p-værdi, p=0.1176. Standard Parameter Estimate Error t Value Pr > t 95% Confidence Limits Intercept 3.520568188 B 0.60423948 5.83 <.0001 2.335255828 4.705880548 sex 1-0.046226063 B 0.00929117-4.98 <.0001-0.064452173-0.027999954 sex 2 0.000000000 B..... age 0.042065171 0.02272257 1.85 0.0643-0.002508787 0.086639128 chol 0.001520235 0.00070110 2.17 0.0303 0.000144913 0.002895557 age*age -0.000337416 0.00021548-1.57 0.1176-0.000760119 0.000085286 chol*chol -0.000002513 0.00000141-1.78 0.0759-0.000005288 0.000000262 Vi kører derfor nu modellen uden age*age : model logsbp= sex age chol chol*chol / solution clparm; og finder at vi også må fjerne kvadratleddet hørende til kolesterol (p=0.09). Standard Parameter Estimate Error t Value Pr > t 95% Confidence Limits Intercept 4.454231854 B 0.09792405 45.49 <.0001 4.262138297 4.646325412 sex 1-0.046353813 B 0.00929562-4.99 <.0001-0.064588650-0.028118976 sex 2 0.000000000 B..... age 0.006516201 0.00095702 6.81 <.0001 0.004638863 0.008393538 chol 0.001465834 0.00070060 2.09 0.0366 0.000091491 0.002840177 chol*chol -0.000002377 0.00000141-1.68 0.0926-0.000005149 0.000000394 Herligt. Vi er derfor tilbage til modellen vi startede med i spørgsmål 6: model logsbp= sex age chol / solution clparm; Standard Parameter Estimate Error t Value Pr > t 95% Confidence Limits Intercept 4.591390394 B 0.05432530 84.52 <.0001 4.484822753 4.697958034 sex 1-0.045849901 B 0.00929687-4.93 <.0001-0.064087172-0.027612630 sex 2 0.000000000 B..... age 0.006524175 0.00095763 6.81 <.0001 0.004645636 0.008402715 chol 0.000298941 0.00010065 2.97 0.0030 0.000101495 0.000496387 Kommentar [SR11]: a Kommentar [SR12]: d Kommentar [SR13]: b Kommentar [SR14]: c 9 : Fortolkning af estimaterne: Vi har desværre log-transformeret vores outcome, så estimaterne er ikke umiddelbart fortolkelige fordi de angiver forskelle i middelværdier for logsbp. Det er der ingen der kan forstå : Mænd ligger 0.046 lavere i logsbp. Heldigvis har vi helt styr på hvordan vi kommer tilbage til den oprindelige skala nemlig ved at tage antilog (se Dag2 item G om rapportering af resultater på log-skala). Vi finder
Mænd vs kvinder : exp(-.0458) = 0.955. Mænd ligger derfor 1-0.955 = 4.5% lavere end kvinder. Denne sammenligning gælder for mænd og kvinder med samme alder og samme kolesteroltal. Forskel på to personer af samme køn og med samme kolesteroltal med en forskel i alder på et år : exp(0.0065)=1.0065 eller at den ældre ligger 0.65% højere. Det er et meget lille tal lad os derfor rapportere forskellen i ti-år i stedet. For en difference på 10 år finder vi forskel i middelværdien af logsbp er 10*0.0065. Det giver os en forskel på exp(10*0.0065) = 1.067 eller 6.7%. Forskel på to personer af samme køn og alder : exp(0.000298)=1.000298 eller 0.03% eller 0.3 promille. Igen et meget lille tal. Men dog højsignifikant (p=0.003)