[R] Logistic regression (로지스틱 회귀분석) Start
BioinformaticsAndMe
Logistic regression (로지스틱 회귀분석)
: 로지스턱 회귀분석은 종속변수(반응변수)가 범주형 데이터인 경우에 사용되는 회귀 분석법
: 종속변수 y는 '성공(1) 및 실패(0)'의 두 가지 값(이항변수)을 갖음
*환자사망여부/전염병발병여부/교통사고발생여부 등
: 로지스티 회귀분석은 지도 학습으로 분류되며, 특정 결과의 분류 및 예측을 위해 사용됨
일반화선형모형 (Generalized linear model)
: 일반화선형모형은 정규분포를 따르지 않는 종속변수의 선형 모형 확장으로, 로지스틱회귀 또는 포아송회귀에 사용됨
: 일반화선형모형은 R의 내장함수인 glm()함수를 사용
: 로지스틱 회귀분석에서는 glm()함수에 'family=binomial' 인수를 지정해야함
1. 실습 대장암 데이터 로딩
# survival 패키지의 1858명 colon 데이터
install.packages(“survival”)
library(survival)
str(colon)
'data.frame': 1858 obs. of 16 variables:
$ id : num 1 1 2 2 3 3 4 4 5 5 ...
$ study : num 1 1 1 1 1 1 1 1 1 1 ...
$ rx : Factor w/ 3 levels "Obs","Lev","Lev+5FU": 3 3 3 3 1 1 3 3 1 1 ...
$ sex : num 1 1 1 1 0 0 0 0 1 1 ...
$ age : num 43 43 63 63 71 71 66 66 69 69 ...
$ obstruct: num 0 0 0 0 0 0 1 1 0 0 ...
$ perfor : num 0 0 0 0 0 0 0 0 0 0 ...
$ adhere : num 0 0 0 0 1 1 0 0 0 0 ...
$ nodes : num 5 5 1 1 7 7 6 6 22 22 ...
$ status : num 1 1 0 0 1 1 1 1 1 1 ...
$ differ : num 2 2 2 2 2 2 2 2 2 2 ...
$ extent : num 3 3 3 3 2 2 3 3 3 3 ...
$ surg : num 0 0 0 0 0 0 1 1 1 1 ...
$ node4 : num 1 1 0 0 1 1 1 1 1 1 ...
$ time : num 1521 968 3087 3087 963 ...
$ etype : num 2 1 2 1 2 1 2 1 2 1 ...
2. 로지스틱 회귀분석 수행
■반응변수 - status(대장암 재발 또는 사망인 경우 1)
■예측변수
- obstruct : 종양에 의한 장의 폐쇄 (obstruction)
- perfor : 장의 천공 (perforation)
- adhere : 인접장기와의 유착 (adherence)
- nodes : 암세포가 확인된 림프절 수
- differ : 암세포의 조직학적 분화 정도 (1=well, 2=moderate, 3=poor)
- extent : 암세포가 침습한 깊이 (1=submucosa, 2=muscle, 3=serosa, 4=인접장기)
- surg : 수술 후 등록까지의 시간 (0=short, 1=long)
# 로지스틱 회귀분석에서 'family=binomial'로 지정
colon1<-na.omit(colon)
result<-glm(status ~ sex+age+obstruct+perfor+adhere+nodes+differ+extent+surg, family=binomial, data=colon1)
summary(result)
Call:
glm(formula = status ~ rx + sex + age + obstruct + perfor + adhere +
nodes + differ + extent + surg, family = binomial, data = colon1)
Deviance Residuals:
Min 1Q Median 3Q Max
-2.575 -1.046 -0.584 1.119 2.070
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -2.430926 0.478301 -5.082 3.73e-07 ***
rxLev -0.069553 0.122490 -0.568 0.570156
rxLev+5FU -0.585606 0.124579 -4.701 2.59e-06 ***
sex -0.086161 0.101614 -0.848 0.396481
age 0.001896 0.004322 0.439 0.660933
obstruct 0.219995 0.128234 1.716 0.086240 .
perfor 0.085831 0.298339 0.288 0.773578
adhere 0.373527 0.147164 2.538 0.011144 *
nodes 0.185245 0.018873 9.815 < 2e-16 ***
differ 0.031839 0.100757 0.316 0.752003
extent 0.563617 0.116837 4.824 1.41e-06 ***
surg 0.388068 0.113840 3.409 0.000652 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 2461.7 on 1775 degrees of freedom
Residual deviance: 2240.4 on 1764 degrees of freedom
AIC: 2264.4
Number of Fisher Scoring iterations: 4
3. 유의한 변수 선택
: backward elimination방법으로 stepwise logistic regression 수행
*backward elimination 참고 - https://bioinformaticsandme.tistory.com/290
# 유의하지 않은 변수를 누락하고 로지스틱 회귀모형을 새롭게 정의
reduced.model=step(result, direction = "backward")
summary(reduced.model)
Call:
glm(formula = status ~ rx + obstruct + adhere + nodes + extent +
surg, family = binomial, data = colon1)
Deviance Residuals:
Min 1Q Median 3Q Max
-2.5583 -1.0490 -0.5884 1.1213 2.0393
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -2.30406 0.35138 -6.557 5.49e-11 ***
rxLev -0.07214 0.12221 -0.590 0.554978
rxLev+5FU -0.57807 0.12428 -4.651 3.30e-06 ***
obstruct 0.22148 0.12700 1.744 0.081179 .
adhere 0.38929 0.14498 2.685 0.007251 **
nodes 0.18556 0.01850 10.030 < 2e-16 ***
extent 0.56510 0.11643 4.854 1.21e-06 ***
surg 0.38989 0.11371 3.429 0.000606 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 2461.7 on 1775 degrees of freedom
Residual deviance: 2241.5 on 1768 degrees of freedom
AIC: 2257.5
Number of Fisher Scoring iterations: 4
4. 예측 인자들의 Odds ratio 구하기
# 오즈비 출력 함수 정의
ORtable=function(x,digits=2){
suppressMessages(a<-confint(x))
result=data.frame(exp(coef(x)),exp(a))
result=round(result,digits)
result=cbind(result,round(summary(x)$coefficient[,4],3))
colnames(result)=c("OR","2.5%","97.5%","p")
result
}
ORtable(reduced.model)
OR 2.5% 97.5% p
(Intercept) 0.10 0.05 0.20 0.000
rxLev 0.93 0.73 1.18 0.555
rxLev+5FU 0.56 0.44 0.72 0.000
obstruct 1.25 0.97 1.60 0.081
adhere 1.48 1.11 1.96 0.007
nodes 1.20 1.16 1.25 0.000
extent 1.76 1.41 2.22 0.000
surg 1.48 1.18 1.85 0.001
# Odds ratio 시각화
install.packages(“moonBook”)
library(moonBook)
odds_ratio = ORtable(reduced.model)
odds_ratio = odds_ratio[2:nrow(odds_ratio),]
HRplot(odds_ratio, type=2, show.CI=TRUE, cex=2)
#Reference
1) https://www.tech-quantum.com/classification-logistic-regression/
2) https://rstudio-pubs-static.s3.amazonaws.com/41074_62aa52bdc9ff48a2ba3fb0f468e19118.html
3) http://www.dodomira.com/2016/02/12/logistic-regression-in-r/
4) https://link.springer.com/chapter/10.1007/978-1-4842-4470-8_20
[R] Logistic regression (로지스틱 회귀분석) End
BioinformaticsAndMe