상세 컨텐츠

본문 제목

[SAS]조절효과 분석을 위한 평균중심화 with PROC MEANS, SQL

SAS

by 대학원생D군 2023. 3. 10. 06:14

본문

반응형

안녕하세요,

논문을 검색하다 보면 조절효과를 분석하는 논문을 어렵지 않게 찾아볼 수 있습니다. 여기서 말하는 조절효과란 독립변수와 종속변수 간의 관계가 조절변수에 따라서 달라지는 것을 의미합니다. 그리고 조절변수를 사용할 때 평균중심화(mean centering)라는 것을 사용합니다. 일부에서는 평균 중심화를 통하여 다중공선성 문제를 해결할 수 있다고 설명합니다. 그러나 저는 이러한 주장에 대하여 회의적인 시선을 갖고 있습니다. 이번 포스팅은 평균중심화 방법에 대한 이야기임으로 참고하시면 좋을 만한 포스팅만 하나 추천드립니다. 

 

조절효과, 평균중심화, 다중공선성에 대한 오해와 진실

조절효과(상호작용효과)를 다룬 논문을 보면 독립변수인 X, 조절변수인 M을 평균중심화(mean centering) 하여 분석하는 경우가 많다. 그리고 평균중심화를 하지 않으면 X와 M이 둘의 곱셈항 XM과 높은

ukchanoh.wordpress.com

결국 저는 평균 중심화는 조절효과 분석 시 상호작용항으로 인하여 발생하는 다중공선성을 해결하기 위한 하나의 방법이 아닌 조절효과 해석의 용이성을 높이기 위하여 필요한 것이라고 생각합니다. 그렇기 때문에 평균 중심화를 하는 SAS 코드 3가지를 소개해드리고자 합니다. 이번에도 SASHELP.CLASS 데이터셋을 활용하였고 AGE변수를 평균 중심화해 보겠습니다. 그리고 Grand mean 평균 중심화를 하는 방법을 중심으로 설명하겠습니다.

PROC MEANS > DATA STEP

제가 생각할 때 가장 접근하기 쉽고 효과적인 방법입니다. 물론 소수점으로 인하여 미세한 결과의 차이가 있을 수 있습니다.

PROC MEANS DATA=SASHELP.CLASS;
RUN;

DATA CLASS;
	SET SASHELP.CLASS;
	AGE_M=AGE-13.3157895;
RUN;

PROC PRINT DATA=CLASS;
RUN;

1. PROC MEANS 프로시저로 변수의 평균을 구합니다. AGE의 평균은 13.3157895입니다.

2. DATA STEP을 통해서 개별 관측치의 값에 평균을 직접 빼면 됩니다(AGE_M=AGE-13.3157895). AGE_M이 평균 중심화를 한 변수입니다. 

'평균 중심화만 빨리하고 싶다' 하시는 분들은 위의 코드 만으로도 충분하기 때문에 아래의 코드는 정신 건강을 위하여 보시지 않으셔도 됩니다.

 

PROC MEANS > DATA STEP > DATA STEP
  1. PROC MEANS로 변수의 평균을 구한 후 그 값을 데이터셋에 저장한 후
  2. DATA STEP으로 기존의 데이터와 평균이 저장된 데이터셋을 결합하여 평균 중심화를 하는 방법

우선 PROC MEANS 프로시저로 AGE의 평균을 구합니다. 이때 이전과 다른 부분은 OUTPUT OUT=GRAND MEAN=MEAN이라는 코드가 추가되었다는 점입니다. SAS에서는 분석결과를 데이터셋에 저장할 때 OUTPUT OUT을 사용하는데 아래의 코드는 PROC MEANS 분석결과를 GRAND라는 데이터셋에 저장하는데 평균은 MEAN이라는 변수명으로 저장하라는 명령어입니다.

PROC MEANS DATA=SASHELP.CLASS;
	VAR AGE;
	OUTPUT OUT=GRAND MEAN=MEAN;
RUN;

PROC PRINT DATA=GRAND;
RUN;

위의 코드를 작동시키면 GRAND라는 데이터셋이 생성됩니다. 그 결과는 아래와 같습니다.

이후 두 데이터셋을 MERGE를 이용해서 결합하면 됩니다. 그러나 단순히 DATA > MERGE > RUN 만 사용하게 되면 첫번째 행에만 값이 있고 이후의 값에는 결측치(.)로 처리되어 있는 것을 확인하시게 됩니다. 그렇기 때문에 RETAIN과 DO 루프를 통하여 값이 결측치로 처리되지 않도록 해야 합니다. 이후 DROP으로 불필요한 변수를 삭제하고 평균 중심화 변수를 계산하는 식을 넣어주게 됩니다.

DATA CLASS;
	SET SASHELP.CLASS;
RUN;

DATA FINAL;
	MERGE CLASS GRAND;
	RETAIN M;
	IF _N_ = 1 THEN DO;
	M=MEAN;
	END;
	DROP _FREQ_ _TYPE_ MEAN;
	AGE_M=AGE-M;
RUN;

PROC PRINT DATA=FINAL;
RUN;

PROC SQL

마지막은 SQL입니다. SQL에 관심이 있으신 분들을 위해서 준비해보았습니다. SASHELP.CLASS라는 데이터셋에서 MEAN(AGE)를 계산해서 M이라는 변수를 만들고 AGE-MEAN(AGE)를 계산해서 AGE_M이라는 변수를 만들라는 코드입니다. SQL의 경우 DATA STEP 보다 속도가 빠르다는 장점이 있고 2번째 코드와 비교할 때 코드가 상당히 짧은 것을 알 수 있습니다.

PROC SQL;
	CREATE TABLE FINAL AS
	SELECT *, MEAN(AGE) AS M,
	AGE-MEAN(AGE) AS AGE_M FROM SASHELP.CLASS;
QUIT;

PROC PRINT DATA=FINAL;
RUN;

 

물론 첫번째 방법보다 2, 3번째 방법이 효과적인 경우도 분명 있습니다. 무엇보다 평균을 복사+붙여넣기 하는 과정에서 오탈자의 위험성은 없겠지요. 그러나 누군가에게는 간단한 평균중심화를 위하여 2번째, 3번째 코드를 공부하는 것은 굉장히 비효율적일 수 있습니다. 코드를 공부하는 목적에 따라 다르겠지만 대부분의 사회과학 연구자에게 코드는 연구질문에 대한 답을 찾아가기 위한 하나의 수단일 뿐이니까요. 그러므로 필요에 맞게 잘 활용하셨으면 좋겠습니다!

 

감사합니다!

 

☆ 제 코드는 정답이 아니며 틀린 부분이 있을 수 있으니 주의하여 활용하시기 바랍니다.

 

반응형

관련글 더보기

댓글 영역