반응형

[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

반응형

+ Recent posts