때때로 건강보험공단 데이터를 분석하다 보면 CCI (Charlson Comorbidity Index) 지수를 계산해야 할 때가 있다. 이걸 공단에서 붙여주는 경우도 있다고 하는데, 아닐 때도 있다고 해서 (확실하지 않음) 나는 교수님께 코드를 받아 데이터에 맞게 수정하고 계산했다.
아래는 표본코호트 DB에 적용할 수 있는 CCI 지수 계산 SAS 코드이다.
CCI 지수는 관심 질환으로 진단을 받은 시점부터 1년 이전까지의 의료 이용 기록을 보는 것이 일반적이고, 주진단 및 부진단명에 나온 동반질환들을 확인한다. (참고자료: https://doi.org/10.4332/KJHPA.2016.26.1.71)
그래서 아래 코드는 분석을 원하는 진단의 최초 의료 이용 시점을 확인하고, 그로부터 1년 이전까지의 의료 이용 기록까지만을 확인하여 CCI 지수를 계산할 수 있게 만든 코드인데 내가 실제로 분석에 사용할 때는 이것보다 더 개량된 코드를 사용하였기 때문에 혹시라도 사용하실 분들은 마찬가지로 참고만 하시기를 바랍니다.
/*데이터 전처리 파트*/
PROC SQL;
CREATE TABLE STEP0 AS /*FIRST DT: 관심질환 처음 의료이용 날짜, DS_STRT_YR: 관심질환 처음 의료이용 연도, DS_STRT_MT: 관심질환 처음 의료이용 월*/
SELECT *, MIN(MDCARE_STRT_DT) AS FIRST_DT, ROUND(MIN(MDCARE_STRT_DT)/10000) AS DS_STRT_YR, ROUND(MIN(MDCARE_STRT_DT)/100) AS DS_STRT_MT
FROM NSC2_M30
WHERE MCARE_DIV_CD='행위수가코드'
GROUP_BY RN_INDI;
QUIT;
PROC SQL;
CREATE TABLE STEP1 AS /*MDCARE_STRT_DT: 관심질환 외 다른 의료이용들의 날짜*/
SELECT DISTINCT A.RN_INDI, B.RN_KEY, B.FIRST_DT, B.DS_STRT_YR, B.DS_STRT_MT, B.MDCARE_STRT_DT, B.SICK_SYM1, C.STD_YYYY
FROM STEP0 AS A
INNER JOIN NSC2_M20 AS B
ON A.RN_INDI=B.RN_INDI;
QUIT;
/*매크로 파트*/
%MACRO CCI_CALCULATE(DATA, DES, NUM, YEAR);
%DO;
PROC SQL;
CREATE TABLE &DATA. AS
SELECT RN_INDI, RN_KEY, DS_STRT_YR, ROUND(MDCARE_STRT_DT/10000) AS MDCARE_STRT_YR, SICK_SYM1
FROM STEP1
WHERE SUBSTR(SICK_SYM1, 1, &NUM) IN (&DES)
AND ROUND(MDCARE_STRT_DT/10000) >= (DS_STRT_YR-&YEAR)
AND ROUND(MDCARE_STRT_DT/100) <= DS_STRT_MT;
QUIT;
PROC SORT DATA=&DATA.;
BY RN_INDI MDCARE_STRT_YR;
RUN;
%END;
%MEND;
%CCI_CALCULATE(CCI11, 'I21' 'I22', 3, 1);
%CCI_CALCULATE(CCI21, 'I43' 'I50', 3, 1);
%CCI_CALCULATE(CCI31, 'I70' 'I71', 3, 1);
%CCI_CALCULATE(CCI41, 'G45' 'G46' 'I60' 'I61' 'I62' 'I63' 'I64' 'I65' 'I66' 'I67' 'I68' 'I69', 3, 1);
%CCI_CALCULATE(CCI51, 'F00' 'F01' 'F02' 'F03' 'G30', 3, 1);
%CCI_CALCULATE(CCI61, 'J40' 'J41' 'J42' 'J43' 'J44' 'J45' 'J46' 'J47' 'J60' 'J61' 'J62' 'J63' 'J64' 'J65' 'J66' 'J67', 3, 1);
%CCI_CALCULATE(CCI71, 'M05' 'M06' 'M32' 'M33' 'M34', 3, 1);
%CCI_CALCULATE(CCI81, 'K25' 'K26' 'K27' 'K28', 3, 1);
%CCI_CALCULATE(CCI91, 'B18' 'K73' 'K74', 3, 1);
%CCI_CALCULATE(CCI121, 'G81' 'G82', 3, 1);
%CCI_CALCULATE(CCI131, 'N18' 'N19', 3, 1);
%CCI_CALCULATE(CCI141, 'C00' 'C01' 'C02' 'C03' 'C04' 'C05' 'C06' 'C07' 'C08' 'C09' 'C10' 'C11' 'C12' 'C13' 'C14' 'C15' 'C16' 'C17' 'C18' 'C19'
'C20' 'C21' 'C22' 'C23' 'C24' 'C25' 'C26' 'C30' 'C31' 'C32' 'C33' 'C34' 'C37' 'C38' 'C39' 'C40' 'C41' 'C43' 'C45' 'C46' 'C47' 'C48' 'C49' 'C50' 'C51' 'C52'
'C53' 'C54' 'C55' 'C56' 'C57' 'C58' 'C60' 'C61' 'C62' 'C63' 'C64' 'C65' 'C66' 'C67' 'C68' 'C69' 'C70' 'C71' 'C72' 'C73' 'C74' 'C75' 'C76'
'C81' 'C82' 'C83' 'C84' 'C85' 'C88' 'C90' 'C91' 'C92' 'C93' 'C94' 'C95' 'C96' 'C97', 3, 1) ;
%CCI_CALCULATE(CCI161, 'C77' 'C78' 'C79' 'C80', 3, 1);
%CCI_CALCULATE(CCI171, 'B20' 'B21' 'B22' 'B24', 3, 1);
%CCI_CALCULATE(CCI12, 'I252', 4, 1);
%CCI_CALCULATE(CCI22, 'I099' 'I110' 'I130' 'I132' 'I252' 'I420' 'I425' 'I426' 'I427' 'I428' 'I429' 'P290', 4, 1);
%CCI_CALCULATE(CCI32, 'I731' 'I738' 'I739' 'I771' 'I790' 'I792' 'K551' 'K558' 'K559' 'Z958' 'Z959', 4, 1);
%CCI_CALCULATE(CCI42, 'H340', 4, 1);
%CCI_CALCULATE(CCI52, 'F051' 'G311', 4, 1);
%CCI_CALCULATE(CCI62, 'I278' 'I279' 'J701' 'J703', 4, 1);
%CCI_CALCULATE(CCI72, 'M315' 'M351' 'M353' 'M360', 4, 1);
%CCI_CALCULATE(CCI92, 'K700' 'K701' 'K702' 'K703' 'K709' 'K713' 'K714' 'K715' 'K717' 'K760' 'K762' 'K763' 'K764' 'K768' 'K769' 'Z944', 4, 1);
%CCI_CALCULATE(CCI102, 'E100' 'E101' 'E106' 'E108' 'E109' 'E110' 'E111' 'E116' 'E118' 'E119' 'E120' 'E121' 'E126' 'E128' 'E129' 'E130' 'E131' 'E136' 'E138' 'E139' 'E140' 'E141' 'E146' 'E148' 'E149', 4, 1);
%CCI_CALCULATE(CCI112, 'E102' 'E103' 'E104' 'E105' 'E107' 'E112' 'E113' 'E114' 'E115' 'E117' 'E122' 'E123' 'E124' 'E125' 'E127' 'E132' 'E135' 'E137' 'E142' 'E143' 'E144' 'E145' 'E147', 4, 1);
%CCI_CALCULATE(CCI122, 'G041' 'G114' 'G801' 'G802' 'G830' 'G831' 'G832' 'G833' 'G834' 'G839', 4, 1);
%CCI_CALCULATE(CCI132, 'I120' 'I131' 'N032' 'N033' 'N034' 'N035' 'N036' 'N037' 'N052' 'N053' 'N054' 'N055' 'N056' 'N057' 'N250' 'Z490' 'Z491' 'Z492' 'Z940' 'Z992', 4, 1);
%CCI_CALCULATE(CCI152, 'I850' 'I859' 'I864' 'I982' 'K704' 'K711' 'K721' 'K729' 'K765' 'K766' 'K767', 4, 1);
/*데이터 병합 파트*/
DATA CCI1; MERGE CCI11 CCI12; BY RN_INDI; CCI1=1; RUN;
DATA CCI2; MERGE CCI21 CCI22; BY RN_INDI; CCI2=1; RUN;
DATA CCI3; MERGE CCI31 CCI32; BY RN_INDI; CCI3=1; RUN;
DATA CCI4; MERGE CCI41 CCI42; BY RN_INDI; CCI4=1; RUN;
DATA CCI5; MERGE CCI51 CCI52; BY RN_INDI; CCI5=1; RUN;
DATA CCI6; MERGE CCI61 CCI62; BY RN_INDI; CCI6=1; RUN;
DATA CCI7; MERGE CCI71 CCI72; BY RN_INDI; CCI7=1; RUN;
DATA CCI8; MERGE CCI81; BY RN_INDI; CCI8=1; RUN;
DATA CCI9; MERGE CCI91 CCI92; BY RN_INDI; CCI9=1; RUN;
DATA CCI10; MERGE CCI102; BY RN_INDI; CCI10=1; RUN;
DATA CCI11; MERGE CCI112; BY RN_INDI; CCI11=1; RUN;
DATA CCI12; MERGE CCI121 CCI122; BY RN_INDI; CCI12=1; RUN;
DATA CCI13; MERGE CCI131 CCI132; BY RN_INDI; CCI13=1; RUN;
DATA CCI14; MERGE CCI141; BY RN_INDI; CCI14=1; RUN;
DATA CCI15; MERGE CCI152; BY RN_INDI; CCI15=1; RUN;
DATA CCI16; MERGE CCI161; BY RN_INDI; CCI16=1; RUN;
DATA CCI17; MERGE CCI171; BY RN_INDI; CCI17=1; RUN;
DATA CCI; MERGE CCI1 - CCI17; BY RN_INDI;
IF CCI1=. THEN CCI1=0; IF CCI2=. THEN CCI2=0; IF CCI3=. THEN CCI3=0;
IF CCI4=. THEN CCI4=0; IF CCI5=. THEN CCI5=0; IF CCI6=. THEN CCI6=0;
IF CCI7=. THEN CCI7=0; IF CCI8=. THEN CCI8=0; IF CCI9=. THEN CCI9=0;
IF CCI10=. THEN CCI10=0; IF CCI11=. THEN CCI11=0; IF CCI12=. THEN CCI12=0;
IF CCI13=. THEN CCI13=0; IF CCI14=. THEN CCI14=0; IF CCI15=. THEN CCI15=0;
IF CCI16=. THEN CCI16=0; IF CCI17=. THEN CCI17=0;
CCI=CCI1+CCI2+CCI3+CCI4+CCI5+CCI6+CCI7+CCI8+CCI9+1*CCI10+2*CCI11+2*CCI12+2*CCI13+2*CCI14+3*CCI15+6*CCI16+6*CCI17;
RUN;
DATA CCI_EX; SET CCI; KEEP RN_INDI CCI; RUN;
PROC SORT DATA=CCI_EX OUT=CCI_EX2 NODUPKEY; BY RN_INDI; RUN;
PROC SQL;
CREATE TABLE NSC2_M20_CCI AS
SELECT A.*, B.CCI
FROM NSC2_M20 AS A
LEFT JOIN CCI_EX2 AS B
ON A.RN_INDI=B.RN_INDI;
QUIT;
DATA NSC2_M2O_CCI; SET NSC2_M2O_CCI;
IF CCI=. THEN CCI=0;
RUN;
'공부 > SAS' 카테고리의 다른 글
[SAS] TOT_MCNT (총 투여 일수/실시 횟수) 전처리 (1) | 2024.11.23 |
---|---|
[SAS] Hazard Ratio (HR) Forest Plot 그리기 (0) | 2024.11.23 |
[SAS] 생존분석 (Survival Analysis) - Time-dependent Cox Proportional Hazard Model (0) | 2024.11.22 |
[SAS] 생존분석 (Survival Analysis) - Cox Proportional Hazard Model (0) | 2024.11.22 |
[SAS] 생존분석 (Survival Analysis) - 다중공선성 및 비례위험가정, Kaplan-Meier Plot (0) | 2024.11.22 |