Statystyka medyczna II. 7. Wstęp do regresji logistycznej. Regresja logistyczna prosta, porównanie z miarami ryzyka. Dane The Western Collaborative Group Study (WCGS) badanie epidemiologiczne zaprojektowane, by sprawdzić powiązanie pomiędzy osobowością typu A (Type A behavior pattern, TABP) a chorobą niedokrwienną serca (CHD). id age arcus behpat height weight chd69 chol dbp sbp smoke ncigs agec dibpat bmi wghtcat typchd69... 2343 50 1 A1 67 200 No 249 90 132 Yes 25 46-50 Type A 31.32101 170-200 0... 13033 54 0 B4 67 150 No 242 72 110 Yes 12 51-55 Type B 23.49076 140-170 0... 3526 59 1 A1 70 200 No 258 94 158 No 0 56-60 Type A 28.69388 170-200 0... 13146 39 <NA> A2 72 176 Yes 273 96 140 No 0 35-40 Type A 23.86728 170-200 2... 12927 44 0 A1 71 160 No 214 80 126 No 0 41-45 Type A 22.31303 140-170 0... 2063 40 1 A1 72 175 Yes 205 80 110 No 0 35-40 Type A 23.73167 170-200 1... Opis zmiennych id id pacjenta age wiek (w latach) arcus arcus senilis, obwódka rogówki (0/1) behpat behavior pattern, typ osobowości (A1/A2/B3/B4) height wzrost (w calach) weight waga (w funtach) chd69 choroba niedokrwienna serca (różnego rodzaju) (0/1) chol poziom cholesterolu dbp ciśnienie rozkurczowe (mmhg) sbp ciśnienie skurczowe (mmhg) smoke self-reported smoking (Tak/Nie) ncigs liczba wypalanych papierosów zmienne pochodne agec wiek w kategoriach 35 40, 41 45, 46 50, 51 55, 56 60 dibpat typ osobowości A/B bmi wskaźnik bmi (weight/height 2 703) wghtcat waga w kategoriach < 140, 140 170, 170 200, > 200 typchd69 typ choroby niedokrwiennej serca (0/1/2/3)
Miary ryzyka Badaliśmy zależność występowania chorób serca (CHD) od wieku. W tym celu zbadaliśmy obserwowane proporcje (P ) osób w kolejnych przedziałach wiekowych (agec) i wyznaczyliśmy podstawowe miary ryzyka: RR iloraz ryzyk, OR iloraz szans. Najmłodsza grupa wiekowa została uznana za referencyjną. Wyniki zebrane w poniższych tabelach. > cs(chd69,agec,decimal = 3) agec chd69 35-40 41-45 46-50 51-55 56-60 No 512 1036 680 463 206 Yes 31 55 70 65 36 Absolute risk 0.057 0.05 0.093 0.123 0.149 Risk ratio 1 0.883 1.635 2.156 2.606 lower 95% CI 1.515 1.074 1.431 1.65 upper 95% CI 0.515 2.489 3.249 4.116 Chi-squared = 46.653, 4 d.f., P value = 0 > cc(chd69,agec,decimal = 3) agec chd69 35-40 41-45 46-50 51-55 56-60 No 512 1036 680 463 206 Yes 31 55 70 65 36 Odds ratio 1 0.877 1.7 2.317 2.882 lower 95% CI 0.547 1.08 1.458 1.684 upper 95% CI 1.428 2.728 3.749 4.959 Chi-squared = 46.653, 4 d.f., P value = 0 Grupa wiekowa P 1 P RR OR 35 40 0.057 0.943 1.000 1.000 41 45 0.050 0.950 0.883 0.877 46 50 0.093 0.907 1.635 1.700 51 55 0.123 0.877 2.156 2.319 56 60 0.149 0.851 2.606 2.886
Model regresji liniowej i logistycznej W modelu regresji liniowej (prostej) opisujemy średnią zmiennej zależnej (wyniku) y jako funkcję liniową pojedynczej ciągłej zmiennej niezależnej (predyktora) x: E(y x) = β 0 + β 1 x. Przyjmując taką konwencję zmienną binarną y możemy potraktować jako przyjmującą wartość 1 dla osób z chorobą oraz wartość 0 dla osób zdrowych. Obserwowana proporcja chorych wśród pacjentów o danej wartości zmiennej niezależnej x jest po prostu średnią y w tej grupie. Stąd liniowy model dla zmiennej binarnej y można zapisać w postaci P (x) = E(y x) = β 0 + β 1 x, tzn. wartość oczekiwana wyniku (zmiennej y) jest funkcją liniową predyktora (x). Zauważmy, że jeżeli również x jest zmienną binarną o wartościach 0 lub 1, wtedy zwiększenie x o 1 skutkuje zmianą prawdopodobieństwa / wartości oczekiwanej Modele o takiej własności określa się jako addytywne modele ryzyka. P (1) P (0) = β 1. Oczywiście takie sformułowanie zagadnienia regresji dla binarnych wyników ma swoje ograniczenia: y nie ma rozkładu normalnego (nawet w przybliżeniu!), wynik y reprezentuje prawdopodobieństwo, zatem wartości poza przedziałem [0, 1] nie mają sensu, zazwyczaj nie ma podstaw do przyjęcia założeń, że ryzyko opisane przez y zmienia się w sposób liniowy na przedziale zmienności predyktora x.
Poniżej przedstawiono przykładowe modele łączące prawdopodobieństwo P (x) binarnego wyniku z ciągłym predyktorem x. linear exponential P(x) 0.0 0.2 0.4 0.6 0.8 1.0 P(x) 0.0 0.2 0.4 0.6 0.8 1.0 x x step function logistic P(x) 0.0 0.2 0.4 0.6 0.8 1.0 P(x) 0.0 0.2 0.4 0.6 0.8 1.0 x x W modelu wykładniczym logarytm ryzyka opisanego przez y zmienia się liniowo od wartości x, jednak nie jest ograniczony dla dużych wartości β 0 + β 1 x. W modelu dla funkcji prostej mamy dobrą własność ograniczenia wartości funkcji do przedziału [0, 1]. Ponadto modyfikując wartości skoków funkcji możemy modyfikować wpływ zmian wartości x na ryzyko P (x). Problem może stanowić brak gładkości czy chociażby ciągłości funkcji. Odpowiedzią na ten problem jest funkcja logistyczna postaci f(x) = 1 1 + exp( x) = exp(x) 1 + exp(x).
Model logistyczny opisujący zależność zmiennej binarnej y od zmiennej ciągłej x przedstawiamy w postaci P (x) = exp(β 0 + β 1 x) 1 + exp(β 0 + β 1 x). Interesująca dla nas będzie również odwrotna funkcja funkcja logit. W języku szans (odds) zmiennej y model można przedstawić również w postaci P (x) 1 P (x) = exp(β 0 + β 1 x). Jeżeli przypomnimy sytuację, w której x przyjmował wartości 0 lub 1, widzimy, że iloraz szans (odds ratio) związany z tymi wartościami wynosi P (1)/(1 P (1)) P (0)/(1 P (0)) = exp(β 1). Widzimy, że szansa y = 1 dla x = 1 wynika z mnożenia szansy dla x = 0 przez czynnik exp(β 1 ). Z tej własności wynika określenie modelu logistycznego jako multiplikatywnego modelu ryzyka. Ostatnią i w statystyce najbardziej użyteczną postacią modelu regresji logistycznej jest ( ) P (x) log = β 0 + β 1 x, 1 P (x) gdzie widzimy, że logarytm szans związany z binarnym wynikiem y (logit P (x)) jest opisany funkcją liniową ciągłego predyktora x (model logistyczny jest addytywnym modelem na skali logarytmu szans). Założenia regresji logistycznej: y ma rozkład dwupunktowy, E(y x) = P (x) jest dane funkcją logistyczną, wartości (y i ) są niezależne (próbka losowa prosta). Ponadto wśród istotnych różnic z modelem regresji liniowej: założenie o homoskedastyczności nie jest konieczne, losowa część modelu nie jest wyrażeniem addytywnym w równaniu regresji.
Badamy zależność wystąpienia choroby y = CHD od wieku x = age dla danych WCGS. Poniżej przedstawiono wykres rozrzutu dla 100 obserwacji. Wykorzystujemy funkcję glm() (generalized linear model). Model zadajemy tak jak model liniowy. Różnica polega na wskazaniu parametru family określającego rodzinę rozkładów zmiennej y oraz argumentu link określającego funkcję wiążącą (link function). W przypadku regresji liniowej parametr family= gaussian ; dla regresji logistycznej mamy family= binomial oraz funkcję wiążącą link= logit : wcgs.glm <- glm(chd69~age,data=wcgs,family=binomial()) summary(wcgs.glm) Wynikiem funkcji glm() jest obiekt klasy glm opisujący dopasowany (fitted) model: Call: --- glm(formula = chd69 ~ age, family = binomial(), data = wcgs) Signif. codes: Deviance Residuals: 0 *** 0.001 ** 0.01 * 0.05. 0.1 Min 1Q Median 3Q Max (Dispersion parameter for binomial family taken to be 1) -0.6209-0.4545-0.3669-0.3292 2.4835 Coefficients: Estimate Std. Error z value Pr(> z ) (Intercept) -5.93952 0.54932-10.813 < 2e-16 *** age 0.07442 0.01130 6.585 4.56e-11 *** Null deviance: 1781.2 on 3153 degrees of freedom Residual deviance: 1738.4 on 3152 degrees of freedom AIC: 1742.4 Number of Fisher Scoring iterations: 5
Interpretacja współczynników regresji W analizie otrzymujemy ˆβ 0 = 5.940, ˆβ 1 = 0.074. Zatem ˆβ 1 = 0.074 wyraża zmianę w log odds ratio CHD69 związaną ze wzrostem zmiennej age o 1 jednostkę (o 1 rok): ( ) ( ) P (56) P (55) log log = ( 5.940 + 0.074 56) ( 5.940 + 0.074 55) = 0.074. 1 P (56) 1 P (55) Odpowiednie odds ratio związane ze wzrostem wieku o 1 rok wynosi exp(0.074) = 1.077, zatem mamy mały, ale istotny, 8% wzrost ryzyka CHD z każdym kolejnym rokiem. Z punktu widzenia badania klinicznego bardziej istotną może być OR związane z 10-letnim wzrostem wieku, odpowiednio exp(0.074 10) = 2.105. Współczynników możemy również użyć do wyznaczenia ryzyka P (x), tj. oceny prawdopodobieństwa CHD dla osoby w wieku x, np. dla osoby w wieku 55 lat P (55) = exp( 5.940 + 0.074 55) 1 + exp( 5.940 + 0.074 55) = 0.134. > wcgs.glm.fit <- fitted(wcsg.glm) > pred.df <- data.frame(age=c(55)) > predict(wcgs.glm,pred.df,type="response",se=true) $fit 1 0.1363108 $se.fit 1 0.01183825 Estimated probability 0.0 0.2 0.4 0.6 0.8 1.0 $residual.scale [1] 1 40 60 80 100 120 Age (years)
> wcgs.glm <- glm(chd69~age,data=wcgs,family=binomial()) > summary(wcgs.glm) Call: glm(formula = chd69 ~ age, family = binomial(), data = wcgs) Deviance Residuals: Min 1Q Median 3Q Max -0.6209-0.4545-0.3669-0.3292 2.4835 Coefficients: Estimate Std. Error z value Pr(> z ) (Intercept) -5.93952 0.54932-10.813 < 2e-16 *** age 0.07442 0.01130 6.585 4.56e-11 *** --- Signif. codes: 0 *** 0.001 ** 0.01 * 0.05. 0.1 1 (Dispersion parameter for binomial family taken to be 1) Null deviance: 1781.2 on 3153 degrees of freedom Residual deviance: 1738.4 on 3152 degrees of freedom AIC: 1742.4 Number of Fisher Scoring iterations: 5 W odpowiedzi widzimy błąd standardowy, możemy otrzymać przedziały ufności: > confint(wcgs.glm) # 95% CI using profiled likelihood Waiting for profiling to be done... 2.5 % 97.5 % (Intercept) -7.02449218-4.86960992 age 0.05227351 0.09661197 > confint.default(wcgs.glm) # 95% CI based assuming asymptotic normality 2.5 % 97.5 % (Intercept) -7.01616019-4.86287169 age 0.05227038 0.09657473
Jeżeli przedział ufności nie zawiera 0, to oznacza to statystycznie istotną różnicę wartości współczynnika od wartości 0. z value jest ilorazem wartości estymatora i jego błędu standardowego wartością statystyki Walda. Mamy również p-value testu współczynnika (H 0 : współczynnik =0). Logarytm wiarogodności dla uzyskanego modelu uzyskujemy poleceniem >loglik(wcgs.glm) log Lik. -869.1781 (df=2) Następnie możemy wyznaczyć wartość statystyki LR (likelihood ratio) i odpowiednie p-value > anova(wcgs.glm,test="chisq") Analysis of Deviance Table Model: binomial, link: logit Response: chd69 Terms added sequentially (first to last) Df Deviance Resid. Df Resid. Dev Pr(>Chi) NULL 3153 1781.2 age 1 42.888 3152 1738.4 5.798e-11 *** --- Signif. codes: 0 *** 0.001 ** 0.01 * 0.05. 0.1 1 Statystyka LR porównuje wiarogodność dopasowanego modelu z modelem zerowym, bez zmiennej age, badając hipotezę, że nie ma liniowej zależności pomiędzy wiekiem a ryzykiem (log odds) CHD. Wkład pary (x i, y i ) do funkcji wiarogodności dany jest poprzez P (x i ) y i [1 P (x i )] 1 y i, zatem zakładając, że obserwacje są niezależne, funkcję wiarogodności otrzymujemy jako iloczyn n L(β) = P (x i ) y i [1 P (x i )] 1 y i. Współczynniki ˆβ = ( ˆβ 0, ˆβ 1 ) maksymalizują funkcję wiarogodności L(β). Równoważnie maksymalizują funkcję logarytmu wiarogodności n log L(β) = y i P (x i ) + (1 y i ) [1 P (x i )]. i=1 i=1
Statystykę LR definiujemy następująco: LR = 2 log Przy założeniu hipotezy zerowej (H 0 : β 1 = 0) statystyka LR ma rozkład χ 2 (1). > wcgs0.glm <- glm(chd69~1,data=wcgs,family=binomial()) >2*(logLik(wcgs.glm)-logLik(wcgs0.glm)) log Lik. 42.88761 (df=2) wiarogodność modelu bez zmiennej niezależnej wiarogodność modelu ze zmienną niezależną.
Regresja logistyczna dla kategorialnego predyktora Model regresji logistycznej jest również poprawny dla kategorialnej zmiennej niezależnej. Rozważmy nam znane już badanie ryzyka CHD od arcus senilis. Wyniki regresji logistycznej porównamy z OR dla macierzy kontyngencji. Zmienna arcus kodowana jest 0/1 i jest włączana do modelu logistycznego tak, jakby była zmienną ciągłą. Otrzymujemy poprawny wynik: współczynnik wyraża logarytm ilorazu szans związany ze wzrostem predyktora o wartość 1 (tylko wzrost o 1 jest możliwy!). Jeżeli zmienna dychotomiczna jest kodowana w inny sposób, należy zwrócić na to uwagę, by model potraktował odpowiednie wartości jak kategorie, a nie wartości zmiennej ciągłej. W drugim przykładzie rozważymy zmienną kategorialną agec o wartościach w 5 elementowym zbiorze 35 40, 41 45, 46 50, 51 55, 56 60. OR dla czterech starszych grup wyznaczamy w stosunku do najmłodszej grupy referencyjnej. Otrzymamy wyniki takie jak dla tablic kontyngencji ponieważ predyktor jest kategorialny, nie dotyczą go założenia nakładane na zmienną ciągłą.
> table(wcgs$chd69,wcgs$arcus) Unexposed Exposed No 2058 839 Yes 153 102 > exp(confint.default(wcgs.glm2) ) # a.norm 2.5 % 97.5 % (Intercept) 0.06308389 0.08761403 arcusexposed 1.25700071 2.12739815 > wcgs.glm2 <- glm(chd69~arcus,data=wcgs,family=binomial()) > summary(wcgs.glm2) Call: glm(formula = chd69 ~ arcus, family = binomial(), data = wcgs) Deviance Residuals: Min 1Q Median 3Q Max -0.4790-0.4790-0.3787-0.3787 2.3112 Coefficients: Estimate Std. Error z value Pr(> z ) (Intercept) -2.5991 0.0838-31.016 < 2e-16 *** arcusexposed 0.4918 0.1342 3.664 0.000248 *** --- $measure Signif. codes: 0 *** 0.001 ** 0.01 * 0.05. 0.1 1 (Dispersion parameter for binomial family taken to be 1) Null deviance: 1771.2 on 3151 degrees of freedom Residual deviance: 1758.2 on 3150 degrees of freedom (2 observations deleted due to missingness) AIC: 1762.2 Number of Fisher Scoring iterations: 5 > exp(wcgs.glm2$coeff) (Intercept) arcusexposed 0.07434402 1.63528010 > oddsratio(table(wcgs$chd69,wcgs$arcus),method="wald") $data Unexposed Exposed Total No 2058 839 2897 Yes 153 102 255 Total 2211 941 3152 odds ratio with 95% C.I. estimate lower upper No 1.00000 NA NA Yes 1.63528 1.257 2.127399 $p.value two-sided midp.exact fisher.exact chi.square No NA NA NA Yes 0.0003159313 0.0003407814 0.0002216321 > exp(confint(wcgs.glm2)) # p.lhood Waiting for profiling to be done... 2.5 % 97.5 % (Intercept) 0.06283227 0.08728473 arcusexposed 1.25429424 2.12406175 $correction [1] FALSE attr(,"method") [1] "Unconditional MLE & normal approximation (Wald) CI"
> wcgs.glm3 <- glm(chd69~as.factor(agec),data=wcgs,family=binomial()) > summary(wcgs.glm3) Call: glm(formula = chd69 ~ as.factor(agec), family = binomial(), data = wcgs) Coefficients: Estimate Std. Error z value Pr(> z ) (Intercept) -2.8043 0.1850-15.162 < 2e-16 *** as.factor(agec)41-45 -0.1315 0.2310-0.569 0.569298 as.factor(agec)46-50 0.5307 0.2235 2.374 0.017580 * as.factor(agec)51-55 0.8410 0.2275 3.697 0.000218 *** as.factor(agec)56-60 1.0600 0.2585 4.100 4.13e-05 *** > oddsratio(t(table(wcgs$chd69,wcgs$agec)),method="wald") > wcgs.glm3.or <- as.numeric(exp(coef(wcgs.glm3)[2:5])) $data > res <- matrix(na,nr=4,nc=3) > for (i in 2:5) { + test <- oddsratio(table(wcgs$chd69, + wcgs$agec)[,c(1,i)],method="wald") + res[i-1,] <- test$measure[2,] + } > colnames(res) <- c("or","lb-ci","ub-ci") > rownames(res) <- paste("agec",1:4,sep="_") > print(res,digits=4) OR LB-CI UB-CI agec_1 0.8768 0.5576 1.379 agec_2 1.7002 1.0970 2.635 agec_3 2.3187 1.4845 3.621 agec_4 2.8863 1.7389 4.791 No Yes Total 35-40 512 31 543 41-45 1036 55 1091 46-50 680 70 750 51-55 463 65 528 56-60 206 36 242 Total 2897 257 3154 $measure odds ratio with 95% C.I. estimate lower upper 35-40 1.0000000 NA NA 41-45 0.8768215 0.5575563 1.378903 46-50 1.7001898 1.0970460 2.634935 51-55 2.3186790 1.4845452 3.621494 56-60 2.8863138 1.7388945 4.790864 $p.value two-sided midp.exact fisher.exact chi.square 35-40 NA NA NA 41-45 5.665956e-01 5.587536e-01 5.690688e-01 46-50 1.573609e-02 2.049340e-02 1.653286e-02 51-55 1.499986e-04 1.631541e-04 1.561175e-04 56-60 5.019449e-05 4.717556e-05 2.186623e-05