제가 Line plot이 더 쉬울거라고 생각해서 지난주에 먼저 소개를 했는데 너무 길어졌고 많은양의 코드를 설명하느라 오히려 처음 접해보시는 분들은 힘들었을거라 생각해서 이번에는 scatter plot을 소개해드리겠습니다.
보통 임상시험에서 자주 쓰이는 BMI value를 이용하겠는데 계산방법은 구글로 찾아보시면 되겠습니다.
제일먼저 몸무게하고 키를 Y와 X-axis으로 하고 BMI value들을 scatter plot으로 간단하게 만들면 Figure A가 됩니다.
proc sgplot data=scat nocycleattrs noautolegend;
styleattrs datasymbols=(circlefilled )
datacontrastcolors=(blue darkgreen darkorange darkred) ;
scatter x=blwtkg y=blhtcm / group=bmigrp markercharattrs=(size=3);
xaxis label='Baseline Weight (kg)' labelattrs=(size=10) min=40 max=120;
yaxis min=145 max=195 label='Baseline Height (cm)' labelattrs=(size=10);
run;
bmigrp이라고 만들어서 다른 색깔로 차이를 뒤서 이정도면 그리 나쁜지는 않지만 칭찬들을만 하지는 않죠. 지난주에도 설명했지만 styleattrs를 이용하지않으면 SAS마음대로 하는데 user마음에 안들 가능성이 많아서 default보다는 언제나 styleattrs를 쓰는것을 추천합니다. 모양은 그저 circle인데 가운데 색깔을 채우라고 circle filled를 하나로 쓰는것이고 color들은 4개를 썼고요.
나머지는 특별한것이 없습니다. x와 y axis를 쓸때 min max를 쓰고 중간은 SAS가 알아서 하라고 하는 option을 써봤습니다. 아직 큰 질문은 없죠?
조금 더 보태면 문제가 있는 Underweight과 Overweight group 환자들은 아이디가 뭔지 쉽게 봤으면 하는데 subjid 변수를 써서 datalabel로 쓰면 모든 환자의 아이디가 나오니까 if bmigrp in (1,4) then subjid2=subjid; 라고 해서 두번째 아이디를 만들어서 쓰면 Figure B를 만들수있습니다. 거기에다 legend도 넣으면 4가지 색깔의 의미도 알수있고요.
proc sgplot data=scat
nocycleattrs noautolegend;
styleattrs datasymbols=(circlefilled )
datacontrastcolors=(blue
darkgreen darkorange darkred) ;
scatter x=blwtkg y=blhtcm / group=bmigrp datalabel=subjid2
datalabelattrs=(size=7) name='pts'
markercharattrs=(size=3);
xaxis label='Baseline Weight (kg)'
labelattrs=(size=10) min=40 max=120;
yaxis min=145 max=195 label='Baseline Height
(cm)' labelattrs=(size=10);
keylegend 'pts'/location=outside position=bottom title='BMI group:' ;
run;
사실 이정도만 해도 괜찮은 그래프죠?
좀더 "와!' 할정도의 그래프로 만들자면 Figure C1입니다. Band statement를 써서 만든것인데 저도 이렇게 쓸수있다는것을 알고는 처음에 놀랐는데 band statement가 꼭 직선을 쓰기위해서 특정한 숫자를 쓰지않고, 변수를 쓸수있다는 것이죠.
우선 그러기 위해서는 데이타를 준비해야 하는 과정을 소개합니다.
/* BMI Formula에서 키가 몸무게가 바뀔때마다 생기는 값을 구하는 것입니다 */
/* 구간을 4개로 만들어야 하기에 5개의 값이 필요하겠죠. */
data bmi;
do wtkg = 30 to 130 by 20; * 보통사람의 체중인데 자세한 데이타를 만들면 곡선이 부드러워 지기도 하지만 이정도면 되더군요;
b1=(10000*wtkg/1)**.5;
b2=(10000*wtkg/18.5)**.5;
b3=(10000*wtkg/25)**.5;
b4=(10000*wtkg/30)**.5;
b5=(10000*wtkg/150)**.5;
output;
end;
run;
data pats;
set pats;
bmigrp = ( blbmi < 18.5) +
(18.5 <= blbmi < 25 )*2 +
(25 <= blbmi < 30 )*3 +
(30 <= blbmi )*4;
if bmigrp in (1,4) then subjid2=subjid;
label bmigrp='BMI group:';
format bmigrp bmi.;
keep subjid subjid2 bmigrp blwtkg blhtcm;
run;
/* 보통 by statement없이 merge하는경우는 99.9%가 잘못하는것인데 이경우는 단지 bmi band value만을 붙이는거라서 */
/* 할수없이 이렇게 merge를 합니다. 다른 좋은 방법이 있으신 분은 조언 부탁드립니다. */
data scat;
merge bmi
pats;
run;
proc sgplot data=scat
nocycleattrs /*noborder*/ noautolegend;
styleattrs datasymbols=(circlefilled diamondfilled trianglefilled
squarefilled )
datacontrastcolors=(blue darkgreen
darkorange darkred) ;
band x=wtkg upper=b1 lower=b2 / transparency=.5 fillattrs=(color=lightblue);
band x=wtkg upper=b2 lower=b3 / transparency=.5
fillattrs=(color=lightgreen);
band x=wtkg upper=b3 lower=b4 / transparency=.5
fillattrs=(color=lightorange);
band x=wtkg upper=b4 lower=b5 / transparency=.5
fillattrs=(color=lightred);
scatter x=blwtkg y=blhtcm / group=bmigrp datalabel=subjid2
datalabelattrs=(size=7) name='pts' markercharattrs=(size=3);
xaxis label='Baseline Weight (kg)'
labelattrs=(size=10) min=40 max=120;
yaxis min=145 max=195 label='Baseline Height
(cm)' labelattrs=(size=10);
keylegend 'pts'/location=outside
position=bottom title='BMI group:' ;
run;
꼭 해야 하는것은 아니지만 예로 보여드릴려고 ciclefilled 뿐만아니라 다른 shape도 써 봤습니다. 그리고 band에서는 특정한 숫자가 아닌 b1-b5의 value를 썼습니다. transparency는 0 에 가까우면 불투명이고 1에 가까워지면서 불투명하게 하는것인데 뒷 배경색깔이 너무 진하다 생각하면 1에 가까운것을 바꾸면서 result를 보시면 됩니다.
그러면 Figure C2는 C1과 어떻게 다른가요? 다른점이 보이시나요? SGPlot은 지난번에도 말씀드렸듯이 덧칠을 하는 방법입니다. 그래서 scatter를 band전에 쓰면 band들이 scatter위에 덧칠을 하게되어서 marker들이 희미하게 됩니다. 그래서 같은 문장들을 쓰더라도 마지막것이 전에 그렸던것위에 덧칠을 한다는것을 꼭 기억하시면 좋은 그래프를 만드는데 도움이 될겁니다. 특히 scatter를 하나이상쓰면서 같은 곳에 marker를 그리면 앞에것은 안보이게 됩니다. 사이즈를 다른게 하던가 뒤에 것의 transparency를 조금 투명하게 한다던가 하면서 콘트롤 할수있겠죠. 이 예에서는 제가 일부러 scatter를 band뒤에 썼는데 이유를 아시겠죠?
자주 쓰이는 scatter plot하나 더 곧 올리겠습니다. 지난주보다는 훨씬 간단하니 직접 돌려보시면 도움이 될겁니다.
scat.sas7bdat
test_f_scat.doc
첫댓글 감사합니다.