본문 바로가기

[학습] 데이터분석방법론: R

Introductory statistics with R: chapter 6


* Regression and correlation 회귀분석과 상관: 기본 통계 지식들

회귀분석은 단순 회귀분석, 다중회귀분석, 로지스틱 회귀분석, cox의 비례위험모형 등 다양하게 존재하지만 이 챕터에서는 단순 선형회귀분석에 대한 내용만을 다룬다. 복잡한 것들은 12챕터에서 다룰 듯.

 

회귀분석 시 1, 2, 3차 함수 등 다양한 차수의 함수를 이용할 수 있지만 보건의학연구에서는 선형회귀분석을 주로 사용.

 

단순회귀분석

    b는 회귀계수(regression coefficient), a는 절편(intercept)이라고 함.

    e를 잔차(residual)이라고 한다. 잔차의 특성: 정규성 / 독립성 / 등분산성.

 

회귀모형에 대한 기본 가정 4가지

    1) x와 y가 선형 관계에 있다: 산점도를 그려 확인

    2) 오차항의 정규성: 모든 독립변수 x값에서 관련된 종속변수 y는 정규분포를 이룬다. e ~ N(0,sigma^2)

    3) 오차항의 독립성: 잔차들은 연관성 없이 독립적이다 

    4) 오차항의 등분산성: 모든 독립변수 x에 대해 잔차의 분산이 같다. (Var(residual) = SSres / (n-2))

       - 직접 등분산성을 확인하진 않고 잔차 산점도를 그려 random한 분포를 보이는지 확인.

 

단순회귀분석의 시행과정

    1) 회귀식의 추정: 최소제곱법(method of least square)를 이용 - 잔차의 제곱 합이 최소가 되는 곡선.

    사실 위의 식으로 무수히 반복해서 최소값을 알아내는 것은 아니고, SSres의 최소값을 주는 beta, alpha의 값을

    구하는 방법이 아래와 같이 알려져 있다.

    잔차의 분산(residual variance)는 SSres/ (n-2)로 추정되며, residual Sd는 물론 sqrt(SSres/(n-2)) 가 된다.

 

    위에서 구한 alpha, beta값 역시 추정치이며 sampling variation으로 인해 참값과의 차이가 있을 수 있다. 그리고 

    이 가능한 alpha, beta 값들을 모아놓는다면 그 값들의 표준오차(SEM) - 마치, 표본평균의 분포에서 구하듯 -를 구할

    수 있다. 이는 s.e(alpha), s.e(beta)라고 하자. 이를 이용해 아래쪽에 회귀식 parameter의 confidence interval를 구할

    수 있다. 

 

    2) 회귀식의 유효성을 검정하자: Null hypothesis를 기각

    다변수 회귀분석에서는 F test 값이 중요하지만, 단변수 선형회귀분석에서는 t-test와 F test가 의미적으로 동일하다고

    하며, F value = (t value)^2가 성립된다고 함. 그래서 책에선 t-test에 대해서만 주로 다룸.

    가장 중요한 관심사는 선형회귀의 Null hypothesis인 beta=0 (즉, x와 y는 독립)를 기각하는 것이다.

    앞에서 t-test를 하며 다뤘지만, T = (Xbar - mu0)/SEM이 되며, 일반적인 T-test와 동일하다고 생각하면 될 듯함. 

    즉, mu0 = 0에 0을 대입, Xbar에 beta를, SEM에 s.e(beta)를 대입하면... 기울기가 0과 같은지를 검증하는 T-test가 

    된다.

    이 때, T ~ t(df = n-2)를 따른다. 

    즉, 단순선형회귀모형에서는 t-test 결과를 통해 유효성을 파악한다.

 

    3) 결정계수 R^2를 구하고, 모형이 얼마나 결과변수를 잘 설명하는지 분석

       R^2 = (회귀식으로 설명되는 변동=SSR) / (총변동=SST), sqrt(R^2)이 피어슨 상관계수 r을 의미한다.

       R^2는 (설명변수의 유의성과는 무관하게) 설명변수의 개수가 늘어남에 따라 지속적으로 증가하는 경향성이 있어

       이를 보정한 adjusted R squared 값이 고안되었다.

n은 sample size, p는 설명변수의 갯수이다. 단순회귀변수에서 p=1을 넣고 계산하면 결과값이 나온다.

    4) F test를 통해 추정된 회귀식의 유효성을 검정

      F statistics는 H0: beta1=0에 댇한 가설 검증의 결과를 보여주나, 위에서 언급했듯 단변수 회귀식에서는 t-test에

      비해 새로운 정보가 없음. F value = (t value)^2 과 동일하다고 함

      다변수 회귀식에서는 F test를 먼저 해서 Null hypothesis를 기각한 뒤, t-test를 시행해 beta 값을 확정하는 것

      같다. 하지만 단변수에서는 2)에서 이미 t-test를 시행하였으므로 그 부분은 생략함.

 

단일회귀모형으로 볼 때, SSE는 예측값과 실제 관측값의 차이(= 회귀모형으로 설명 안되는 값)이고 SSR은 회귀모형과 y 평균의 차이, 즉 그냥 y의 평균으로 설명하는 것 보다 회귀모형으로 더 설명되는 부분을 의미하고 SST는 이 두 값을 더한 값임. 이 SST에 대한 SSR의 비율, 즉 1-SSE/SST가 결정계수R2 이다.

 

* Simple linear regression

lm()

linear model의 약자로, (~)를 이용해서 model formula를 기술한다: a ~ b (= a described by b)

lm()은 단순회귀분석 이상의 복잡한 회귀분석들을 시행할 수 있는 함수로 뒤에서도 사용됨.

    lm(a~ b1+b2+b3)와 같이 사용하면 다변수 회귀분석을 시행할 수 있다.

 

lm()을 호출하면 print out 되는 결과물은 상당히 단순하지만, 사실 lm()이 반환해주는 것은 "model object"이다.

이 object를 여러 함수에 넣어 원하는 결과물들을 추가로 출력받을 수 있다.

 

summary(lm())

일반 통계프로그램에서 linear regression test를 돌리면 나오는 결과값들은 model objet를 summary()함수에 넣음으로써

확인할 수 있다.

각각을 살펴보면,

call은 어떤 함수가 호출되었는지를 표시함.

 

Residuals: 잔차의 quantiles를 표시함. 잔차는 ~N(0, sigma^2)이므로 median은 0값에 가깝고, min과 max는 비슷한 값을 가지는 것이 정상이다. 위의 sample에서처럼 1Q와 3Q의 차이가 큰 것은 문제가 될 수 있으나, n수가 워낙 작아서 이 경우엔 크게 걱정할 필요는 없다.

 

Coefficient: intercept와 regression coefficient값을 보여준다. 각각의 s.e와 T value, p-value 역시 보여준다. 

위의 예에서 beta의 p-value는 0.0479로 유의미하다고 볼 수 있다. *의 개수를 통해 p-value의 범위를 표시한다.

options(show.signif.stars=FALSE) 명령어를 이용해 * 표시를 끌 수 있음.

 

Residual standard error는 regression line으로부터 관찰값이 얼마나 떨어져 있는지를 나타내는, 잔차의 표준편차이다.

 

Multiple R-squared는 R^2 값을, 옆에는 adjusted R squared 값을 제시한다.

 

마지막으로 F-statistics는 회귀식의 유효성을 증명하는 값이지만, 위에서 언급했듯 단순선형회귀에서는 t-test와 크게

다르지 않아서 의미가 적다.

 

plot() & abline()

데이터의 각 요소를 dot plot을 한 다음 그 위에 선형회귀 line을 그릴 수 있다. plot은 마찬가지로 (x,y) 값을 넣으면 되고 abline()함수는 argument로 (intercept, regression coefficient)를 넣으면 된다. lm() 함수를 이용하는 경우, 결과값을 바로 넣으면 직선이 바로 그려지므로 편리하게 사용 가능.

 

plot(blood.glucose, short.velocity), abline(lm(short.velocity~blood.glucose)) 명렁어를 이용했다.

 

* Residuals and fitted values 잔차와 예측값

fitted()

"model object"를 넣어주면, 회귀식에 따른 예측값을 반환해준다. 즉, y= a + bx에 x값을 넣은 y값을 리턴해줌.

이 점들을 plot상에 찍으면, abline(linear model)위의 점이 된다.

 

위에서 plot 상에 회귀식을 선으로 그리는 예제에서, abline() 함수가 아닌 lines() 함수를 이용할 수도 있다.

이 경우엔 lines(x값, y값)를 각각 argument로 입력해야하는데 위의 예를 들면 lines(blood.glucose, fitted(lm.velo))

와 같이 입력을 해야 한다.

하지만 그대로 입력하면 오류가 발생한다. 왜냐하면 원본데이터의 short.velocity에 NA값이 있어서 model object를 만들 때 자동으로 배제해서 만들기 때문에 원소의 개수가 달라지기 때문이다.  blood.glucose[!is.na(short.velocity)] 처럼 호출할 수도 있지만 너무 복잡해지는 경우가 있으므로 complete.cases 함수를 이용할 수도 있다.

 

complete.cases()

!is.NA와 기능적으로 유사하나, 행 단위로 판단하여 해당 행에 NA값이 있는지 확인한다. 있으면 FALSE, 없으면 TRUE를 반환하므로

    cc<-complete.cases(데이터)

    데이터[cc,]

처럼 사용할 수 있다.

 

options(na.action=)

options 함수를 사용할 수도 있다. Option()은 par()와 마찬가지로, R 세션에 적용될 디폴트 설정값을 바꿔주는 함수이다.

 

na.action argument에 사용할 수 있는 옵션들은 아래와 같으며, na.exclude를 사용하는 경우엔 분석에선 NA값을 제외하지만 fitted()로 호출하는 경우 다시 NA값이 복구된 채로 반환되므로 fitted(lm.velo)의 갯수가 blood.glucose와 동일하게 되어 lines()로 선을 그리는데 문제가 없다.

segment()

(x1,y1,x2,y2)를 argument로 가지며 (x1,y1) 부터 (x2,y2)까지 직선을 그어주는 역할을 한다.

x 좌표는 blood.glucose로 고정, y 좌표는 fitted부터 short.velocity 관찰값까지 설정하여 다음과 같은 직선이 그려질 수 있도록 설정했다.

plot(fitted(), resid())

각 예측값에 따른 잔차의 분포를 plot으로 볼 수 있다.

qqnorm(resid())

잔차의 정규성을 확인하기 위해 잔차의 Q-Q plot을 시행할 수 있다.

 

* Prediction and confidence bands

회귀선 옆으로 일정한 band를 같이 그리는 경우들이 있다. 크게 "넓은" band와 "좁은" band가 있다.

 

"좁은" band: confidence band

좁은 band는 confidence band라고 하며, 표준오차를 반영한다. 표준오차란, "표본평균"의 분포이며 Xbar~N(mu, sigma^2/n) 에서의 표준편차, 즉 sigma/sqrt(n) 이 바로 표준오차이다. 쉽게 말하면 지금 그어져 있는 적합회귀선의 분포범위를 보여준다고 볼 수 있다. n값이 클 수록 작아지기 때문에 일반적으로 자료가 밀집해 존재하는 그래프의 중앙에서 더 잘록해지는 모습을 보인다. 

 

"넓은" band: prediction band 

넓은 band는 prediction band라고 하며, 미래 관측의 불확실성을 반영한 것이다. 쉽게 말하면, "표본" 자체의 분포를 의미한다. X~N(mu, sigma^2)에서 2 sigma 범위를 표시한 선이다. confidence band와 달리 식에 n이 들어가지 않기 때문에 n값의 증가에 따라 오목해지지 않는다. 그리고 정규분포의 2 sigma는 대략 95%의 자료를 포함한다. 오차의 정규성 및 등분산성에 가정하고 있기 때문에 이 가정들이 만족했을 경우 사용하는 것이 좋다.

 

predict()

주어진 새로운 변수(X)에 대한 예측을 수행한 결과를 예측값으로 출력함. 특별한 argument가 없다면 fitted()와 동일한 값을 출력한다. 추가로 interval="confidence" or "prediction" argument를 넣으면 위에서 언급한 narrow, 혹은 broad band 값을 출력한다.

lwr, upr는 lower, upper confidence limits를 말한다.

 

아래 예시에서는 pred.frame에 4:20까지의 값을 가진 새로운 data frame을 만들어 이를 predict에 이용해서 적절한 그림을 그리고 있다. data가 크기대로 sorting되어 그림을 그리기 적절하며 또한 범위도 보기 좋은 수준으로 제한할 수 있다. 자세한 내용은 p 132 참조.

 

 

matline()은 여러 column으로 구성된 data frame을 받아, column 별로 line을 그려주는 함수이다. 이 경우엔 fitted, lower, upper를 각각 그리기 위해 사용되었다.

 

** 다른 블로그 내용 인용 **

우선 학술적인 의미로 간단히 표현하면 interval 매개변수의 “c”는 “주어진 X값에 대한 Y의 평균(기대값)에 대한 신뢰구간(신뢰대, 95% 수준)”을 도출하고, “p”는 “주어진 X에서 하나의 예측값 Y가 속하는 예측구간(예측대)”를 도출하는 것이다.

그런데 predict()는 어짜피 새로운 X값에 대한 예측을 수행하고 그 결과 예측된 Y값을 도출하는 것이니 기본적으로 점추정값(fit)은 동일하다. 다만 구간 추정 시 사용되는 신뢰구간에 포함되는 표준오차(SE) 부분의 식이 약간 다르다. SE가 다르다는 것은 결국 분산이 다른다는 것.

신뢰구간인 “c”에서의 분산은 다음과 같다,

반면 예측구간인 “p” 는 위 분산에서 

을 더한 크기의 분산을 갖는다고 한다 즉, 식이 다음과 같다.

따라서, “p” 일 때 신뢰구간의 범위가 더 넓은 것이며 결과에 차이가 난다.

 

* Correlation

 

* Pearson correlation

r값이 0이면 x,y 값은 원형으로 분포하며 1에 가까워질 수록 직선상에 놓이게 된다.

cor()

입력된 변수의 correlation을 계산해준다. 두 개의 변수를 직접 입력해도 되고, data frame을 입력하면 각각에 대한 correlation을 구해 table로 만들어준다.

use="complete.obs"는 na.rm=T 와 동일한 의미를 갖는 argument이다.

cor.test()

단순히 r값을 구해주는 것 뿐만 아니라 test의 결과를 보여줌. linear model 객체를 만들고 summary를 시행했을 경우 나오는 R-squared값은 Pearson's R의 제곱값이다. 위 값을 구해 sqrt()를 해주면 cor.test의 Pearson's correlation과 같은 값이 나오는 것을 확인할 수 있다. 단, cor.test는 이외에도 Kendall, Spearman 등 다양한 값을 구할 수 있으므로 이 때 활용하도록 하자.

* Spearman's rho, Kendall's tau

cor.test() 에 methd="spearman" 혹은 "kendall" argument를 넣어 구할 수 있다.

 

Spearman, Kendall은 모두 비모수적 방법(정규분포를 가정하지 않는)으로 상관계수를 구하는 것이다.

 

Spearman's rank correlation rho

관측값을 rank로 치환한 다음 아래와 같은 식을 이용해 rho값을 구한다.

Kendall's rank correlation tau

Concordant(x와 y가 동일 방향으로 움직임), discordant(반대로 움직임) group의 counting을 기초로 한 방법이다.

완전한 선형 관계의 경우 모든 요소가 concordant 혹은 discordant할 것이며, 완전히 독립인 경우는 concordant와 discordant가 반반 나올 것이다.

tau는 Spearman's rho보다 더 직접적 해석이 가능하다는 장점이 있으나, rho와 tau 중 하나를 더 선호할 이유는 없다 (The t coefficient has the advantage of a more direct interpretation over Spearman’s r, but apart from that there is little reason to prefer one over the other.)

 

그리고 결과를 보면 알겠지만, 비모수적 방법들은 모두 insignificant 하고 모수적 방법인 Pearson만이 borderline significance를 보인다. 즉, 동일한 데이터라면 모수적 방법이 더 효율적이라고 볼 수 있음.