로지스틱 프로그램 예제 R 프로그램 glm(pass~time,family=binomial,data=a1) SAS 프로그램 PROC LOGISTIC DATA=a1 DESCENDING; MODEL pass=time; RUN; SAS에서는 LOGISTIC 프로시져를 사용합니다. CATMOD 프로시져를 사용해도 됩니다. 단 주의할 것은 DESCENDING 옵션을 사용해야 합니다. 로지스틱 회귀분석의 주의할 점 로지스틱 회귀분석의 종속변수는 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 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 통계적으로 유의 (분포의 차이가 있고, 이는 통계적으로 유의하다.) 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 통계학적 차이가 있다. 통계적 유의성이 있다. - 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'의 사건이 일어날 확률은 n.nn배 높다. 범주변수: 다른 모든 변수를 통제했을 때, 범주변수 ref='n'에 비해 nn이 event ='n'의 사건이 일어날 확률이 n.nn배 높다. ex) 다른 모든 변수를 통제했을 때, 성별이 1인 경우에 비해 2일 때 흡연자가 될 확률이 1.02배 높다. 위 해석 모두 95% 범위 내에 1이 포함되지 않는 경우, 통계적으로 유의하다고 본다. 이렇게 두개의 포스트를 통해 8주간 전공수업에서 배웠던 SAS 기본 코드에 대해 복습(?)을 해보았다. 정말 많다.. 시험기간에 이거 몇시간만에 수업 다시 들으면서 쭉 정리했었는데.. 어떤 힘이 나를 이끈건지..ㅋㅎ 특히 이번 포스팅은 다시 적어보면서 언제 또 쓸지 모르는 SAS 코드와 분석방법, 해석 방법에 대해 정리할 수 있었던 기회였다. 다음 포스트에서는 내가 SAS로 분석해 기말 연구 과제로 제출했던 리포트 주제를 리뷰해보고자 한다. |