ebmdatalab/openprescribing

Incorrect "presentations contributing to variation" showing on measure

Opened this issue · 6 comments

We had a query from a user re www.openprescribing.net/measure/lpneedles

Could someone explain the rationale as to why BD viva insulin pen needles are in this category.
They are under £5 per 100 at £3.59 for 90.
Apologies if I have misunderstood.

Having taken a look, and the user is correct - the measure should not be showing this,

This measure has a slightly more complicated definition than usual, as it joins to measures.vw__median_price_per_unit on both bnf_code and date.

On first thought I thought that the definition through OP was not working correctly, although the SQL did work correctly in BQ.

Having checked again though, the measure calculation appears to be correct (£575 for last quarter), but the "presentations contributing to variation" does not match, showing a cost of £946.29. If you remove the items from the list that don't cost >=£5 per 100, this comes to the same as the measure (£575).

Therefore it appears to be the way that OP generates the list of BNF codes for presentations contributing to variation, rather than the actual measure itself.

Relevant part of measure definition:

  "numerator_type": "custom",
  "numerator_columns": [
    "SUM(actual_cost) AS numerator"
  ],
  "numerator_from": "{hscic}.normalised_prescribing p LEFT JOIN {measures}.vw__median_price_per_unit r ON p.month=r.date AND p.bnf_code=r.bnf_code ",
  "numerator_where": [
     "p.bnf_code IN (SELECT bnf_code FROM dmd.vmp WHERE LOWER(nm) LIKE '%insulin needles%' AND bnf_code IS NOT NULL -- find vmp products with vmp name containing insulin needles \n",
    "UNION DISTINCT ",
    "SELECT amp.bnf_code FROM dmd.amp AS amp INNER JOIN dmd.vmp ON vmp.id = amp.vmp  WHERE LOWER(vmp.nm) LIKE '%insulin needles%' AND amp.bnf_code IS NOT NULL) -- find amp products with vmp name containing insulin needles \n",
    "AND r.median_price_per_unit >= 0.05 --this selects products with median price of >= 5 pence per needles same as >= 5 pound per 100 needles  "
  ],

Is there a way to force the presentation BNF codes to be correct?

I suppose we could fix by using a view in BQ rather than SQL in the measure definition, but i'm not keen on the resulting lack of transparency on how the measure is built

OK @inglesp some more information:

For the 3 months ending September 2023 the practice has prescribed 17 different items:

bnf_name bnf_code items
BD AutoShield Duo hypod insulin needles for pre-filled / reusable pen injectors screw on 5mm/30gauge 21010900606 1
GreenFine hypodermic insulin needles for pre-filled / reusable pen injectors screw on 4mm/32gauge 21010900928 1
GlucoRx CarePoint hypod insulin needles for pre-filled / reusable pen injectors screw on 4mm/31gauge 21010900703 1
Unifine Pentips hypod insulin needles for pre-filled / reusable pen injectors screw on 4mm/32gauge 21010900713 2
Microdot Dual Safety Pen hypod insulin needles for pf / reusable pen injectors screw on 4mm/31gauge 21010900956 2
NovoFine hypodermic insulin needles for pre-filled / reusable pen injectors screw on 8mm/30gauge 21010900706 3
GlucoRx FinePoint hypod insulin needles for pre-filled / reusable pen injectors screw on 4mm/31gauge 21010900802 3
Neon Verifine Safety hypod ins needles for pre-filled / reusable pen injectors screw on 8mm/30gauge 21010900899 3
BD Viva hypodermic insulin needles for pre-filled / reusable pen injectors screw on 5mm/31gauge 21010900608 5
BD Micro-Fine Ultra hypod insulin needles for pre-filled/reusable pen injectors screw on 4mm/32gauge 21010900603 9
NovoFine Autocover hypod insulin needles for pre-filled /reusable pen injectors screw on 8mm/30gauge 21010900708 15
Neon Verifine hypodermic insulin needles for pre-filled /reusable pen injectors screw on 5mm/31gauge 21010900884 18
Neon Verifine hypodermic insulin needles for pre-filled /reusable pen injectors screw on 8mm/31gauge 21010900886 18
Neon Verifine hypodermic insulin needles for pre-filled /reusable pen injectors screw on 6mm/31gauge 21010900885 28
Neon Verifine Ultra hypod insulin needles for pre-filled/reusable pen injectors screw on 4mm/32gauge 21010900889 61
BD Viva hypodermic insulin needles for pre-filled / reusable pen injectors screw on 4mm/32gauge 21010900607 67
Neon Verifine hypodermic insulin needles for pre-filled /reusable pen injectors screw on 4mm/31gauge 21010900883 90

You can take these BNF codes and see which of them were showing as >£5/100, and when, using this SQL:

SELECT max(date(date)) as latest_month_high, bnf_code, presentation FROM `ebmdatalab.measures.vw__median_price_per_unit` as rx
inner join hscic.bnf as bnf
on bnf.presentation_code = rx.bnf_code
where bnf_code IN ('21010900606',
'21010900928',
'21010900703',
'21010900713',
'21010900956',
'21010900706',
'21010900802',
'21010900899',
'21010900608',
'21010900603',
'21010900708',
'21010900884',
'21010900886',
'21010900885',
'21010900889',
'21010900607',
'21010900883')
and median_price_per_unit >.05
group by bnf_code, presentation
order by bnf_code

This gives the following items:

latest_month_high bnf_code presentation
01/11/2020 21010900603 BD Micro-Fine Ultra hypod insulin needles for pre-filled/reusable pen injectors screw on 4mm/32gauge
01/09/2023 21010900606 BD AutoShield Duo hypod insulin needles for pre-filled / reusable pen injectors screw on 5mm/30gauge
01/06/2017 21010900607 BD Viva hypodermic insulin needles for pre-filled / reusable pen injectors screw on 4mm/32gauge
01/06/2017 21010900608 BD Viva hypodermic insulin needles for pre-filled / reusable pen injectors screw on 5mm/31gauge
01/08/2017 21010900703 GlucoRx CarePoint hypod insulin needles for pre-filled / reusable pen injectors screw on 4mm/31gauge
01/09/2023 21010900706 NovoFine hypodermic insulin needles for pre-filled / reusable pen injectors screw on 8mm/30gauge
01/09/2023 21010900708 NovoFine Autocover hypod insulin needles for pre-filled /reusable pen injectors screw on 8mm/30gauge
01/09/2023 21010900713 Unifine Pentips hypod insulin needles for pre-filled / reusable pen injectors screw on 4mm/32gauge
01/03/2019 21010900802 GlucoRx FinePoint hypod insulin needles for pre-filled / reusable pen injectors screw on 4mm/31gauge
01/09/2023 21010900899 Neon Verifine Safety hypod ins needles for pre-filled / reusable pen injectors screw on 8mm/30gauge
01/09/2023 21010900956 Microdot Dual Safety Pen hypod insulin needles for pf / reusable pen injectors screw on 4mm/31gauge

Which is identical to the list generated on the "presentations contributing to variation", even though some of the needles haven't had a PPU of >0.05 since 2017.

We can see therefore that it appears that a) the variation list isn't all needles, but b) is all needles that show on the "high" list at any point, not just currently.

I think we can fix this by providing a numerator_bnf_codes_query. An example of us doing this is in lpherbal.json.

Can you give this a go?

@inglesp how do I factor the date into this?

@inglesp have deployed with following SQL for numerator_bnf_codes_query

  SELECT DISTINCT p.bnf_code
  FROM hscic.normalised_prescribing p
  LEFT JOIN measures.vw__median_price_per_unit r ON p.month=r.date AND p.bnf_code=r.bnf_code
  WHERE
  p.bnf_code IN 
    (SELECT bnf_code FROM dmd.vmp WHERE LOWER(nm) LIKE '%insulin needles%' AND bnf_code IS NOT NULL -- find vmp products with vmp name containing insulin needles \n",
    UNION DISTINCT
    SELECT amp.bnf_code FROM dmd.amp AS amp INNER JOIN dmd.vmp ON vmp.id = amp.vmp  WHERE LOWER(vmp.nm) LIKE '%insulin needles%' AND amp.bnf_code IS NOT NULL) -- find amp products with vmp name containing insulin needles \n",
    AND r.median_price_per_unit >= 0.05 --this selects products with median price of >= 5 pence per needles same as >= 5 pound per 100 needles 

Same problem exists. Unless we can link date somehow, not sure how to fix.

if we added in month there would that help?