회귀



회귀 함수란 어떤 특정 값(독립변수)을 넣어서 결과 값(종속변수)을 얻는 것이다. 하나의 독립변수(설명변수)에 기반한 경우헤는 단순 선형 회귀라 하고 둘 이상의 복수의 독립변수(설명변수)에 기반한 경우에는 다중 선형 회귀라고 한다.

선형 회귀의 실사용 사례는 다음과 같다. 

-만약 목표가 예측일 경우, 선형 회귀를 통해 y와 x로 이루어진 집합을 만들기 위한 예측 모델을 개발한다. 개발된 모델은 차후 y가 없는 x값이 입력 되었을 때, 해당 x에 대한 y를 예측하기 위해서 사용된다.

-여려 x가 존재할 경우, y와 x간의 관계를 수량화하여 어느 x가 y와 별로 관계가 없는지 알아낸다. 

예를 들면 아들과 아버지의 키들의 값을 전부 넣어서 그 관계를 어떤 함수로 생성한다고 하자. 그리고 새로운 값 즉, 어떤 사람의 키를 넣었을때, 그 자녀의 키를 예상해 주는 것이다. (함수에 따라서 반대의 경우도 가능)

다른 예로는 은행이 대출 요청자의 나이, 수입, 직업, 부양가족수, 신용도에 근거하여 대출 요청자의 위험도를 판단하는데 쓰이기도 한다.

다양한 회귀 기술에 대한 모습들을 살펴볼텐데, 선형회귀분석을 살펴보고 그다음에 로지스틱 회귀분석을 살펴보겠다. 또한 마지막으로 GLM(generalized linear model) 을 살펴보겠다.


1. 선형 회귀

선형 회귀는 설명변수를 넣은 함수를 가지고 결과(반응값)을 예측하는 것이다. 함수의 일반적은 모형은 아래와 같다. 

여기서 x1, x2, ... xk는 독립변수고이고, y는 종속 변수이다. 

여기서는 2008-2010년의 호주의 소비자불가지수를 이용하여, 회귀함수 lm()을 적용해 보겠다.


year <- rep(2008:2010, each=4)            # 2008년~2010년까지 각각 4번씩 반복한 값을 저장

quarter <- rep(1:4, 3)                            # 위와 비슷함

cpi <- c(162.2, 164.6, 166.5, 166.0, 166.2, 167.0, 168.6, 169.5, 171.0, 172.1, 173.3, 174.0)        # 변수에 수치 입력

plot(cpi, xaxt="n", ylab="CPI", xlab="")            # cpi 를 y축에 넣음, x축의 값을 제거, y축 이름, x축 이름

axis(1, labels=paste(year,quarter,sep="Q"), at=1:12, las=3)        # 축번호, 라벨 이름들, 텍스트를 수직으로 만들어줌(las) 


위의 그래프를 보면, 시간의 흐름과 물가지수는 일정한 상관관계가 있음을 알수 있다. 이러한 상관관계를 느낌으로만 아니라 수치로도 표현할수 있는데 그것이 cor()함수이다. 이함수를 통해서 두 변수의 상관계수를 알수 있다. 상관계수가 1에 가까울수록 상호 연관 정도가 큰 것이고, 0에 가까울수록 없는것이다. 음수의 경우에는 한쪽이 커지면 작아지는 음수적 관계를 표현한다. 

cor(year,cpi)                            #상관 정도 확인

cor(quarter,cpi)

fit <- lm(cpi ~ year + quarter)    # 회귀함수 만들기 

fit                                            # 회귀함수의 계수(위 수식에서 c0, c1 부분)  확인 

attributes(fit)                            # 회귀함수의 특성들 확인

fit$coefficients                        # 그중에서 계수 확인

residuals(fit)                            # 잔차(각 점들이 회귀함수에서 얼마나 떨어져 있는지) 확인


위의 상관 정보를 보면, year와 cpi는 0.909 정도로 상관관계가 높다는 것을 알수 있고, quarter와 cpi간의 계수는 0.37정도로 상관관계가 낮다는 것을 알수 있다. fit$coefficients를 치면 상관 계수들이 나온다. year의 계수는 3.887이고, quarter의 계수는 1.167이다. 다시 말하면 아래 수식에서 c1= 3.887이고 c2가 1.167인 것이다. 물가는 상대적으로 year에 값에 영향을 많이 받고, quarter의 값에 영향을 적게 받는 다는 것을 알수 있다. 



또한 3d 형대로도 출력할수 있다. 아래의 패키지를 설치하고 다운받아서 


library(scatterplot3d)                # 패키지 로딩하기

s3d <- scatterplot3d(year, quarter, cpi, highlight.3d=T, type="h", lab=c(2,3))            # x,,y,z축  등 기타 설정

s3d$plane3d(fit)        # 점선으로 그려진 판모양 그리기



##모델을 사용해서 예측해보기

data2011 <- data.frame(year=2011, quarter=1:4)            # 정보를 data.frame 형식에 담기

cpi2011 <- predict(fit, newdata=data2011)                    # predict 함수를 이용해 다음해인 2011년 회귀의 결과 예측하기 

style <- c(rep(1,12), rep(2,4))                                    # 1을 12번 , 2을 4번 있는 벡터

plot(c(cpi, cpi2011), xaxt="n", ylab="CPI", xlab="", pch=style, col=style)        # 그래프 그리기, 

axis(1, at=1:16, las=3, labels=c(paste(year,quarter,sep="Q"), "2011Q1", "2011Q2", "2011Q3", "2011Q4"))    # 축에 그려넣기


마지막에 보면 빨간색 삼각형으로 4개의 결과가 예측값이다. 


2) 로지스틱 회귀


로지스틱 회귀는 어떤 사건의 발생의 가능성을 예측하는데 사용된다. 로지스틱 회귀 모델은 다음의 등식에 따라서 만들어지게 된다. 



x1, x2,,,, xk의 값들은 모두 예측자들이다. y는 예측될 값이다. 그리고 logit(y) = ln(y / (1-y) ) 이다. 그래서 위의 등호는 아래와 같이 다시 쓰여질수 있다. 



로지스틱 회귀는 family 설정을 binomial(link="logit")으로 하고, 함수 glm()을 사용하면 만들수 있다. 

참고 : http://www.ats.ucla.edu/stat/r/dae/logit.htm



3) Generalized Linear Regression 

GLM(generalized linear model)은 선형 모델이 종속변수에 링크 함수를 통해서 대응하도록 하고, 각 측정 변수의 크기를 예측된 값의 함수에 대응되도록 함으로써 선형 회귀를 만들수 있다. 이것은 선형 회귀, 로지스틱 회귀, 그리고 푸아송 회귀를 포함하는 다양한 통계적 모델을 통합했다. 함수 glm()은 주어진 선형 예측변수와 오류 분포를 살펴보고, glm(일반화된 선형 모델)을 적용하는데 사용된다. 


## 데이터 생성하기

data("bodyfat", package="mboost")                # 데이터 생성

myFormula <- DEXfat ~ age + waistcirc + hipcirc + elbowbreadth + kneebreadth        # DEXfat 기준으로 다른 정보들을 회귀분석함.

bodyfat.glm <- glm(myFormula, family = gaussian("log"), data = bodyfat)        # 함수에 적용

summary(bodyfat.glm)                                # 얻은 정보 요약하기

잔차, 계수, 등등 정보가 출력된다. 


Call:
glm(formula = myFormula, family = gaussian("log"), data = bodyfat)

Deviance Residuals: 
     Min        1Q    Median        3Q       Max  
-11.5688   -3.0065    0.1266    2.8310   10.0966  


Coefficients:

             Estimate Std. Error t value Pr(>|t|)    

(Intercept)  0.734293   0.308949   2.377  0.02042 *  

age          0.002129   0.001446   1.473  0.14560    

waistcirc    0.010489   0.002479   4.231 7.44e-05 ***

hipcirc      0.009702   0.003231   3.003  0.00379 ** 

elbowbreadth 0.002355   0.045686   0.052  0.95905    

kneebreadth  0.063188   0.028193   2.241  0.02843 *  

---

Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1


(Dispersion parameter for gaussian family taken to be 20.31433)


    Null deviance: 8536.0  on 70  degrees of freedom

Residual deviance: 1320.4  on 65  degrees of freedom

AIC: 423.02


Number of Fisher Scoring iterations: 5



## 예측과 그래프 그리기

pred <- predict(bodyfat.glm, type="response")            # 예측함수 적용하기

plot(bodyfat$DEXfat, pred, xlab="Observed Values", ylab="Predicted Values")        # 값을 적용하기

abline(a=0, b=1)                                                        # 기준 함수를 그려넣기

도움이 되셨나요?^^



  1. 찹쌀도우너츠 2015.05.26 09:59 신고

    R... 어렵네요...

  2. 맛스타 2016.09.13 16:30

    R어렵지만, 제가 원하는 내용이 많아 많은 도움이 되었습니다. 감사합니다.

+ Recent posts