반응형

[SAS] 다중 선형 회귀 분석 (Multiple linear regression) - PROC REG, PROC GLM

 

 지난 포스팅에서 연속형 변수의 단순 선형 회귀 분석 (Simple linear regression: 2023.05.14 - [선형 회귀 분석/SAS] - [SAS] 단순 선형 회귀 분석 (Simple linear regression) - PROC REG), 범주형 변수의 단순 선형 회귀 분석 (Simple linear regression with categorical variables: 2023.10.19 - [선형 회귀 분석/SAS] - [SAS] 범주형 변수의 선형 회귀 분석 (Simple linear regression with categorical variable) - PROC REG, PROC GLM)에 대해 알아보았다.  위 분석들은 모두 독립 변수가 1개인 단순 선형 회귀 분석이다. 하지만 세상 일은 그렇게 단순하지 않다. 

 

교란 변수 (Confounder, confounding variable)

 우리는 앞서  연속형 변수의 단순 선형 회귀 분석 (Simple linear regression: 2023.05.14 - [선형 회귀 분석/SAS] - [SAS] 단순 선형 회귀 분석 (Simple linear regression) - PROC REG) 포스팅에서 수축기 혈압과 심혈관 질환의 관련성을 찾아보았다. 그런데, 비만인 사람은 혈압이 대체적으로 높은 것으로 알려져 있다. 더구나 비만인 사람은 심혈관 질환의 위험도도 높아지는 것으로 알려져 있다. 그렇다면, "수축기 혈압이 높았던 사람에게서 높은 심혈관 질환 위험 점수가 발견되었던 것은 그냥 그 사람이 비만도가 높아 당연히 수축기 혈압도 높고, 심혈관 질환 위험 점수도 높았던 것이 아닐까?"라는 의문이 든다. 즉, "우리가 이전 단순 선형 회귀 분석에서 발견한 과학적 현상(수축기 혈압이 높으면 심혈관 질환 위험 점수가 높아진다.)은 사실은 비만 때문이 아니었을까?"라는 의문이 들게 된다. 이렇게 독립변수와 종속변수 모두의 원인이 되는 변수를 교란 변수라고 하며, 이런 현상(교란)은 통계 분석을 할 때 반드시 교정을 해야 한다. (사실 독립변수는 인과적 관계가 아니라 연관 관계이기만 해도 충분하다.)

교란 현상의 해결 방법: 다중 회귀 분석

 교란 현상을 해결하는 방법은 보정(adjustment)과 층화(stratification)가 있다. 층화도 좋은 방법이고, 때로는 보정을 할 수 없어 층화를 해야만 할 때도 있지만, 보통 표본의 수가 부족해지는 문제가 있기 때문에, 층화가 아니라 보정을 시행하곤 한다. 보정을 시행할 수 있는 방법으로는 이전에 다룬 편상관 분석(2023.04.20 - [상관분석/SAS] - [SAS] 편상관 계수, 부분 상관 계수 (Partial correlation coefficient) - PROC CORR)이 있다. 하지만 이는 상관 계수만 구할 수 있어 "예측할 수 있는 정도"만 표현할 수 있다. 그 대신 비만도의 영향을 보정했을 때, 수축기 혈압이 1 단위 증가할 때 심혈관 질환 위험 점수가 얼마나 증가하는지(기울기)를 알 수 있는 방법으로는 본 포스팅에서 다룰 다중 선형 회귀 분석이 있다.

 

*실습용 데이터는 아래 링크를 클릭하면 다운로드할 수 있습니다.

2022.08.04 - [공지사항 및 소개] - 분석용 데이터 (update 22.12.18)

 

분석용 데이터 (update 22.12.18)

2022년 12월 18일 버전입니다. 변수는 계속하여 추가될 예정입니다. 다음 카테고리에 있는 글에서 이용된 데이터입니다. - 기술 통계 - 범주형 자료 분석 - 모평균 검정 - 상관분석 - 반복 측정 자료

medistat.tistory.com

 

시작하기 위해 라이브러리를 만들고, 파일을 불러온다.

라이브러리 만드는 방법: 2022.08.05 - [통계 프로그램 사용 방법/SAS] - [SAS] 라이브러리 만들기 - LIBNAME

파일 불러오는 방법: 2022.08.05 - [통계 프로그램 사용 방법/SAS] - [SAS] 데이터 불러오기 및 저장하기 - PROC IMPORT, PROC EXPORT

*라이브러리 지정하기;
LIBNAME hong "C:/Users/User/Documents/Tistory_blog";

*파일 불러오기;
PROC IMPORT
DATAFILE="C:\Users\user\Documents\Tistory_blog\Data.xlsx"
DBMS=EXCEL
OUT=hong.df
REPLACE;
RUN;

 

 

목표:  BMI의 영향을 배제 혹은 교정했을 때 수축기 혈압(SBP)이 1 단위 증가할 때 심혈관 질환 위험 점수(CVD_RISK)는 얼마나 증가하는가?

 

단순 선형 회귀 분석과 같이 PROC REG 명령어를 사용하며, 코드는 다음과 같다.

코드

PROC REG DATA=hong.df;
MODEL CVD_RISK=SBP BMI;
RUN;

PROC REG DATA=hong.df; : 선형 회귀분석을 시작하라. 데이터는 hong 라이브러리에 있는 df를 사용하라.

 독립변수에 사용된 SBP, BMI 모두 연속변수이기에 PROC GLM이 아니라 REG를 사용해도 무방하다.
MODEL CVD_RISK=SBP BMI; :  종속 변수는 CVD_RISK로, 독립 변수에는 SBP와 BMI를 사용하라. SBP와 BMI의 순서가 바뀌는 것은 아무 상관이 없다. 즉, BMI를 보정했을 때의 SBP의 영향과 SBP를 보정했을 때의 BMI의 영향을 동시에 파악하는 것이다.

 

결과

해석의 방법은 단순 선형 회귀 분석에서와 같다. (2023.05.14 - [선형 회귀 분석/SAS] - [SAS] 단순 선형 회귀 분석 (Simple linear regression) - PROC REG) 그리고, Analysis of Variance Table, Root MSE, R-Square, Dependent Mean, Adj R-Sq, Coeff Var에 대한 내용도 위 단순 선형 회귀 분석 링크에서 확인할 수 있다.

 

 BMI의 영향을 보정하더라도, SBP가 1 단위 증가할 때 CVD_RISK는 0.99389만큼 증가하며 이에 대한 p-value는 0.0001보다 작아 매우 유의함을 알 수 있다. 

 또한, SBP의 영향을 보정하더라도, BMI가 1 단위 증가할 때 CVD_RISK는 1.08243만큼 증가하며 이에 대한 p-value는 0.0001보다 작아 매우 유의함을 알 수 있다. 

 

즉, 단순 회귀 분석에서 나타난 수축기 혈압과 심혈관 질환 위험 점수 사이의 유의한 관련성은 BMI의 영향을 보정하더라도 유의함을 알 수 있다. 또한, 단순 회귀 분석에서의 회귀 계수  1.10193보다 작으므로, 일부분의 설명력은 BMI에게 빼았겼음을 알 수 있다.

 

 

보정 변수가 두 개 이상일 때 코드

 BMI 외에 흡연 상태로도 보정하고 싶을 수 있다. 이럴 땐 어떻게 해야 할까? 답은, 단순히 BMI 뒤에 추가적인 보정변수를 띄어쓰기를 이용하여 나열하면 된다. 그런데, 선형 회귀 분석 전에 연속형 변수와 범주형 변수의 전처리가 다르다는 것을 일전에 소개한 적이 있다. 범주형 변수는 분석 전에 범주형 자료임을 SAS에게 알려주어야 한다. 내용은 다음 링크를 확인하면 된다.

연속형 변수: 2023.05.14 - [선형 회귀 분석/SAS] - [SAS] 단순 선형 회귀 분석 (Simple linear regression) - PROC REG

범주형 변수: 2023.10.19 - [선형 회귀 분석/SAS] - [SAS] 범주형 변수의 선형 회귀 분석 (Simple linear regression with categorical variable) - PROC REG, PROC GLM

 그런데, 흡연 상태 (SMOK)는 범주형 자료다. 따라서 선형 회귀 분석을 시행하기 전에 범주형임을 알려주어야 한다.

PROC GLM DATA=hong.df;
CLASS SMOK(REF='0');
MODEL CVD_RISK= SBP BMI SMOK/SOLUTION;
RUN;
QUIT;

PROC GLM DATA=hong.df; : 선형 회귀분석을 시작하라. 데이터는 hong 라이브러리에 있는 df를 사용하라.

 독립변수에 사용된 SMOK가 범주형 변수이기에 PROC REG이 아니라 GLM를 사용해야만 한다.

CLASS SMOK(REF='0'); : SMOK는 범주형 자료다. 참고치는 0으로 한다.
MODEL CVD_RISK= SBP BMI SMOK/SOLUTION;  : 결과변수는 CVD_RISK, 독립변수는 SBP, BMI, SMOK이다. 각 변수에 대한 beta값, 표준오차, p-value 등을 산출하라. (SOLUTION)
RUN; : 실행하라.
QUIT; : GLM을 종료하라. (QUIT이 필요하지 않은 다른 구문을 추가로 시행해도 상관없다.)

 

결과

 

 SBP, BMI는 유의한 결과를 보이고 있지만, SMOK는 1(과거 흡연자), 2(현재 흡연자) 모두 유의한 결과를 보이고 있지 않다. 

"BMI와 흡연 상태로 보정을 하였을 때, 수축기 혈압 1 단위 증가할 때, CVD_RISK는 0.98417668점 증가한다"라고 할 수 있지만

"SBP와 BMI로 보정을 하였을 때, 비흡연자와 과거 흡연자 혹은 비흡연자와 현재 흡연자 사이의 CVD_RISK의 차이는 존재하지만 유의하다고 할 수 없다."라고 결론 내리게 된다.

 또한 중요한 것은, 만약 SMOK를 단순히 보정변수로만 보고 CVD_RISK와 SBP 사이의 관계만 확인하고 싶다면, SMOK의 참고치(REF)를 무엇으로 설정하든 같은 결과를 낸다는 것이다. 따라서 주된 독립변수가 아니라면 REF를 무엇으로 잡을지 크게 신경 쓰지 않아도 될 뿐만 아니라, 따로 지정을 하지 않아도 상관없다.

 

위 두 개의 표는 다음 링크에서 내용을 확인하길 바란다. (2023.05.14 - [선형 회귀 분석/SAS] - [SAS] 단순 선형 회귀 분석 (Simple linear regression) - PROC REG) CVD_RISK Mean 은 위 링크에서 "Dependent Mean"에 해당한다.

위 두 개의 표 SS(Sum of Squares)에 관한 것인데, Type I과 Type III가 있다. 이는 다음 링크에서 내용을 확인하길 바란다. (링크 추가 예정)

코드 정리

*라이브러리 지정하기;
LIBNAME hong "C:/Users/User/Documents/Tistory_blog";

*파일 불러오기;
PROC IMPORT
DATAFILE="C:\Users\user\Documents\Tistory_blog\Data.xlsx"
DBMS=EXCEL
OUT=hong.df
REPLACE;
RUN;

*다중 선형 회귀분석 시행;
PROC REG DATA=hong.df;
MODEL CVD_RISK=SBP BMI;
RUN;


PROC GLM DATA=hong.df;
CLASS SMOK(REF='0');
MODEL CVD_RISK= SBP BMI SMOK/SOLUTION;
RUN;
QUIT;

 

[SAS] 다중 선형 회귀 분석 (Multiple linear regression) 정복 완료!

작성일: 2023.10.22.

최종 수정일: 2023.10.23.

이용 프로그램: SAS v9.4

운영체제: Windows 11

반응형
반응형

[SAS] 범주형 변수의 선형 회귀 분석 (Simple linear regression with categorical variable) - PROC REG, PROC GLM

 

지난 포스팅에서 우리는 수축기 혈압(SBP)과 심혈관 질병 위험 점수 (CVD_RISK)의 선형 회귀 분석에 대해 알아보았다.(2023.05.14 - [선형 회귀 분석/SAS] - [SAS] 단순 선형 회귀 분석 (Simple linear regression) - PROC REG) 이 분석에 쓰인 독립 변수인 수축기 혈압 (SBP)는 연속형 변수다. 만약 범주형 변수로 선형 회귀 분석을 시행하려 한다면 어떻게 해야 할까? 예를 들어 흡연 여부(SMOK: 비흡연자 or 과거 흡연자 or  현재 흡연자)로 심혈관 위험 점수를 예측하려 할 땐 어떻게 해야 할까? 이번 포스팅에서는 이에 대해 알아볼 것이다.

 

*실습용 데이터는 아래 링크를 클릭하면 다운로드할 수 있습니다.

2022.08.04 - [공지사항 및 소개] - 분석용 데이터 (update 22.12.18)

 

분석용 데이터 (update 22.12.18)

2022년 12월 18일 버전입니다. 변수는 계속하여 추가될 예정입니다. 다음 카테고리에 있는 글에서 이용된 데이터입니다. - 기술 통계 - 범주형 자료 분석 - 모평균 검정 - 상관분석 - 반복 측정 자료

medistat.tistory.com

 

시작하기 위해 라이브러리를 만들고, 파일을 불러온다.

라이브러리 만드는 방법: 2022.08.05 - [통계 프로그램 사용 방법/SAS] - [SAS] 라이브러리 만들기 - LIBNAME

파일 불러오는 방법: 2022.08.05 - [통계 프로그램 사용 방법/SAS] - [SAS] 데이터 불러오기 및 저장하기 - PROC IMPORT, PROC EXPORT

*라이브러리 지정하기;
LIBNAME hong "C:/Users/User/Documents/Tistory_blog";

*파일 불러오기;
PROC IMPORT
DATAFILE="C:\Users\user\Documents\Tistory_blog\Data.xlsx"
DBMS=EXCEL
OUT=hong.df
REPLACE;
RUN;

 

목표:  흡연 여부(SMOK)로 심혈관 위험 점수(CVD_RISK)를 예측할 수 있는가?

이전 단순 선형 회귀 분석에서 배운 대로 선형 회귀 분석을 시행하면 어떻게 될까? 자료의 유형 (연속형 vs 범주형)을 고려하지 않은 책 우선 분석을 시행해 보자. 분석 방법은 이전 포스팅(2023.05.14 - [선형 회귀 분석/SAS] - [SAS] 단순 선형 회귀 분석 (Simple linear regression) - PROC REG)을 보면 알 수 있다.

 

코드

PROC REG DATA=hong.df;
MODEL CVD_RISK=SMOK;
RUN;

 

결과

주목해야 할 건 "SMOK"이다. 이전 연속형 독립 변수로 시행한 선형 회귀 분석의 결과 해석은 "독립 변수가 1 단위 증가할 때 종속 변수의 변화량"="기울기"이다. 그러면 이 결과를 해석하면 어떻게 될까? 참고로 SMOK는 다음과 같은 변수다.

SMOK 해석
0 비흡연자
1 과거 흡연자
2 현재 흡연자

 SMOK가 1단위 증가할 때 CVD_RISK의 변화량은 "비흡연자에 비해 과거 흡연자가", "과거 흡연자에 비해 현재 흡연자가" 얼마나 더 높은 CVD_RISK의 값을 갖는지 표현하는 것이다. 근데 이 값은 15.2974로 같다. 즉, 비흡연자에서 과거 흡연자로 변하는 것과, 과거 흡연자에서 현재 흡연자로 변화하는 것이 같은 수준이라고 가정하고 있는 것이다. 이 말은 SMOK를 등간척도로 보고 있다는 말이다. 등간척도는 연속 변수의 일종이니, SAS는 현재 SMOK를 연속변수로 이해하고 있다는 것이다. 그도 그럴 것이 0,1,2로 구성된 변수를 SAS가 무슨 수로 범주형 변수인지, 연속형 변수인지 알겠는가. 따라서 우리가 직접 지정해주어야만 한다. SAS에서 범주형 변수임을 알려줄 때에는 CLASS구문을 사용한다.

 

잘못된 코드

PROC REG DATA=hong.df;
CLASS SMOK;
MODEL CVD_RISK=SMOK;
RUN;

이전 코드에서 다음 구문이 추가되었다.

CLASS SMOK; : "SMOK는 범주형 변수로 다뤄주세요."라는 뜻이다.

 

그런데 이 명령어는 실행되지 않는다. 왜냐하면 명령어 PROC REG는 CLASS구문을 받아들이지 못하기 때문이다. 이를 실행하기 위해서는 PROC GLM이라는 명령어를 사용해야 한다. 

 

(미완성) 코드

PROC GLM DATA=hong.df;
CLASS SMOK;
MODEL CVD_RISK=SMOK/SOLUTION;
RUN;
QUIT;

PROC GLM DATA=hong.df;  :PROC GLM 명령어를 시작하며, 데이터는 hong라이브러리의 df를 사용하라.
CLASS SMOK;  :SMOK는 범주형 변수로 처리하라
MODEL CVD_RISK=SMOK/SOLUTION;  :결과변수는 CVD_RISK, 독립변수는 SMOK이다. 각 변수에 대한 beta값, 표준오차, p-value등을 산출하라
RUN;  :PROC GLM을 실행하라.
QUIT;  :PROC GLM을 종료하라. 이 구문을 실행하지 않으면 "PROC GLM 실행 중"이라는 말이 계속 뜬다. 이를 없애기 위해서는 "QUIT;" 구문을 실행하거나, "QUIT;"가 필요하지 않은 구문들 (PROC FREQ, PROC UNIVARIATE 등)을 실행하면 된다. 

 

이와 같이 코드를 돌리면 다음과 같은 결과를 내준다.

결과

 

결과를 보면 범주형 변수로 바꾸기 전과 다르게, SMOK에 대한 결괏값이 2개가 나온다. SMOK0과 SMOK1다. SMOK는 0,1,2 세 개의 값을 갖는데, SMOK=0인 그룹과 SMOK=1인 그룹에 대한 통계 검정 결과를 나타내는 것이다. 그렇다면 왜 2는 없을까? 2는 참조값(reference)으로 쓰인 것이다. 즉 현재 흡연자(SMOK=2)에 비해 비흡연자 (SMOK=0)는 심혈관 질환 위험 점수 (CVD_RISK)가 30.0865680점 낮으며, p-value는 매우 작으므로(<0.0001) 이는 유의미한 차이라고 할 수 있다. 또한, 현재 흡연자(SMOK=2)에 비해 과거 흡연자 (SMOK=1)는 심혈관 질환 위험 점수 (CVD_RISK)가 12.4864196점 낮으며, p-value는 매우 작으므로(p<0.0001) 이는 유의미한 차이라고 할 수 있다. 

 

 그런데, 위 결과는 직관적이지 않다. 우리는 "흡연은 몸에 안 좋기 때문에, 흡연을 하면 심혈관 위험 점수가 높아진다."라고 생각한다. 즉, "현재 흡연자보다 비흡연자의 심혈관 위험 점수가 xx점 낮다."보다, "비흡연자보다 현재 흡연자의 심혈관 위험 점수가 xx점 높다."라는 표현이 친숙하다. 즉, 기준점(참조값)을 어떤 값으로 할지의 문제가 발생한다.

 SAS는 가장 큰 값을 자동으로 참조값으로 잡는다. 그래서 SMOK=2인 현재 흡연자가 reference로 잡혔다. 그런데, 위와 같은 문제 때문에 참조값(reference)을 현재 흡연자가 아닌 비흡연자로 지정하고 싶다면 어떻게 해야 할까? CLASS구문에서 (REF=)를 다음과 같이 지정해 주면 된다.

 

코드

PROC GLM DATA=hong.df;
CLASS SMOK(REF='0');
MODEL CVD_RISK=SMOK/SOLUTION;
RUN;
QUIT;

CLASS SMOK(REF='0') : SMOK는 범주형 변수로 처리하되, 기준치(REFerence)는 0(비흡연자)으로 잡아라. 

 

결과

SMOK1과 SMOK2에 대한 내용만 있고, SMOK0은 Estimate(beta) 값은 0으로 바뀌었다. 즉, 비흡연자 (SMOK=0)에 비해, 과거 흡연자 (SMOK=1)는 심혈관 위험 점수가 17.6012484점 높으며, 현재 흡연자 (SMOK=2)는 30.0865680점이 높다. 이 결과는 모두 통계적으로 유의하다 (p<0.0001).

 

위 두 개의 표는 다음 링크에서 내용을 확인하길 바란다. (링크 추가 예정)

 

이분형 변수는 범주형 지정이 필요 없다.

이분형 변수는 범주형 변수로의 변환이 굳이 필요는 없다. 왜냐하면 어차피 값이 두 개밖에 존재하지 않기 때문에, 연속형이든 범주형이든 같은 결과를 내기 때문이다. 하지만, 만약 0과 1로 이루어진 이분형 변수의 경우, 반드시 reference가 1이 되므로 만약 0을 reference로 잡고 싶은 경우, CLASS구문에서 reference를 지정해 주면 된다.

 

코드 정리

*라이브러리 지정하기;
LIBNAME hong "C:/Users/User/Documents/Tistory_blog";

*파일 불러오기;
PROC IMPORT
DATAFILE="C:\Users\user\Documents\Tistory_blog\Data.xlsx"
DBMS=EXCEL
OUT=hong.df
REPLACE;
RUN;

*범주형 변수의 선형 회귀분석 시행;
PROC GLM DATA=hong.df;
CLASS SMOK(REF='0');
MODEL CVD_RISK=SMOK/SOLUTION;
RUN;
QUIT;

 

[SAS] 범주형 변수의 선형 회귀 분석 (Simple linear regression with categorical variable) 정복 완료!

작성일: 2023.10.19.

최종 수정일: 2023.10.23.

이용 프로그램: SAS v9.4

운영체제: Windows 11

반응형
반응형

[SAS] 선형 회귀 분석의 전제 조건 - PROC REG

 

 지난 포스팅에서 단순 선형 회귀 분석을 소개하며, 전제 조건(가정)에 대한 논의가 필요하다고 했다. (단순 선형 회귀 분석: 2023.05.14 - [선형 회귀 분석/SAS] - [SAS] 단순 선형 회귀 분석 (Simple linear regression) - PROC REG) 보통 네 가지 전제조건을 의미하며, 그중 통계적으로 검정하는 조건은 세 가지다.

 

1) 정규성(Normality) : 잔차의 정규성

2) 선형성(Linearity) : 독립변수와 종속변수의 선형성

3) 잔차의 등분산성 (Homoscedasticity) : 잔차의 분산은 종속변수의 값에 따라 달라지지 않는다.

4) 독립성 (Independence): 관측 간의 독립성

 

이 중 4번 "독립성"은 통계적으로 검정하진 않는다. 독립성이란 개별 관측 간에는 연관되어있지 않다는 뜻이다. 대표적인 사례가 반복 측정이다. 같은 사람에서 약물 복용 전 간기능 수치와 약물 복용 후 간기능 수치를 비교한다면 두 개의 값은 "한 사람"에서 나왔기 때문에 독립이라고 볼 수 없다. 이런 경우 독립성을 만족한다고 볼 수 없다. 이런 경우 독립 표본 t 검정이 아닌 대응 표본 t 검정을 사용하는 것과 일맥상통한다. 유전적 정보를 공유하는 가족이나, 같은 경험을 하는 같은 반 학생들은 (항상 그런 것은 아니지만) 가끔 일반적인 선형 회귀 분석이 적절하지 않을 수 있다.

 

나머지 세 가지 전제조건에 대해 검증을 해보도록 하겠다.

 

*실습용 데이터는 아래 링크를 클릭하면 다운로드할 수 있습니다.

2022.08.04 - [공지사항 및 소개] - 분석용 데이터 (update 22.12.18)

 

분석용 데이터 (update 22.12.18)

2022년 12월 18일 버전입니다. 변수는 계속하여 추가될 예정입니다. 다음 카테고리에 있는 글에서 이용된 데이터입니다. - 기술 통계 - 범주형 자료 분석 - 모평균 검정 - 상관분석 - 반복 측정 자료

medistat.tistory.com

 

시작하기 위해 라이브러리를 만들고, 파일을 불러온다.

라이브러리 만드는 방법: 2022.08.05 - [통계 프로그램 사용 방법/SAS] - [SAS] 라이브러리 만들기 - LIBNAME

파일 불러오는 방법: 2022.08.05 - [통계 프로그램 사용 방법/SAS] - [SAS] 데이터 불러오기 및 저장하기 - PROC IMPORT, PROC EXPORT

*라이브러리 지정하기;
LIBNAME hong "C:/Users/User/Documents/Tistory_blog";

*파일 불러오기;
PROC IMPORT
DATAFILE="C:\Users\user\Documents\Tistory_blog\Data.xlsx"
DBMS=EXCEL
OUT=hong.df
REPLACE;
RUN;

 

목표:  수축기 혈압(SBP)과 심혈관 질환 위험 점수 (CVD_RISK) 사이의 선형 회귀 분석의 전제조건이 성립하는가?

 

먼저 선형 회귀 분석을 실시한다. (2023.05.14 - [선형 회귀 분석/SAS] - [SAS] 단순 선형 회귀 분석 (Simple linear regression) - PROC REG)

PROC REG DATA=hong.df;
MODEL CVD_RISK=SBP;
RUN;

 

SAS는 참 고맙게도, 전제 조건 확인을 위한 그래프를 바로 보여주고 있다.

그런데, 여러 그래프를 하나로 합쳐 보여주기 때문에 각 그래프를 자세히는 볼 수 없다는 단점이 있다. 이럴 때에는, 다음과 같이 기존 코드에 "plots=all"을 추가하면 각각의 그림을 크게 확인할 수가 있다.

 

코드

PROC REG DATA=hong.df plots=all;
MODEL CVD_RISK=SBP;
RUN;

실시하면 여러 개의 그래프를 보여주며, 우리는 그중 일부의 그래프만 사용할 것이다.

 

결과

1) 잔차의 정규성 (Normality)

일반 Q-Q plot처럼 해석하면 된다. (Q-Q plot내용은 다음 포스팅을 참고하길 바란다. 2022.08.12 - [기술 통계/SAS] - [SAS] 정규성 검정 - PROC UNIVARIATE) 대부분의 점이 45도의 점선 상에 있는 것을 알 수 있다. (비록 $x$축과 $y$축의 scale이 달라 45도처럼 보이지 않으나, $y=x$직선이다.) 따라서 잔차는 정규성을 따른다고 할 수 있다.

 

추가로 다음 그래프도 정규성을 따른다는 증거로 사용될 수 있다.

 

2) 선형성 (Linearity)

y축에 "Residual"이라고 쓰인 그래프를 확인한다.

해석 방법: Residual이 0 위아래에 고루 분포하며 특정한 형태나 패털을 보이지 않는다. 즉, 점선 위나 아래에 몰려있는 공간이 있으면 안 된다. 예를 들어 Fitted Values가 140인 근방에서는 Residuals이 0보다 큰 게 많고, 200인 근방에서는 0보다 작은 게 많은 상황이 발생했다면 선형성이 망가진 것이다. 

 

 여기서 유의할 것은 절대로 일반적인 산포도로 선형성을 확인하면 안 된다는 것이다. 이유로는 다음 두 가지를 들 수 있다.

 1) 독립변수가 여러 개인 다중 선형 회귀 분석에서는 차원의 문제로 산포도로 선형성을 확인하는 것이 쉽지 않다.

 2) 단순한 변수의 산포도를 확인하면 안 된다. 예를 들어 A와 B의 선형 회귀 분석을 시행할 것인데 A는 로그 변환하여 사용하기로 했다면 산포도는 A와 B의 산포도가 아니라, log(A)와 B의 산포도를 확인해야 한다. 

 

x축에는 수식으로 계산했을 때(a+bx) 예상되는 결과변수의 값(predicted value), y축에는 실제 결과변수의 값을 넣어 그린 plot이다. 본 데이터는 선형성을 만족하므로 점들이 직선관계를 이루고 있다. 선형관계를 만족하지 않는다면 이렇게 직선관계를 이루지는 않을 것이다. (사실 이 그림을 잘 변형하면 위와 같은 그림이 그려지게 된다.) 

 

3) 등분산성 (Homoscedasticity)

y축에 "RStudent"라고 쓰인 그래프를 확인한다.

해석 방법: 점들이 어떤 직사각형 안에 고루 퍼져있다면 등분산성을 만족한다. 그러므로 본 사례는 등분산성을 만족한다.

 설명의 용이성을 위해 단순 선형 회귀 분석에서 "잔차의 등분산성"의 의미는 다음과 같다. "각 SBP값에 대해 잔차의 분산은 같다." 그림으로 설명하면 다음 그림에서, 주황 박스 안의 잔차들의 분산이 파란 박스 안의 잔차들의 분산과 같다는 것이다. 물론 박스는 저 두 곳에만 위치하는 것이 안이라 전 구간에 걸쳐 존재하게 된다. 

 따라서, 점들이 어떤 직사각형 안에 고루 퍼져있지 않고, 특정 Fitted value에서만 넓게 퍼져있거나 좁게 분포해 있다면 등분산성 가정에 위배되게 될 것이다.

 

 

만약 단순 선형 회귀 분석이 아니라 다중 선형 회귀 분석인 경우 "각 SBP(독립 변수) 값에 대해 잔차의 분산은 같다."가 아니라 "예측된 종속 변수(CVD_RISK) 값에 대해 잔차의 분산은 같다."가 될 것이다.

 

주관적이지 않나?

 위 분석들은 모두 주관적으로 결론 내리고 있는 것이 사실이다. 통계적으로 어떤 p-value를 내는 검정 방법이 충분히 존재하겠지만, 현재로서는 대부분은 주관적으로만 판단을 내리고 있는 것이 현실이다. 세상이 바뀌고 객관적인 결정을 내리기를 요구하는 시대가 도래할지도 모르지만, 만약 그런 세대가 온다면, 아마도 위 전제 조건들을 엄격하게 모두 만족하는 데이터는 그리 많지 않을 것이다. 아마 현재로서도 이러한 현실적인 이유 때문에 그렇게까지 가정을 검정하라고 하지는 않는 것 같다.

 하지만 제안된 통계적 방법은 존재한다. 바로 Edsel의 Global Validation of Linear Models Assumptions(GVLMA)다. 이는 ㄴSAS에서는 불가능하고, R에서 gvlma패키지의 gvlma() 함수로 시행할 수 있다. (2022.12.22 - [선형 회귀 분석/R] - [R] 선형 회귀 분석의 전제 조건 - lm(), plot(), gvlma())

 

 

그런데, 왜 하필이면 이런 가정이 필요한 걸까? 이는 선형회귀분석으로 구한 회귀계수들이 참값이기 위한 가정이며, 이 가정들을 가우스-마르코프 정리 (Gauss-Markov theorem)라고 한다. 관련 내용은 다음 링크에서 확인할 수 있다. 2023.06.21 - [통계 이론] - [이론] 가우스-마르코프 정리 (Gauss-Markov Theorem)

 

코드 정리

*라이브러리 지정하기;
LIBNAME hong "C:/Users/User/Documents/Tistory_blog";

*파일 불러오기;
PROC IMPORT
DATAFILE="C:\Users\user\Documents\Tistory_blog\Data.xlsx"
DBMS=EXCEL
OUT=hong.df
REPLACE;
RUN;

*선형 회귀 분석 및 그래프 추출;
PROC REG DATA=hong.df plots=all;
MODEL CVD_RISK=SBP;
RUN;

[SAS] 선형 회귀 분석의 전제 조건 정복 완료!

작성일: 2023.10.17.

최종 수정일: 2023.10.17.

이용 프로그램: SAS v9.4

운영체제: Windows 11

반응형
반응형

[SAS] 단순 선형 회귀 분석 (Simple linear regression) - PROC REG

 

 지난 상관관계 분석에서 우리는 서로 다른 두 변수가 얼마나 관련되어 있는지를 알아보았다. 즉, 한 변수의 값으로 다른 변수의 값을 예측할 수 있는 정도인 "예측도"의 관점에서 상관 계수를 이해하였다.(2023.04.10 - [상관분석/SAS] - [SAS] 피어슨 상관 계수 (Pearson's correlation coefficient) - PROC CORR) 그런데, 상관 계수의 단점은 "예측도"만 확인할 수 있을 뿐, 실제로 예측을 할 수는 없다. 가령, 수축기 혈압(SBP)이 120인 사람의 심혈관 질환 위험 점수 (CVD_RISK)가 얼마인지는 알 수 없는 것이다. 이걸 가능하게 하는 것이 선형 회귀 분석 (linear regression)이다. 본 포스팅에서는 독립 변수가 1개인 단순 선형 회귀 분석 (simple linear regression)을 시행해 보도록 하겠다. 이는 독립 변수가 1개라는 점에서 univariate linear regression이라고도 부른다.

 

*실습용 데이터는 아래 링크를 클릭하면 다운로드할 수 있습니다.

2022.08.04 - [공지사항 및 소개] - 분석용 데이터 (update 22.12.18)

 

분석용 데이터 (update 22.12.18)

2022년 12월 18일 버전입니다. 변수는 계속하여 추가될 예정입니다. 다음 카테고리에 있는 글에서 이용된 데이터입니다. - 기술 통계 - 범주형 자료 분석 - 모평균 검정 - 상관분석 - 반복 측정 자료

medistat.tistory.com

 

시작하기 위해 라이브러리를 만들고, 파일을 불러온다.

라이브러리 만드는 방법: 2022.08.05 - [통계 프로그램 사용 방법/SAS] - [SAS] 라이브러리 만들기 - LIBNAME

파일 불러오는 방법: 2022.08.05 - [통계 프로그램 사용 방법/SAS] - [SAS] 데이터 불러오기 및 저장하기 - PROC IMPORT, PROC EXPORT

*라이브러리 지정하기;
LIBNAME hong "C:/Users/User/Documents/Tistory_blog";

*파일 불러오기;
PROC IMPORT
DATAFILE="C:\Users\user\Documents\Tistory_blog\Data.xlsx"
DBMS=EXCEL
OUT=hong.df
REPLACE;
RUN;

 

 

목표:  수축기 혈압(SBP)으로 심혈관 질환 위험 점수 (CVD_RISK)를 예측할 수 있는가?

 

선형 회귀 분석은 PROC REG이라는 함수를 사용한다.

코드

PROC REG DATA=hong.df;
MODEL CVD_RISK=SBP;
RUN;

PROC REG DATA=hong.df; : 회귀분석을 시행하는 코드를 시작한다 (PROC REG). 데이터는 hong 라이브러리의 df 데이터를 사용한다.
MODEL CVD_RISK=SBP; : 독립변수를 SBP로, 종속변수를 CVD_RISK로 하는 선형 회귀 분석을 시행한다

 

결과

하나씩 살펴보도록 하자.

 

SBP에 관한 것부터 보자.

 추정치(Estimate)는 1.10193이다. 이는 SBP가 1 증가할 때, CVD_RISK가 1.101935 증가한다는 의미다. 즉, 이는 $xy$평면에서 기울기를 의미하고, 양의 상관관계가 있다는 말이다. 이 값은 논문에서 종종 $\beta$값으로 불린다.

 추정치의 표준 오차는 0.00906다. 이는 추정치(Estimate)의 변동가능성을 의미하고, 이보다 오른쪽에 있는 Pr>|t|를 구할 때 사용된다.

Pr>|t|는 0.0001보다 작다. 이는 p-value를 의미하는데, $0.0001$보다 작으므로 매우 유의한 결과임을 알 수 있다. 그러므로 귀무가설을 기각하면 되는데, 선형 회귀분석에서는 귀무가설과 대립가설이 무엇일까?

 귀무가설: $H_0=$ 추정치(Estimate)는 0이다. 즉, 이 표본이 기원한 모집단에서 SBP와 CVD_RISK는 아무런 관련성이 없다.

 대립가설: $H_1=$ 추정치(Estimate)는 0이 아니다. 즉, 이 표본이 기원한 모집단에서 SBP와 CVD_RISK는 모종의 관련성이 있다.

따라서, 우리는  SBP와 CVD_RISK 사이의 양의 상관관계가 유의미하며, 추정치 1.10193는 유의미하다고 결론 내린다.

 

하지만, 우리가 선형 회귀 분석을 시작한 목적은 SBP의 값으로 CVD_RISK의 값을 예측하기 위함이었는데, 기울기만 알아서는 $xy$평면에서 직선을 그릴 수 없다. 우리는 $y$절편 또한 알아야 한다. 따라서 Intercept값을 보아야 한다.

Intercept는 23.036415이다. 사실 이 값에 대한 p-value는 큰 의미가 없다. 왜냐하면 우리는 이 값이 0이든 아니든 관심이 없기 때문이다. 

 

어찌 되었든 우리는 SBP와 CVD_RISK사이의 관계식이 다음과 같음을 알 수 있게 되었다.

$CVD\_RISK=23.036415+1.101935\times SBP$

 

 

그런데 결과창에 보면 SBP와 CVD_RISK의 산점도와 추세선을 같이 그려주고 있다. 

 추세선처럼 데이터에서 SBP가 증가할수록 CVD_RISK가 증가하고 있다. 하지만 모든 데이터가 완벽히 선 위에 있는 것은 아니다. 선 위의 값들은 예측된 값이므로 실제값과는 차이가 있다. 이 차이를 Residual라고 한다. 

 

 그럼 위 산점도의 오른쪽에 있는 숫자들을 보자. 이 내용은 결과창에서 표로도 제시하고 있다.

이 숫자들의 의미는 다음과 같다.

 

Root MSE(Mean Squared Error) 이는 위 산점도 옆 숫자들 중 MSE (26.793)에 루트를 씌운 값이다. 이는 위에서 설명한 residual의 표준오차가 5.176이라는 뜻이다. 

(산점도 그림의) Error DF 오차의 자유도가 998인데 자유도(degrees of freedom)가 언급된 이유는, 표준오차를 계산할 때 자유도를 이용하기 때문이다. 998인 이유는, 쉽게 설명하면 표본의 수인 1000에서 변수(SBP, Intercept=y절편)의 수인 2를 뺀 것이다. 어렵게 설명하면, 총 분산은 표본의 수에서 1을 뺀 999개의 자유도를 갖는다. 그리고, 모델 자체의 자유도는 변수의 수(2)에서  1을 뺀 1개의 자유도를 갖는다. 따라서 총 분산의 수(999)에서 모델의 자유도(1)을 뺀 998이 도출된다.

Dependent Mean : 종속변수인 CVD_RISK의 평균이다.

Coeff Var: 변동계수 (Coefficient of variance)에 100을 곱한 것이다. 따라서 다음 수식에 따라 구해진 것이다. $$Coeff\,Var = 100\times \frac {Root MSE} {Dependent Mean} =100\times \frac {5.17622}{171.82726}$$

R-squared:  0.9369 : R squared는 SBP가 CVD_RISK를 어느 정도 설명하는지를 의미한다. 여기에서는 SBP가 CVD_RISK를 93.69% 설명한다고 말할 수 있다.

Adj(usted) R-squared:  0.9368 : 본 분석은 독립 변수가 1개이므로 별로 의미는 없는 지표이다. 그럼에도 불구하고 Adjusted R-squared를 설명하면, 다음과 같다. 독립 변수가 많아지면 많아질수록 종속 변수를 설명하는 능력은 증가되기 마련이다. 하지만 마냥 변수가 많아진다고 실제로 설명력이 높아지는 것은 아니다. 따라서 어느 정도의 패널티를 주어야 하는데, 이 패널티를 고려한 것이 Adjusted R-squared이다.

 

다루지 않고 남은 한 개의 표를 마저 보자.

 이 표는 분산분석 표다.

1. DF: 자유도를 의미한다. 이렇게 숫자가 계산되는 이유는 위에서 밝히었다.

2. Sum of Squares: 분산분석 표에서 흔히들 이야기하는 SSR, SSE, SST에 관한 이야기다.

  Sum of Squares
Model SSR
Error SSE
Corrected Total SST

이를 구하는 방법, 그리고 관계식 등에 대한 내용은 다음 링크를 확인하길 바란다. 링크 추가 예정

 

3. Mean Square: Sum of Squares를 DF로 나누어 구한다.

4. F Value: 이는 Model의 Mean Square를 Error의 Mean Square로 나누어 구한다. 이 값은 F 분포를 따른다고 알려져 있으므로, 이에 해당하는 p-value를 구할 수 있고, 이는 Pr>F의 column에 나타나있다.

  이 내용은 사실 독립 변수가 1개인 본 분석에는 별로 의미가 없다. 그럼에도 불구하고 설명하면. 이 p-value의 귀무가설은 "모든 독립 변수의 Estimate가 0이다"이다. p-value가 0.05보다 작으므로 적어도 한 개 이상의 Estimate가 유의미한 값을 갖는다는 결론을 내리게 된다. 하지만 여기에서는 독립 변수가 원래 1개이므로 그 독립변수, SBP가 유의미하다는 것을 알 수 있다.

 

 

가정

 단순 선형 회귀 분석 자체는 간단하지만, 단순 선형 회귀 분석 시행의 전제조건을 따지는 것이 이보다 까다롭고 더 중요하다. 이는 내용이 꽤 많으므로 다음 포스팅을 참고하길 바란다. 링크 추가 예정

  

 

독립 변수의 종류: 연속형

 필자는 연속형 변수인 SBP를 독립 변수로 사용하였다. 만약 범주형 변수를 사용하고자 한다면 분석 방법이 약간은 달라지게 된다. 이에 관한 내용은 다음 링크에서 확인할 수 있다. 링크 추가 예정

 

코드 정리

*라이브러리 지정하기;
LIBNAME hong "C:/Users/User/Documents/Tistory_blog";

*파일 불러오기;
PROC IMPORT
DATAFILE="C:\Users\user\Documents\Tistory_blog\Data.xlsx"
DBMS=EXCEL
OUT=hong.df
REPLACE;
RUN;

*선형 회귀 분석;
PROC REG DATA=hong.df;
MODEL CVD_RISK=SBP;
RUN;

 

[SAS] 단순 선형 회귀 분석 (Simple linear regression) 정복 완료!

작성일: 2023.05.14.

최종 수정일: 2023.05.14.

이용 프로그램: SAS v9.4

운영체제: Windows 11

반응형

+ Recent posts