일반화 선형모형(Generalized Linear Model)

회귀분석이나 분산분석은 종속변수가 정규분포되어 있는 연속형 변수이다. 하지만 많은 경우에 있어서 종속변수가 정규분포되어 있다는 가정을 할 수 없는 경우도 있으며 범주형 변수가 종속변수인 경우도 있다. 다음과 같은 경우에 일반화 선형모형을 사용한다.

 

  • 종속변수가 범주형변수인 경우 : 이항변수( 0 또는 1, 합격/불합격, 사망.생존 등)인 경우도 있으며 다항변수(예를 들어 poor/good/excellent 또는 공화당/민주당/무소속 등)인 경우 정규분포 하지 않는다.
  • 종속변수가 count(예를 들면 한 주간 교통사고 발생 건수, 하루에 마시는 물이 몇잔인지 등)인 경우. 이들 값은 매우 제한적이며 음수가 되지 않고 평균과 분산이 밀접하게 관련되어 있고 정규분포하지 않는다.

 

일반화 선형 모형은 종속변수가 정규분포하지 않는 경우를 포함하는 선형모형의 확장이며 glm()함수를 사용한다. 이 장에서는 대표적으로 로지스틱회귀(Logistic regression)와 포아송회귀(Poisson regression)를 다룬다.

 

glm() 함수

일반화선형모형은 glm()함수를 사용한다. glm() 함수의 사용방법은 lm()함수와 유사하나 추가로 family라는 인수를 지정해준다. family에 따라 연결된 함수가 달라지는데 사용법은 다음과 같다.

 

glm(formula, family=family(link=function), data)

 

family는 종속변수의 분포에 따라 다음과 같은 것들을 사용할 수 있다.

 

종속변수의 분포가

  1. 정규분포인 경우 gaussian,
  2. 이항분포인 경우 binomial,
  3. 포아송분포인 경우 poisson,
  4. 역정규분포인 경우 inverse.gaussian,
  5. 감마분포인 경우 gamma,
  6. 응답분포가 확실하지 않은 때를 위한 유사가능도 모형인 경우 quasi를 사용할 수 있다.

 

glm()함수의 결과를 anova()와 조합하면 분산분석표를 생성할 수 있고 summary()에 넣어서 잔차와 추정값 등을 얻을 수 있다.

coef() 함수를 사용하여 모형 인수들의 절편과 기울기 등을 얻을수 있으며 residual()함수는 잔차를 얻을 수 있다.

plot()함수를 사용하여 회귀진단 plot을 얻을 수 있고 회귀모형을 사용하여 predict() 함수로 새로운 데이터에 대한 예측치를 추정할 수 있다.

 

 

 

coef(m) :절편과 기울기

residuals(m) : 잔차

 

 

 

 

 

age : 수술 받을 당시 나이

op_year : 수술 연도

no_nodes : 양성 림프샘 개수

 

survival : 수술 후 생존 연수

 

glm(y축 : 생존 연수 ~ x축 : 설명변수 전체, haberman, family=binomial)

반응변수 y축은 범주형이거나 0또는 1이어야 한다. 따라서 factor() 처리 해준다.

coef() : 절편과 기울기

 

type = 'response' 를 해주면 확률을 추출해준다.

 

 

특징 선택

설명변수의 중요도를 계산하고 중요도가 높은 변수를 자동 선택

수술 연도는 생존에 영향을 안 미친다고 판단하여 제외한다.

h=glm(survival ~ age + no_nodes, data = harberman, family=binomial)

 


로지스틱 회귀

로지스틱 회귀는 종속변수가 이항변수(0 또는 1, 합격/불합격, 사망.생존 등)인 경우로 의학연구에 많이 사용된다. 로지스틱 회귀분석을 할때에는 family=binomial로 지정해주어야 한다.

 

잠복 변수 or 은닉 변수

 

일반화 선형회귀를 로지스틱 회귀로 변환할 수 있다.

 

admit : 합격, 불합격

gre : 미국 대학원 수능시험 점수

gpa : 학부 학점

rank : 출신 대학의 순위

 

levels(factor(ucla$rank))

 

 

ucla %>% ggplot(aes(gre, admit)) + geom_point()
ucla %>% ggplot(aes(gre, admit)) + geom_jitter()
ucla %>% ggplot(aes(gre, admit)) + geom_jitter(aes(col=admit)) # 합격, 불합격 색으로 구분
ucla %>% ggplot(aes(gre, admit)) + geom_jitter(aes(col=factor(admit))) # 범주형 변환하여 두가지 색깔만 이용
ucla %>% ggplot(aes(gre, admit)) + geom_jitter(aes(col=factor(admit)), height=0.1, width=0.0)

height = 0.1 # 잡음 10퍼센트로 줄이기


COLON 데이터

 

대장암 데이터

survival 패키지에 있는 colon데이타는 stage B/C의 colon cancer 1858명의 데이타이다. 자세한 내용은 ?survival::colon을 입력해 보면 알수 있다. survival 패키지를 설치하지 않은 경우는 install.packages(“survival”) 을 이용하여 설치한다.

 

 

16개의 변수를 시각화하면 상관관계를 파악하기가 어렵다.

좀더 자세하게 시각화해보자.

 

다양한 변수값을 시각화해보자.

 

p = colon %>% ggplot(aes(extent, status)) + geom_jitter(aes(col=factor(status)), height=0.1, width=0.1)

 

 

3. 성별은 딱히 상관 없음

4. 림프절의 수는 적을 수록 재발할 확률이 적다.

 

결측값을 제거 하지 않아도 거의 동일한 값을 얻게 된다.

왜냐하면 glm 함수에는 이미 그런 옵션이 있기 때문에 기본적으로 결측값을 제거해준다는 것을 알 수 있다.

 

방어적 코딩

 

 

 

범주형 = 순서값 or 명칭값

순서값 : 거리 개념이 존재한다.

명칭값 : 거리 개념이 존재하지 않는다.

 

원핫 코드 : 범주형을 숫자형으로 변환해준다.

 = 데이터를 수많은 0과 1의 값으로 데이터를 구별해주는 인코딩

 = 0으로 이루어진 벡터에 단 하나의 1로 해당 데이터의 값을 구별하는 것

 

glm함수를 쓰면 결측값도, 범주형 자료도 자동적으로 처리해준다.

'📌 R' 카테고리의 다른 글

R (16) - 랜덤 포리스트  (0) 2020.11.13
R (15) - 회귀, 결정트리  (0) 2020.11.06
R (13) - 모델링  (0) 2020.10.27
R (12) - 워드클라우드  (0) 2020.10.15
R (11) - 구글맵  (0) 2020.10.15
복사했습니다!