ICD-9 to ICD-10: what is that about, and how can data integration tools help

by Minollo on February 20, 2009

in XML

In a recent webinar about issues that the healthcare industry will soon need to face about upgrading compliancy from HIPAA version 4 (4010) to version 5 (5010), we also mentioned how similar issues affect the upgrade from ICD-9 to ICD-10.
The International Classification of Diseases and Related Health Problems (ICD) classifies diseases, symptoms, injuries and more. ICD codes are assigned to a category and identified by a code of six characters or less. ICD-9 was published in 1977, and it is currently widely used in the healthcare industry, for example when information between healthcare providers (e.g., your doctor) and healthcare plans (e.g, your health insurance company) is exchanged. As you can imagine, the classifications in ICD-9 are at this point fairly old and inadequate to track all the changes and improvements that have occured in the healthcare space; the answer to that is ICD-10, which is going to become the new required standard in a few years from now (latest I’ve heard, the deadline is set to October 2013).
OK, so, what’s the problem? The problem is that in the next few years healthcare providers, plans and clearinghouses need to upgrade their systems to become compliant with ICD-10; and that’s not a simple task; we are talking about changing systems that have been processing healthcare claim submissions for years, hundreds, thousands of them for each of us every year… An hiccup in that system would have enormous consequences.
To complicate life (or to make it more interesting) there is no such thing as a 1-to-1 mapping between ICD-9 and ICD-10; ICD-10 is not just a superset of ICD-9; it’s a totally different code set. There are cases in which an ICD-9 code has a precise match in ICD-10, but in most cases that’s not true; in some cases there are only approximate matches available; in some others multiple possible matches exist; in some others only combinations of multiple ICD-10 codes can replace the information conveyed in a single ICD-9 code.
Speaking of HIPAA, multiple versions, conversions and mappings, the question is inevitable: is there anything that the data integration technology in our DataDirect Data Integration Suite can do to help? The same way we help transforming HIPAA 4010 to HIPAA 5010, can we do anything about ICD-9 to ICD-10?
To answer that question I started looking for more details; and I did find a lot of interesting information; for example, on HHS.gov you can find and download text files containing the full description of the ICD-9 and ICD-10 diagnostic codes, and the “set of general equivalence mappings”. The mappings file is a bit cryptic to read, but it does contain all the details about exact/approximate/multiple-choice matches between ICD-9 and ICD-10 diagnostic codes. That gave us the idea to create a small application that given an ICD-9 diagnostic code returns information about its ICD-10 possible equivalent(s). And what could be better than storing those ICD code sets and mapping information in a database and then write a simple XQuery that processes ICD-9 codes and returns an HTML report on the ICD-10 equivalences? (OK, it’s a rhetorical question, no need to answer it…)
That’s what we did, and using the XQuery Web service framework we automatically deployed the XQuery on our example server for you to try. The Web user interface you will see is just the default UI the XQuery Web service framework exposes automatically for testing purposes; it’s not necessarily pretty, but it’s excellent to run a few tests. For example, enter this set of ICD-9 diagnostic codes to see the different kind of ICD-10 equivalences you can obtain: 5992, 59983, 34621, 9171, 8962, 80600, V6441
This is part of the result you will obtain:

You can experiment with it yourself; you will need to specify valid ICD-9 diagnostic codes to get meaningful results, of course.
Do you want to know more about the technical details of what’s going on there? A simple XQuery is responsible for processing your list of ICD-9 codes and for creating the HTML displayed in your browser; XQuery is relying on the exact same information I referenced above and stored in three tables in a relational database. I don’t want to hide the XQuery from you of course; here it is:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
declare option ddtek:serialize "method=html";
declare variable $ICD9-codes as xs:string external;

declare function local:cell($code, $desc)
{

<strong>{ data($code) }</strong>{ concat(' (', $desc, ')') }

};
<table border="0">
<tbody>
<tr bgcolor="#cccccc">
<th width="30%">ICD-9</th>
<th width="5%">Status</th>
<th width="65%">ICD-10</th>
</tr>
{
let $ICD9-sequence := fn:tokenize($ICD9-codes, "\s*,\s*|\s*;\s*|\s*-\s*|\s+")
for $case in $ICD9-sequence
let $conv := collection("ICD.dbo.ICD9-ICD10")/ICD9-ICD10[ICD-9 = $case],
$from := collection("ICD.dbo.ICD-9")/ICD-9[CODE = $case]
return
if(not($from)) then
<tr valign="top" bgcolor="#ff0000">
<td><strong>{$case}</strong></td>
<td>Ivalid ICD9 code</td>
<td>--</td>
</tr>
else if($conv/APPROX = false()) then
<tr valign="top" bgcolor="#ccffcc">{ local:cell($case, $from/DESCRIPTION) }
<td>Exact match</td>
{ local:cell($conv/ICD-10, collection("ICD.dbo.ICD-10")/ICD-10[CODE = $conv/ICD-10]/DESCRIPTION) }</tr>
else
if($conv/NOMAP = true()) then
<tr valign="top" bgcolor="#ffcccc">{ local:cell($case, $from/DESCRIPTION) }
<td>No match</td>
<td></td>
</tr>
else
if(($conv/APPROX = true()) and ($conv/COMBO = false()) and count($conv) &gt; 1) then
<tr valign="top" bgcolor="#ffffcc">{ local:cell($case, $from/DESCRIPTION) }
<td>Multiple approximate match</td>
<td>{
for $choice1 at $index1 in $conv
return
((if($index1 = 1) then <em>ONE OF:</em>
else <em>, OR</em>),
, <strong>{ data($choice1/ICD-10) }</strong>, concat(' ', collection("ICD.dbo.ICD-10")/ICD-10[CODE = $choice1/ICD-10]/DESCRIPTION))
}</td>
</tr>
else
if(($conv/APPROX = true()) and ($conv/COMBO = false())) then
<tr valign="top" bgcolor="#ffffcc">{ local:cell($case, $from/DESCRIPTION) }
<td>Single approximate match</td>
{ local:cell($conv/ICD-10, collection("ICD.dbo.ICD-10")/ICD-10[CODE = $conv/ICD-10]/DESCRIPTION) }</tr>
else
if(count(distinct-values($conv/SCENARIO-ID)) = 1) then
<tr valign="top" bgcolor="#ffeecc">{ local:cell($case, $from/DESCRIPTION) }
<td>Choice</td>
<td>{
for $choice at $index in $conv
return
((if($index = 1) then (<em>ONE OF:</em>)
else
if($choice/CHOICE-ID != $conv[$index - 1]/CHOICE-ID) then (
, <em>AND ONE OF:</em>)
else (<em>, OR</em>)), (
, <strong>{ data($choice/ICD-10) }</strong>, concat(' ', collection("ICD.dbo.ICD-10")/ICD-10[CODE = $choice/ICD-10]/DESCRIPTION)))
}</td>
</tr>
else
<tr valign="top" bgcolor="#ffddcc">{ local:cell($case, $from/DESCRIPTION) }
<td>Combinatorial match</td>
<td>{
for $scene at $pos in distinct-values($conv/SCENARIO-ID)
return
((if($pos &gt; 1) then
<hr />else ()), <em>Scenario { $scene } - ONE OF:</em>,
for $choice2 at $index2 in $conv
where $choice2/SCENARIO-ID = $scene
return
((if($index2 = 1 or $choice2/SCENARIO-ID != $conv[$index2 - 1]/SCENARIO-ID) then ()
else
if($choice2/CHOICE-ID != $conv[$index2 - 1]/CHOICE-ID) then (
, <em>AND ONE OF:</em>)
else (<em>, OR</em>)), (
, <strong>{ data($choice2/ICD-10) }</strong>, concat(' ', collection("ICD.dbo.ICD-10")/ICD-10[CODE = $choice2/ICD-10]/DESCRIPTION))))
}</td>
</tr>
}</tbody>
</table>

Summarizing: standards evolve and change; and your applications need to do the same. DataDirect Data Integration Suite can help you in a number of different ways to handle those changes: it helps you relying on support for the latest standards and their latest versions; it helps you leveraging integration with information stored in relational databases; it helps you accessing its services either embedding the behavior in your application, or exposing it through standard Web service interfaces.

Bookmark and Share

{ 1 trackback }

Impact of HIPAA 5010 and ICD-10 Data Conversions | EMR and EHR
October 23, 2009 at 11:25 am

{ 6 comments… read them below or add one }

1 IQ-s July 14, 2009 at 8:22 am

Hey, ok, I get it, I guess – but does this really work?

2 Minollo July 14, 2009 at 9:39 am

The blog entry links code and examples that are working and a good starting point for any additional development in this area.
Or are you looking for something different/more/specific?
Minollo

3 Bingos July 16, 2009 at 4:37 pm

Sometimes it’s really that simple, isn’t it? I feel a little stupid for not thinking of this myself/earlier, though.

4 Best August 20, 2009 at 6:12 pm

Great idea, but will this work over the long run?

5 Minollo August 24, 2009 at 8:01 am

Both ICD-9 and ICD-10 are stable standards at this point; so, any solution that helps moving from one to the other seems to have a good chance to work in the long run. Or do you have specific doubts? Any chance you can elaborate more?

6 vik April 27, 2010 at 5:23 am

What does this migration mean on a large scale. What will happen to the existing claims?. Would they be remapped for ICD 10? If not and if there is a case that an older claim will be revisited, would they map it with ICD 10?

Also what does this migration mean for a company that provides software support, besdies data integration what are the other ares this migration would need support in?

Leave a Comment

Previous post:

Next post: