Sas 로지스틱 회귀분석 class - sas lojiseutig hoegwibunseog class

로지스틱 프로그램 예제

R 프로그램

glm(pass~time,family=binomial,data=a1)
R에서는 glm(,generalized linear model) 함수를 사용합니다.
그리고 로지스틱회귀분석을 위해 family=binomial 사용합니다.

SAS 프로그램

PROC LOGISTIC DATA=a1 DESCENDING;

MODEL pass=time;

RUN;

SAS에서는 LOGISTIC 프로시져를 사용합니다.

CATMOD 프로시져를 사용해도 됩니다.

단 주의할 것은 DESCENDING 옵션을 사용해야 합니다.
(물론 무조건 DESCENDIGN 옵션을 사용하는 것은 아니구요 ^^^)

로지스틱 회귀분석의 주의할 점

로지스틱 회귀분석의 종속변수는

ln{ p /  (1-p) } 입니다. 이때 사건 A, B 가 있을 때 어떤 것을 기준으로 하는가?

중요한 문제입니다.

무슨 말인가? 하면

자동차 연습시간에 따른 면허시험 합격여부를 할 때,

합격이 1 인지, 불합격이 1인지에 대한 개념이 있어야 합니다.

SAS에서는 숫자가 작은 것을 기준으로 합니다.

그리하여 합격(1), 불합격(0) 로 입력되어 있으면 숫자가 작은 "불합격 확률"을 분석한 결과를 구하게 됩니다.

R에서는 지금껏 테스트해 본바로는

Factor에서 큰 것 기준으로 분석되었습니다.

확인되는 대로 결과를 올리도록 하겠습니다.

* SAS에서는 pass= 1-pass; 와 같이 recoding을 하거나 DESCENDING 옵션을 사용하시면 되고

  R에서는 그대로 사용하면 되는 것까지 확인했습니다.

  그런데 결과가 전혀 반대로 나오는 (음수와 양수로 서로 바뀜) 중요한 부분이므로

  예제를 검토하여 올리도록 하겠습니다.

* 암튼 로지스틱 회귀분석할 때에 주의하셔야 합니다.

SAS 기본 코드에 대한 저번 포스트에 이어, 이번에는 PROC 구문을 이용하는 기본 구문들을 정리해보고자 한다.

통계분석에서 사용되는 ANOVA, T-TEST, 로지스틱회귀분석 등 다양한 분석기법들은 모두 PROC구문을 이용해 작성된다.

(데이터 매니지먼트 잘해놔도 여기서 꼬이면 답도없다는..ㅠ)

해당 포스트는 아마 SAS를 실행할 때마다 자주 찾아볼 것 같은 느낌이 든다,,ㅎㅎ


1. PROC FORMAT

이전 포스트 8번 input문을 간단히 설명하며, put(숫자변수, format); 이 숫자변수를 문자변수로 바꿔주는 역할을 한다고 설명했다. 같은 원리로 작성된 문구라고 보면 된다!

보라색은 포맷이름이다. 구문만 제대로 쓴다면 마음대로 설정할 수 있지만, 헷갈림을 방지하기 위해 보통 변수명fmt 형식으로 작성한다.

= 기준 왼쪽은 숫자 형식으로 원래 변수의 값이다. 이를 범주형 그룹으로 나눈 문자형식의 포맷을 설정해준 것이다.

proc format;

value agefmt
        0-20 = '청소년'

        21-40 = '청년'; run;

value sexfmt

        1 = '남자'

        2 = '여자'; run;

proc print data = a; /*data a 를 출력*/

var age sex; /*원래 변수명*/

format age agefmt. sex sexfmt.; /*원래변수명 지정된포맷이름.*/ /*원래변수를 해당 포맷으로 출력*/

run;

2. PROC PRINT & PROC SORT

proc sort data = a;

by age weight; run; /*data a를 age와 weight변수를 기준으로 정렬*/

proc print data = a;

var age weight sex; run; /*data a 중 age weight sex 변수만 출력*/

proc sort data = a;

by  descending age weight; run; /*age weight 기준 내림차순으로 data a 정렬*/

TIP) 이전 포스트에서 배운 "조건문"에는 IF ELSE THEN 구문을 사용했다면, PROC 구문에서 조건절을 달기위해서는 WHERE 구문을 쓰면 된다.

3. PROC CONTENTS

proc contents data = a;

run; /*data a의 구성변수, 관측치 등 내용 요약*/

4. PROC SUMMARY

proc summary data = a;

class 범주형변수;

var 변수;

output out = work.aa sum = total N = freq; run; /*합계(SUM) = total이라는 이름, 빈도(N) = freq라는 이름으로 출력*/

5. PROC FREQ

빈도, 누적빈도, 퍼센트 등을 출력하는 proc 구문. 연속형 변수의 경우 빈도 등을 출력하는 것은 의미가 없다! 고로 주로 범주형 변수에 사용된다.

proc freq data = a;

table 범주형 변수명; run; /*범주형 변수의 빈도,누적빈도,퍼센트,누적퍼센트 등 출력 위한 기본 구문*/

proc freq data = a order = freq;

table 범주형 변수명; run; /*범주형 변수들의 빈도, 퍼센트 등 통계값을 관측치 많은 순서대로 출력*/

proc sort data = a;

by sex; run; /*data a sex변수 기준으로 정렬*/

proc freq data = a;

table 범주형 변수명; 

by sex; run; /*sex변수 기준 범주형 변수 통계값 추출. ex) sex = 1일때 범주형 변수 통계값, sex = 2일때 범주형변수 통계값*/

proc freq data = a; 

table 범주형변수명*범주형변수명; run; /*범주형변수들의 교차분석*/

proc freq data = a order=freq;

table 범주형변수명*범주형변수명; run; /*범주형변수들 교차분석하되, 관측치 많은 값부터 표시*/

5-1. 카이제곱검정 (PROC FREQ 이용): 범주형 변수들빈도와 백분율을 이용해 통계적 유의성을 검정할 때 사용하는 분석법

proc freq data = a;

table (sex income stress bogun_cd) * region / chisq; run;

proc freq data = a;

table (sex income stress bogun_cd) * region / chisq nocol norow nopercent; run; /*백분율 없애고 빈도값만 보여줌*/

table (sex income stress bogun_cd) * region / chisq nocol norow nofreq; run; /*빈도값없애고 백분율만 보여줌*/

prob 출력값 < 0.05 통계적으로 유의 (분포의 차이가 있고, 이는 통계적으로 유의하다.)
prob 출력값 > 0.05 통계적으로 유의하지 않음(분포의 차이가 있으나 통계적으로 유의하지 않다.)

6. PROC MEANS

변수의 평균, 표준편차등을 표현한다. 범주형 변수들의 평균은 통계학적으로 의미가 없으니 주로 연속형 변수에 사용된다.

proc means data = a;

var 연속형변수; run; /*연속형변수의 평균, 표준편차 등 통계값 추출*/

proc means data = a;

var 연속형변수;

class 범주형변수; run; /*범주형변수에 따른 연속형 변수의 통계값 추출*/

7. T-검정 (PROC TTEST 이용): 두 집단 간 통계적 유의성을 검정할 때 사용하는 분석법

proc ttest data = a;

class sex;  /*두집단으로 나뉘는 범주형 변수명*/

var age; run;

"PR>F값" < 0.05 분산이 다르다 (분산의 차이가 의미있다 = 등분산이 아니다)

 - unequal variance으로 가서 "PR>|t|값" < 0.05 통계학적 차이가 있다. 통계적 유의성이 있다.
"PR>F값" > 0.05 분산이 같다 (분산의 차이 의미 없다 = 등분산이다)

 - equal variance으로 가서 "PR>|t|값" > 0.05 통계학적 차이가 없다. 통계적 유의성이 없다.

8. ANOVA검정 (PROC ANOVA 이용): 세 집단 이상 간 통계적 유의성 검정 할 때 사용하는 분석법

proc anova data = a;

class bogun_cd; /*세 집단 이상으로 나뉘는 범주형 변수명*/

model 변수명(age) = bogun_cd /*class에서 지정해준 범주형 변수명*/; run;

"PR>F값" < 0.05 집단 간 평균 차이가 통계적으로 유의하다

"PR>F값" > 0.05 집단 간 평균 차이가 통계적으로 유의하지 않다

9. PROC UNIVARIATE (PROC MEANS와 기능 비슷): 연속형 변수의 통계값 추출

proc univariate data = a;

var 연속변수; run;

proc univariate data = a normal;

class sex(범주변수); 

var age(연속변수); run; /*연속형 변수 age가 정규분포를 따르는지 정규성을 검정함. 0.05보다 커야 정규성 만족*/

10. PROC GLM (PROC ANOVA와 양식 동일)

proc glm data = a;

class 범주형변수;

model 연속형변수명(age) = bogun_cd(연속&class에서 지정해준 범주변수); run; 

proc glm data = a;

class 범주형변수(ref = 'n'); /*범주형변수의 기준점 지정*/

model 연속형변수명 = bogun_cd(연속&class에서 지정해준 범주변수)/solution;

run; 

연속형 변수가 한단위 증가할수록, 범주형 변수는 "기준점"기준으로 봤을 때 n.nnn 증가/감소

11. 상관분석 (PROC CORR 이용): 두 변수 간 상관관계 분석에 사용

proc corr data = a;

var 변수1 변수2; run; /*숫자형 변수 최대 2개만 가능*/

12. 회귀분석 (PROC REG 이용)

proc reg data = a;

model 종속 = 독립; run; /*숫자형 연속변수만 가능*/ /*독립변수 1개이면 단순회귀, 2개이상이면 다중회귀분석*/

"PR>|t|값" < 0.05 다른 변수들을 보정한 결과, 독립변수가 한단위 증가할 때마다 종속변수는 n.nnn 증가/감소하며 이는 통계적으로 유의함

"PR>|t|값" > 0.05 다른 변수들을 보정한 결과, 독립변수가 한단위 증가할 때마다 종속변수는 n.nnn 증가/감소하며 이는 통계적으로 유의하지 않음

13. 로지스틱회귀분석 (PROC LOGISTIC 이용): 종속변수가 이분형일 때 사용하는 분석 방법

Proc logistic data = a;

class 범주형변수(ref = 'n'); /*범주형변수의 기준점 지정*/

model 종속변수(event = 'n') = 연속변수 & class에서 지정해준 범주변수; run;
/*event = 'n'으로 연속형변수의 기준점 지정, 종속변수(이분형)중 관심있는 사건이 일어날 값*/

연속변수: 다른 모든 변수를 통제했을 때, 연속변수가 한단위 증가할 수록 event = 'n'의 사건이 일어날 확률은 n.nn배 높다.

범주변수: 다른 모든 변수를 통제했을 때, 범주변수 ref='n'에 비해 nn이 event ='n'의 사건이 일어날 확률이 n.nn배 높다.

ex) 다른 모든 변수를 통제했을 때, 성별이 1인 경우에 비해 2일 때 흡연자가 될 확률이 1.02배 높다.

위 해석 모두 95% 범위 내에 1이 포함되지 않는 경우, 통계적으로 유의하다고 본다.


이렇게 두개의 포스트를 통해 8주간 전공수업에서 배웠던 SAS 기본 코드에 대해 복습(?)을 해보았다.

정말 많다.. 시험기간에 이거 몇시간만에 수업 다시 들으면서 쭉 정리했었는데.. 어떤 힘이 나를 이끈건지..ㅋㅎ

특히 이번 포스팅은 다시 적어보면서 언제 또 쓸지 모르는 SAS 코드와 분석방법, 해석 방법에 대해 정리할 수 있었던 기회였다.

다음 포스트에서는 내가 SAS로 분석해 기말 연구 과제로 제출했던 리포트 주제를 리뷰해보고자 한다.