Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Opioid breakdowns (OME) / MR vs IR/ strengths #57

Open
speed-vm opened this issue Dec 18, 2023 · 10 comments
Open

Opioid breakdowns (OME) / MR vs IR/ strengths #57

speed-vm opened this issue Dec 18, 2023 · 10 comments

Comments

@speed-vm
Copy link

speed-vm commented Dec 18, 2023

Options for breaking down opioid prescribing

1. Using different Oral Morphine Equivalence (OME) values. 120mg might be ok for a young fit person but this is a lot for an elderly person.

CDC Clinical Practice Guideline for Prescribing Opioids for Pain — United States, 2022

CDC cites this extensive systematic review. When reviewing studies they breakdown by <50, 50-90, and >90.

Faculty of pain medicine cites 120mg as no good evidence for efficacy of high dose opioids in long-term pain.

<20 20-50 50-100 and >100 - older reference but cited on mdcalc
https://europepmc.org/article/PMC/3000551

There seem to be a few different ways to breakdown, @chrisjwood16 is going to share the code, and should be a case of just changing the '120' to whatever we want it to be.

2. Can we breakdown opioids into immediate release preparations?
We discussed whether it would be possible to look at use of immediate release (IR) preparations such as Oramorph which are typically prescribed 'As required'. Limitations of this are that we would only be able to know the number of time the IR preparation was issued rather than the volume/quantity. Perhaps of interest would be those with MR prep and no IR, only IR, or high issue rates of IR. Do you think this is still of interest @alschaffer if so @chrisjwood16 or me can prepare. We would be looking at IR high strength opioids ie PO morphine (oramorph/actimorph/sevredol), oxycodone (oxyact/oxynorm) and tapentadol.

3. Can we breakdown into high strength/low strength?
Yes this is possible. Separating out co-codamol, codeine, tramadol etc from higher strength preparations

@chrisjwood16 any additional comments?
@alschaffer please will you let us know which codelists you need working on and if you need any further details?

@speed-vm speed-vm changed the title Opioid breakdowns (OME) Opioid breakdowns (OME) / MR vs IR/ strengths Dec 18, 2023
@alschaffer
Copy link
Contributor

alschaffer commented Dec 18, 2023

@speed-vm Here are the opioids codelists that I have so far. Some of these were pre-existing, some I've created (as they seemed straightforward). Let me know if you see any issues.

@speed-vm
Copy link
Author

@chrisjwood16 is going to look at these tomorrow @alschaffer for you

@chrisjwood16
Copy link

chrisjwood16 commented Dec 19, 2023

Opioids for analgesia - ✔️ looks good.
Codeine for analgesia - ✔️ looks good.
Tramadol - ✔️ looks good.
Weak opioids - ❔ some controversy here about where tramadol sits - this paper gives a nice summary (https://www.bjanaesthesia.org.uk/article/S0007-0912(22)00126-X/fulltext)
In terms of referencing might be easier to call it a strong opioid as in line with the BNF
Would also include dextropropoxyphene (including co-proxamol) here. And meptazinol - probably easiest just to add as extra codelist like above.

Strong opioids - seems reasonable with weak opioids adjusted as above
Long acting opioids - method seems reasonable - will need to add tapentadol MR capsules to ensure it is up to date (see below)
Short-acting/immediate release opioids ✔️ seems reasonable

In terms of subtracting one codelist from another - not sure I've seen this done before in a project. Is there a way you can output the resultant codelist for a quick scan to make sure it works as expected? I'm sure you are already on top of this - but be aware that a lot of the existing opioid codelists (e.g. long acting ones) were created programmatically so have a slightly different format (potential for error when manipulating).

I've had a quick go at this in a notebook. Slight issue in that there is a new tapentadol MR capsule that isn't in the long acting codelists. I doubt much if any prescribing so little bearing on numbers (although OpenPrescribing down for the moment) - but would make an incorrect codelist for the immediate release opioids.

@alschaffer
Copy link
Contributor

Thanks @chrisjwood16, useful feedback. Re: subtracting codelists, I used the method described here.

How new is tapentadol MR? If it's really new, then it probably won't matter.

@chrisjwood16
Copy link

Ah not as recent as I'd though - first prescriptions June 2022

@chrisjwood16
Copy link

In terms of creating different codelists for different OME of long acting opioids I've adapted the SQL used in OpenPrescribing to be run in BigQuery to extract products/BNF codes based on product strength (it's formatted much more nicely in BigQuery) the value for each opioid needs to be updated depending on what OME breakdowns are decided:

SELECT DISTINCT presentation_code as code, presentation as term FROM hscic.bnf p INNER JOIN dmd.vmp vmp ON CONCAT(SUBSTR(p.presentation_code,0,9),'AA', SUBSTR(p.presentation_code,-2), SUBSTR(p.presentation_code,-2)) = vmp.bnf_code INNER JOIN dmd.vpi AS vpi ON vmp.id = vpi.vmp INNER JOIN dmd.ont AS ont ON vmp.id = ont.vmp INNER JOIN dmd.ontformroute AS route ON ont.form = route.cd WHERE ((vpi.ing = (60886004) AND route.descr LIKE '%modified-release.oral' AND p.presentation NOT LIKE '%MXL%' AND strnt_nmrtr_val/(COALESCE(strnt_dnmtr_val,1)) >=25 AND strnt_nmrtr_val/(COALESCE(strnt_dnmtr_val,1)) <60) /* Morphine Sulfate MR oral preps [excluding MXL as 24hr] (ing code) */ OR (vpi.ing = (60886004) AND route.descr LIKE '%modified-release.oral' AND p.presentation LIKE '%MXL%' AND strnt_nmrtr_val/(COALESCE(strnt_dnmtr_val,1)) >=50 AND strnt_nmrtr_val/(COALESCE(strnt_dnmtr_val,1)) <120) /* MXL (24hr release) (ing code) */ OR (vpi.ing = 387024006 AND route.descr LIKE '%modified-release.oral' AND p.presentation NOT LIKE '%Onexila%' AND strnt_nmrtr_val/(COALESCE(strnt_dnmtr_val,1)) >=17 AND strnt_nmrtr_val/(COALESCE(strnt_dnmtr_val,1)) <40) /* Oxycodone MR oral preps [excluding Onexila as 24hr] (ing code) */ OR (vpi.ing = 387024006 AND route.descr LIKE '%modified-release.oral' AND p.presentation LIKE '%Onexila%' AND strnt_nmrtr_val/(COALESCE(strnt_dnmtr_val,1)) >=33 AND strnt_nmrtr_val/(COALESCE(strnt_dnmtr_val,1)) <80) /* Onexila MR (24hr release) (ing code) */ OR (vpi.ing IN (442699004,40755011000001109) AND route.descr LIKE '%modified-release.oral' AND strnt_nmrtr_val/(COALESCE(strnt_dnmtr_val,1)) >=63 AND strnt_nmrtr_val/(COALESCE(strnt_dnmtr_val,1)) <150) /* Tapentadol HCl/Phosphate MR oral preps (ing code) */ OR (vpi.ing IN (386858008, 108505002) AND route.descr LIKE '%modified-release.oral' AND (p.presentation NOT LIKE '%Tradorec XL%' AND p.presentation NOT LIKE '%Zamadol 24hr%' AND p.presentation NOT LIKE '%Zydol XL%' AND p.presentation NOT LIKE '%Dromadol XL%') AND strnt_nmrtr_val/(COALESCE(strnt_dnmtr_val,1)) >=250 AND strnt_nmrtr_val/(COALESCE(strnt_dnmtr_val,1)) <600) /* Tramadol HCl/ Tramadol MR 12 hour oral preps (ing code) */ OR (vpi.ing IN (386858008, 108505002) AND route.descr LIKE '%modified-release.oral' AND (p.presentation LIKE '%Tradorec XL%' OR p.presentation LIKE '%Zamadol 24hr%' OR p.presentation LIKE '%Zydol XL%' OR p.presentation LIKE '%Dromadol XL%') AND strnt_nmrtr_val/(COALESCE(strnt_dnmtr_val,1)) >=500 AND strnt_nmrtr_val/(COALESCE(strnt_dnmtr_val,1)) <1200) /* Tramadol HCl/ Tramadol MR 24 hour oral preps (ing code) */ OR (vpi.ing IN (44508008, 387485001) AND route.descr LIKE '%modified-release.oral' AND strnt_nmrtr_val/(COALESCE(strnt_dnmtr_val,1)) >=5 AND strnt_nmrtr_val/(COALESCE(strnt_dnmtr_val,1)) <12) /* Hydromorphone (ing code) */ OR (vpi.ing IN (322538006, 387322000) AND route.descr LIKE '%modified-release.oral' AND strnt_nmrtr_val/(COALESCE(strnt_dnmtr_val,1)) >=250 AND strnt_nmrtr_val/(COALESCE(strnt_dnmtr_val,1)) <600) /* Dihydrocodeine (ing code) */ OR (vpi.ing = (387173000) AND route.descr LIKE 'patch.transdermal' AND strnt_nmrtr_val/(COALESCE(strnt_dnmtr_val,1)) >20 AND strnt_nmrtr_val/(COALESCE(strnt_dnmtr_val,1)) <52) /* Buprenorphine patches (ing code) */ OR (vpi.ing = 373492002 AND route.descr = 'patch.transdermal' AND strnt_nmrtr_val/(COALESCE(strnt_dnmtr_val,1)) >=25 AND strnt_nmrtr_val/(COALESCE(strnt_dnmtr_val,1)) <=25)) /* Fentanyl patches (ing code) */ GROUP BY code, term

@chrisjwood16
Copy link

chrisjwood16 commented Dec 19, 2023

I've used the code to create 3 new codelists:
Long acting opioids less than 50mg per day OME
Long acting opioids 50mg to 119mg per day OME
Long acting opioids greater than or equal to 120mg per day OME - similar to the high dose long acting opioids - this includes tapentadol MR capsules.

These will all need a double check but for now hopefully useful for scoping.

@speed-vm
Copy link
Author

Hi @alschaffer
This seems like the best place to say I've reviewed long acting opioids (having not seen what Chris had written above, hopefully all of use :) )
Please remove:
Ationdo (0407020AGBC)
Tapentadol phosphate (0407020AHAA)
Tapimio (0407020AHBB)

Otherwise that one looks good to me, I've gone through and checked manually.

@alschaffer
Copy link
Contributor

Thanks @speed-vm! Just checking, do you mean just remove the high-level parent category (e.g., just Ationdo - 0407020AGBC), or also everything under that category (e.g., Ationdo SR 100 mg - 0407020AGBCACAD, etc.)?

@speed-vm
Copy link
Author

No problem - Just the high level Ationdo 0407020AGBC. Please keep the lower level

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants