While working at the Rutgers Robert Wood Johnson Medical School, I had access to data on over ten million visits to emergency departments in central New Jersey, including ICD-9 (International Classification of Disease – 9th edition) codes along with some patient demographic data.
I also had the ozone level from several central New Jersey monitoring stations for every hour of the day for ten years. I used PROC REG (and ARIMA) to assess the association between ozone levels and the number of admissions to emergency departments diagnosed as asthma. Some of the predictor variables, besides ozone level, were pollen levels and a dichotomous variable indicating if the date fell on a weekend. (On weekdays, patients were more likely to visit the personal physician than on a weekend.) The study showed a significant association between ozone levels and asthma attacks.
It would have been nice to have the incredible diagnostics that are now produced when you run PROC REG. Imagine if I had SAS Studio back then!
In the program, I used a really interesting trick. (Thank you Paul Grant for showing me this trick so many years ago at a Boston Area SAS User Group meeting.) Here's the problem: there are many possible codes such as 493, 493.9, 493.100, 493.02, and so on that all relate to asthma. The straightforward way to check an ICD-9 code would be to use the SUBSTR function to pick off the first three digits of the code. But why be straightforward when you can be tricky or clever? (Remember Art Carpenter's advice to write clever code that no one can understand so they can't fire you!)
The following program demonstrates the =: operator:
*An interesting trick to read ICD codes; data ICD_9; input ICD : $7. @@; if ICD =: "493" the output; datalines; 493 770.6 999 493.9 493.90 493.100 ; title "Listing of All Asthma Codes"; proc print data=ICD_9 noobs; run; |
Normally, when SAS compares two strings of different length, it pads the shorter string with blanks to match the length of the longer string before making the comparison. The =: operator truncates the longer string to the length of the shorter string before making the comparison.
The usual reason to write a SAS blog is to teach some aspect of SAS programming or to just point out something interesting about SAS. While that is usually my motivation, I have an ulterior motive in writing this blog – I want to plug a new book I have just published on Amazon. It's called 10-8 Awaiting Crew: Memories of a Volunteer EMT. One of the chapters discusses the difficulty of conducting statistical studies in pre-hospital settings. This was my first attempt at a non-technical book. I hope you take a look. (Enter "10-8 awaiting crew" or "Ron Cody" in Amazon search to find the book.) Drop me an email with your thoughts at ron.cody@gmail.com.
5 Comments
Hi Ron. I wasn't aware of the =: operator so thank you for this post. Also wanted to add a strong endorsement of your Data Cleaning book, which is chock full of just these kinds of useful tips and tricks. And the new book sounds great - I'll be sure to check it out on Amazon.
Oh, I forgot to add: Because you seem to be in health care in some way, try my 10-8 Awaiting Crew book. I think you would enjoy it.
I was just making up codes that started with 493.
ICD-9-CM? ICD-9 would be mortality data 🙁
Hi. If you do go to Amazon to look at the book, click on the paperback tab so you can see both front and back covers.