Hi all, I am really frustrated. I just changed the code definition for certain comorbidities using the same format as the original NCI macro code. However, I got the following error. Could you please help me to identify the problem? I sincerely appreciate your time and help. (I attached the log and original code below for your reference)
Log:
9643 data first_record_test;
9644 set merged_final;
9645
9646 array icd9 {*} case_1_d0 case_1_d1 case_1_d2 case_1_d3 case_1_d4 case_1_d5
9646! case_1_d6 case_1_d7 case_1_d8 case_1_d9
9647 case_1_p1 case_1_p2 case_1_p3 case_1_p4 case_1_p5 case_1_p6
9647! case_1_p7 case_1_p8 case_1_p9 case_1_p10
9648 case_1_p11 case_1_p12 case_1_p13 case_1_p14 case_1_p15 case_1_p16
9648! case_1_p17 case_1_p18 case_1_p19 case_1_p20
9649 case_1_p21 case_1_p22 case_1_p23 case_1_p24 case_1_p25 case_1_p26
9649! case_1_p27 case_1_p28 case_1_p29 case_1_p30;
9650
9651 do i=1 to dim(icd9);
9652
9653 *** ACUTE MYOCARDIAL INFARCTION;
9654 if icd9(i) in:('410') then acute_mi = 1;
9655
9656
9657 *** HISTORY OF MYOCARDIAL INFARCTION;
9658 else if icd9(i) in:('412') then history_mi = 1;
9659
9660
9661 *** CONGESTIVE HEART FAILURE;
9662 else if icd9(i)
9662! in:('39891','40201','40211','40291','40401','40403','40411','40413','40491','40493',
9663 '4254','4255','4256','4257','4258','4259','428')then chf = 1;
9664
9665
9666 *** PERIPHERAL VASCULAR DISEASE;
9667 else if icd9(i) in:('0930','440','441','4471','5571','5579','V434') or
9668 ('4431'<=:icd9(i)<=:'4439') then pvd = 1;
9669
9670
9671 *** CEREBROVASCULAR DISEASE;
9672 else if icd9(i) in:('36234') or ('430'<=:icd9(i)<=:'438') then cvd = 1;
9673
9674
9675 *** COPD;
9676 else if icd9(i) in:('4168','4169','5064','5081','5088') or ('490'<=:icd9(i)<=:'505')
9676! then copd = 1;
9677
9678
9679 *** DEMENTIA;
9680 else if icd9(i) in:('290','2941','3312') then dementia = 1;
9681
9682
9683 *** PARALYSIS;
9684 else if icd9(i) in:('3341','342','343','3449') or ('3440'<=:icd9(i)<=:'3446') then
9684! paralysis = 1;
9685
9686
9687 *** DIABETES;
9688 else if icd9(i) in:('2508','2509') or ('2500'<=:icd9(i)<=:'2503') then diabetes = 1;
9689
9690
9691 *** DIABETES WITH COMPLICATIONS;
9692 else if icd9(i) in:('2504'<=:icd9(i)<=:'2507') then diabetes_comp = 1;
-- -
79 388
200
ERROR 79-322: Expecting a ).
ERROR 388-185: Expecting an arithmetic operator.
ERROR 200-322: The symbol is not recognized and will be ignored.
9693
9694
9695 *** MODERATE-SEVERE RENAL DISEASE;
9696 else if icd9(i)
----
160
9696! in:('40301','40311','40391','40402','40403','40412','40413','40492','40493',
ERROR 160-185: No matching IF-THEN clause.
9697 '582','585','586','5880','V420','V451','V56') or
9697! ('5830'<=:icd9(i)<=:'5837') then renal_disease = 1;
9698
9699
9700 *** MILD LIVER DISEASE;
9701 else if icd9(i)
9701! in:('07022','07023','07032','07033','07044','07054','0706','0709','570','571','5733','5734'
9701! ,'5738','5739','V427') then mild_liver_disease = 1;
9702
9703
9704 *** MODERATE-SEVERE LIVER DISEASE;
9705 else if icd9(i) in:
9706 ('4560'<=:icd9(i)<=:'4562') or
-- -
79 388
200
76
ERROR 79-322: Expecting a ).
ERROR 388-185: Expecting an arithmetic operator.
ERROR 200-322: The symbol is not recognized and will be ignored.
ERROR 76-322: Syntax error, statement will be ignored.
9707 ('5722'<=:icd9(i)<=:'5728') then liver_disease = 1;
9708
9709
9710 *** PEPTIC ULCER DISEAS;
9711 else if ('531'<=:icd9(i)<=:'534') then ulcers = 1;
9712
9713
9714 *** RHEUMATOLOGIC DISEASE;
9715 else if icd9(i) in:('4465','7100','7101','7102','7103','7104','7148','725') or
9715! ('7140'<=:icd9(i)<=:'7142') then rheum_disease = 1;
9716
9717 *'4465','7102','7103','7148';
9718
9719 *** AIDS;
9720 else if icd9(i) in:('042'<=:icd9(i)<=:'044') then aids = 1;
-- -
79 388
200
ERROR 79-322: Expecting a ).
ERROR 388-185: Expecting an arithmetic operator.
ERROR 200-322: The symbol is not recognized and will be ignored.
9721
9722
9723 end; *** End diagnosis code loop;
Original code:
data first_record_test;
set merged_final;
array icd9 {*} case_1_d0 case_1_d1 case_1_d2 case_1_d3 case_1_d4 case_1_d5 case_1_d6 case_1_d7 case_1_d8 case_1_d9
case_1_p1 case_1_p2 case_1_p3 case_1_p4 case_1_p5 case_1_p6 case_1_p7 case_1_p8 case_1_p9 case_1_p10
case_1_p11 case_1_p12 case_1_p13 case_1_p14 case_1_p15 case_1_p16 case_1_p17 case_1_p18 case_1_p19 case_1_p20
case_1_p21 case_1_p22 case_1_p23 case_1_p24 case_1_p25 case_1_p26 case_1_p27 case_1_p28 case_1_p29 case_1_p30;
do i=1 to dim(icd9);
*** ACUTE MYOCARDIAL INFARCTION;
if icd9(i) in:('410') then acute_mi = 1;
*** HISTORY OF MYOCARDIAL INFARCTION;
else if icd9(i) in:('412') then history_mi = 1;
*** CONGESTIVE HEART FAILURE;
else if icd9(i) in:('39891','40201','40211','40291','40401','40403','40411','40413','40491','40493',
'4254','4255','4256','4257','4258','4259','428')then chf = 1;
*** PERIPHERAL VASCULAR DISEASE;
else if icd9(i) in:('0930','440','441','4471','5571','5579','V434') or
('4431'<=:icd9(i)<=:'4439') then pvd = 1;
*** CEREBROVASCULAR DISEASE;
else if icd9(i) in:('36234') or ('430'<=:icd9(i)<=:'438') then cvd = 1;
*** COPD;
else if icd9(i) in:('4168','4169','5064','5081','5088') or ('490'<=:icd9(i)<=:'505') then copd = 1;
*** DEMENTIA;
else if icd9(i) in:('290','2941','3312') then dementia = 1;
*** PARALYSIS;
else if icd9(i) in:('3341','342','343','3449') or ('3440'<=:icd9(i)<=:'3446') then paralysis = 1;
*** DIABETES;
else if icd9(i) in:('2508','2509') or ('2500'<=:icd9(i)<=:'2503') then diabetes = 1;
*** DIABETES WITH COMPLICATIONS;
else if icd9(i) in:('2504','2505','2506','2507') then diabetes_comp = 1;
*** MODERATE-SEVERE RENAL DISEASE;
else if icd9(i) in:('40301','40311','40391','40402','40403','40412','40413','40492','40493',
'582','585','586','5880','V420','V451','V56') or ('5830'<=:icd9(i)<=:'5837') then renal_disease = 1;
*** MILD LIVER DISEASE;
else if icd9(i) in:('07022','07023','07032','07033','07044','07054','0706','0709','570','571','5733','5734','5738','5739','V427') then mild_liver_disease = 1;
*** MODERATE-SEVERE LIVER DISEASE;
else if icd9(i) in:
('4560'<=:icd9(i)<=:'4562') or
('5722'<=:icd9(i)<=:'5728') then liver_disease = 1;
*** PEPTIC ULCER DISEAS;
else if ('531'<=:icd9(i)<=:'534') then ulcers = 1;
*** RHEUMATOLOGIC DISEASE;
else if icd9(i) in:('4465','7100','7101','7102','7103','7104','7148','725') or ('7140'<=:icd9(i)<=:'7142') then rheum_disease = 1;
*'4465','7102','7103','7148';
*** AIDS;
else if icd9(i) in:('042'<=:icd9(i)<=:'044') then aids = 1;
end; *** End diagnosis code loop;
*** Define arrays for comorbidity condition;
array comorb (*) acute_mi--aids;
*if last.&PATID then do;
do i=1 to dim(comorb);
if comorb(i)=. then comorb(i) = 0;
end;
*** Calculate the Charlson Comorbidity Score for prior conditions;
Charlson =
1*(acute_mi or history_mi) +
1*(chf) +
1*(pvd) +
1*(cvd) +
1*(copd) +
1*(dementia) +
2*(paralysis) +
1*(diabetes and not diabetes_comp) +
2*(diabetes_comp) +
2*(renal_disease) +
1*(mild_liver_disease and not liver_disease) +
3*(liver_disease) +
1*(ulcers) +
1*(rheum_disease) +
6*(aids);
*** Calculate the NCI Comorbidity Index for prior conditions;
NCIindex =
1.14*(acute_mi) +
1.08*(history_mi) +
1.91*(chf) +
1.30*(pvd) +
1.32*(cvd) +
1.69*(copd) +
2.06*(dementia) +
1.49*(paralysis) +
1.34*(diabetes or diabetes_comp) +
1.60*(renal_disease) +
2.09*(mild_liver_disease or liver_disease) +
1.08*(ulcers) +
1.25*(rheum_disease) +
1.79*(aids);
output;
keep PATIENT_ID_NUMBER_N20 linenumber
case_1_d0 case_1_d1 case_1_d2 case_1_d3 case_1_d4 case_1_d5 case_1_d6 case_1_d7 case_1_d8 case_1_d9
case_1_p1 case_1_p2 case_1_p3 case_1_p4 case_1_p5 case_1_p6 case_1_p7 case_1_p8 case_1_p9 case_1_p10
case_1_p11 case_1_p12 case_1_p13 case_1_p14 case_1_p15 case_1_p16 case_1_p17 case_1_p18 case_1_p19 case_1_p20
case_1_p21 case_1_p22 case_1_p23 case_1_p24 case_1_p25 case_1_p26 case_1_p27 case_1_p28 case_1_p29 case_1_p30
acute_mi--aids Charlson NCIindex;
label
Charlson = 'Charlson comorbidity score'
NCIindex = 'NCI comorbidity index'
acute_mi = 'Acute Myocardial Infarction'
history_mi = 'History of Myocardial Infarction'
chf = 'Congestive Heart Failure'
pvd = 'Peripheral Vascular Disease'
cvd = 'Cerebrovascular Disease'
copd = 'Chronic Obstructive Pulmonary Disease'
dementia = 'Dementia'
paralysis = 'Hemiplegia or Paraplegia'
diabetes = 'Diabetes'
diabetes_comp = 'Diabetes with Complications'
renal_disease = 'Moderate-Severe Renal Disease'
mild_liver_disease = 'Mild Liver Disease'
liver_disease = 'Moderate-Severe Liver Disease'
ulcers = 'Peptic Ulcer Disease'
rheum_disease = 'Rheumatologic Disease'
aids = 'AIDS'
;
run;
9692 else if icd9(i) in:('2504'<=:icd9(i)<=:'2507') then diabetes_comp = 1; -- - 79 388 200
The IN list must be a list of literals(constants); you cannot use comparison operators in there.
What part did you change?
Hello @oddsratio and welcome to the SAS Support Communities!
The "original code" already contains two syntax errors:
*** MODERATE-SEVERE LIVER DISEASE; else if icd9(i) in: ('4560'<=:icd9(i)<=:'4562') or ('5722'<=:icd9(i)<=:'5728') then liver_disease = 1;
*** AIDS; else if icd9(i) in:('042'<=:icd9(i)<=:'044') then aids = 1;
The parts highlighted in red must be deleted in order to obtain correct Boolean expressions.
It appears that you added more of this pattern, e.g., in section "DIABETES WITH COMPLICATIONS".
9692 else if icd9(i) in:('2504'<=:icd9(i)<=:'2507') then diabetes_comp = 1; -- - 79 388 200
The IN list must be a list of literals(constants); you cannot use comparison operators in there.
You want to be extremely cautious of using "range" values with character values.
Please run this code and examine the log:
data example; icd9 = '4'; if ('430'<=:icd9<=:'438') then put "Icd9 is in range"; else put "Not in range"; run;
"4" is in the range "430" to "438" because character values are compared first character to first character, then second and so on. So I suspect a fair number of your comparisons are incorrect depending on the possible range of your actual ICD values.
Your use of IN: also means that you very likely can get incorrect assignments:
data example; icd='4'; if icd in:('410') then put "found"; run;
also matches "4" as in the range for "410".
Personally instead of a bunch of If statements I would move the assignment of lists of values to a Format or Informat with all of the codes actually present, or possible, in the data as explicit lists.
One way:
proc format; value $icdexample '410' ='Acute MI' '412' ='History MI' '2508','2509' ='Diabetes' other = "Not listed" ; run; data example; input icd $; if put(icd,$icdexample.)="Acute MI" then acute_mi=1; if put(icd,$icdexample.)="History MI" then history_mi=1; if put(icd,$icdexample.)="Diabetes" then diabetes=1; datalines; 410 412 2508 2509 abc run;
I realize this does not have all of the ICD codes for any condition. But you can convert a document with the complete list, or extract the codes present in your data, to a data set and use that information to create formats.
Thank you so much for your detailed instruction!
Are you ready for the spotlight? We're accepting content ideas for SAS Innovate 2025 to be held May 6-9 in Orlando, FL. The call is open until September 25. Read more here about why you should contribute and what is in it for you!
Learn how use the CAT functions in SAS to join values from multiple variables into a single value.
Find more tutorials on the SAS Users YouTube channel.