Sunday, June 28, 2009

Oxycodone and OxyContin

My first experience with medication for cancer pain was around January 2007. A tumor in my pelvic bone made it very painful to walk or lay flat. Then when I went through radiation therapy I got radiation proctitis – burns to my rectum and anus that made bowel movements extremely painful.

We treated those bouts of pain with oxycodone. A typical dose for me was one 5 mg tablet when the pain acted up, repeated every four to six hours if needed. More intense pain from the proctitis needed 10 mg at a time, but that tended to quiet down until the next bowel movement so it was not repeated as frequently. A really bad day might mean a total dosage of 30 mg of oxycodone. A moderate day would mean 5 to 10 mg, and good days none at all.

Then last month we found a tumor growing into my tailbone. So I started back to taking 5 to 10 mg of oxycodone a day. A week later I was taking 20 mg a day and not getting relief. So my radiation oncologist started me on OxyContin, the controlled release formulation of oxycodone. He explained that keeping a constant concentration of oxycodone in my system would prevent the pain from breaking through, and an ounce of prevention is worth a pound of cure.

I started on 10 mg OxyContin twice a day but found that I still needed the oxycodone to knock the pain down. Then we went to 20 mg OxyContin twice a day – still not enough. I tried taking it more often, three or four times a day plus oxycodone as needed, but I was still having debilitating pain. I started keeping notecards of my pill consumption and found I was getting around 120 mg a day of oxycodone in my system. A few hours a day a would feel okay, but at other times I would be moaning or pacing in pain.

I decided I needed to get a handle on how much oxycodone I was getting between the controlled release and immediate release forms. So I started by finding the pharmacokinetic data on oxycodone and OxyContin:

Oxycodone gets into the bloodstream quickly – about one hour to reach peak concentration – and then decays away exponentially. OxyContin takes a couple hours to provide its maximum concentration of oxycodone and that level stays elevated longer as the pill keeps delivering medication while it travels through the intestines.

It happens that 10 mg OxyContin gives about the same peak level as 5 mg oxycodone. Half of that peak is maintained up to six hours with oxycodone or twelve hours with OxyContin. Depending on what concentration your body needs to control the pain, that gives and idea of how long one dose will be effective.

You'll notice that for neither formulation is the concentration stable for any period of time. This was a little surprising to me after reading how OxyContin is supposed to provide twelve hours of continuous relief. That's only true if the concentration out at twelve hours is enough to control your pain, and that means that for most of those hours the oxycodone concentration will be higher than you need. Just how drastically the concentration varies is somewhat masked by the use of a logarithmic scale in the drug literature rather than the linear scale in this reproduction.

I wrote a computer program so that I could combine the effect from multiple doses of oxycodone and OxyContin, either on a regular daily cycle or from my own irregular dosage records. Comparing 5 mg oxycodone taken every six hours to 10 mg OxyContin taken every twelve hours illustrates the theory behind its standard dosage schedule.

As with single doses, the two formulations reach the same peak concentration. With oxycodone it falls off quickly and a second dose is needed to get it back up. By coincidence or skillful formulation, the concentration from either dosage (5 mg oxycodone every six hours or 10 mg OxyContin every twelve hours) is nearly identical at the twelfth hour. Thus OxyContin provides the same peak, minimum, and duration as the equivalent dosage of oxycodone.

When I tried taking OxyContin alone I noticed that, after waiting a couple hours for it to kick in, I would get about six hours of relief. But I was certainly not getting a full twelve hours. Since I had multiple prescription strengths on hand, I decided to compare taking a lower dose more frequently to a higher dose less often.

I felt better with the high frequency dosing because it kept tighter control on the oxycodone concentration. If my threshold for pain were 30 ng/mL, then twelve-hour dosing would leave me below that level for a few hours each cycle whereas six-hour dosing kept me always above. Furthermore, the twelve-hour dosing would also make me higher than necessary for a few hours each dose. For any strength of OxyContin, twelve-hour dosing produces a variation in oxycodone concentration by about a factor of two.

In retrospect it's not too surprising that I don't get get twelve hours of relief from a single dose of OxyContin. I don't get six hours of relief from oxycodone either; usually I feel it fading after four. So any formulation equivalent to six-hour dosing of oxycodone won't cut it. I could use a higher dose to keep the late hours covered, but I seem to be sensitive to the consequent overdose in the early hours.

Finally, I compared my actual dosage records to the baseline OxyContin dosage I was using for a period of four days. I had recently increased to 20 mg OxyContin every six hours and took extra 10 mg OxyContins and 5 mg oxycodones as needed for pain.

Sometimes during this period I felt okay but many times I was in moderate to severe pain. The erratic oxycodone concentration gives a clue why that was. My baseline dosage was not nearly high enough to control my pain. Relying on a lot of immediate release oxycodone produced big spikes and dips in the concentration. And adding irregular 10 mg OxyContin boosters generated delayed responses and lingering effects that were hard to track without a computer.

After seeing this analysis I asked my radiation oncologist for 40 mg OxyContin every six hours. That seemed to be a good baseline that to keep me near the level of pain control and allow for smaller, more predictable doses to manage breakthrough pain.

My pain management since that dosage adjustment has in fact been much better. Some of that relief may be from the radiation doing its job on the cancer, though it's still early in the therapy to expect that. In any case I think that analyzing my pain medication in this way helped to get it under control.

For any computer nerds reading this, the program I wrote is in Python and appears below in microprint. You can copy it to a text editor to read, save, and run. There are two versions. One takes periodic doses on the command line to output twenty-four hours of concentration versus time. The other takes a file with space-delimited time-dose pairs listed one per line. It outputs the concentration from the time of the earliest dose until the last effects of the latest dose.

Oxycontin.py:
#!/usr/bin/env python

# Oxycontin.py 21 June 2009
#
# Python program to simulate plasma concentration of oxycodone from periodic
# doses of OxyContin and oxycodone
#
# Usage:
# chmod +x Oxycontin.py [run once to make file executable]
# ./Oxycontin.py time1 dose1 [time2 dose2] [...]
# time measured in hr
# dose measured in mg (5 for oxycodone, any other for OxyContin)
# outputs concentration (ng/mL) versus time
#
# Examples:
# ./Oxycontin.py 0 10 12 10 [10 mg of OxyContin every 12 hours]
# ./Oxycontin.py 0 5 6 5 12 5 18 5 [5 mg of oxycodone every 6 hours]
# ./Oxycontin.py 0 20 0 5 12 20 12 5 [20 mg OxyContins with 5 mg oxycodones]
#
# Richard J. Wagner, Ph.D. wagnerr@umich.edu http://soayacs.blogspot.com/

# ---------------------------------------------------------------------------- #

import sys

# ---------------------------------------------------------------------------- #

# Concentration profile for 20 mg of OxyContin at 30-minute intervals
# Source: Purdue Pharma L.P., Stamford CT (2007) with linear interpolation and
# exponential extrapolation (12.7 hr half-life during 36-hour transit and 3.7 hr
# half-life after excretion)
oxycontin = [ 0.00, 3.80, 12.00, 14.30, 15.00, 15.90, 15.90, 15.40, 14.80,
14.48,14.15, 13.83, 13.50, 12.80, 12.10, 11.40, 10.70, 10.33, 9.95, 9.58, 9.20,
8.85, 8.50, 8.15, 7.80, 7.51, 7.22, 6.94, 6.67, 6.42, 6.17, 5.93, 5.70, 5.48,
5.27, 5.06, 4.87, 4.68, 4.50, 4.32, 4.15, 3.99, 3.84, 3.69, 3.55, 3.41, 3.28,
3.15, 3.03, 2.91, 2.80, 2.69, 2.59, 2.49, 2.39, 2.30, 2.21, 2.12, 2.04, 1.96,
1.89, 1.81, 1.74, 1.68, 1.61, 1.55, 1.49, 1.43, 1.37, 1.32, 1.27, 1.22, 1.17,
0.99, 0.86, 0.75, 0.66, 0.57, 0.50, 0.44, 0.38, 0.33, 0.29, 0.26, 0.22, 0.20,
0.17, 0.15, 0.13, 0.11, 0.10, 0.09, 0.08, 0.07, 0.06, 0.05, 0.04 ]

# Concentration profile for 5 mg of oxycodone at 30-minute intervals
# Source: Roxicodone (oxycodone hydrochloride), Xanodyne Pharmaceuticals, Inc.,
# Newport KY (2009) with linear interpolation
oxycodone = [ 0.00, 4.22, 7.73, 7.30, 6.43, 5.92, 5.40, 5.00, 4.60, 4.43, 4.27,
4.10, 3.93, 3.69, 3.45, 3.21, 2.97, 2.78, 2.59, 2.39, 2.20, 1.96, 1.72, 1.47,
1.23, 1.16, 1.10, 1.03, 0.97, 0.90, 0.83, 0.77, 0.70, 0.64, 0.58, 0.52, 0.47,
0.41, 0.35, 0.29, 0.23, 0.21, 0.18, 0.16, 0.13, 0.11, 0.08, 0.06, 0.03 ]

# ---------------------------------------------------------------------------- #

profile = [ 0.0 ] * 48 # a day of 30-minute intervals

doses = sys.argv[1:]
doses.reverse()
while doses:
time = int( 2.0 * float(doses.pop()) )
dose = int(doses.pop())
if dose == 5:
for t in range( len(oxycodone) ):
profile[ (time+t) % 48 ] += oxycodone[t]
else:
for t in range( len(oxycontin) ):
profile[ (time+t) % 48 ] += ( dose / 20.0 ) * oxycontin[t]

for t in range( len(profile) ):
print t * 0.5, profile[t]
print len(profile) * 0.5, profile[0]

sys.exit()

# ---------------------------------------------------------------------------- #


OxycontinHistory.py:
#!/usr/bin/env python

# OxycontinHistory.py 21 June 2009
#
# Python program to simulate plasma concentration of oxycodone from nonperiodic
# doses of OxyContin and oxycodone
#
# Usage:
# chmod +x OxycontinHistory.py [run once to make file executable]
# ./Oxycontin.py OxyDoses.inp
# takes input file of dose (mg) vs time (hr)
# outputs concentration (ng/mL) versus time
#
# Richard J. Wagner, Ph.D. wagnerr@umich.edu http://soayacs.blogspot.com/

# ---------------------------------------------------------------------------- #

import string
import sys

# ---------------------------------------------------------------------------- #

# Concentration profile for 20 mg of OxyContin at 30-minute intervals
# Source: Purdue Pharma L.P., Stamford CT (2007) with linear interpolation and
# exponential extrapolation (12.7 hr half-life during 36-hour transit and 3.7 hr
# half-life after excretion)
oxycontin = [ 0.00, 3.80, 12.00, 14.30, 15.00, 15.90, 15.90, 15.40, 14.80,
14.48,14.15, 13.83, 13.50, 12.80, 12.10, 11.40, 10.70, 10.33, 9.95, 9.58, 9.20,
8.85, 8.50, 8.15, 7.80, 7.51, 7.22, 6.94, 6.67, 6.42, 6.17, 5.93, 5.70, 5.48,
5.27, 5.06, 4.87, 4.68, 4.50, 4.32, 4.15, 3.99, 3.84, 3.69, 3.55, 3.41, 3.28,
3.15, 3.03, 2.91, 2.80, 2.69, 2.59, 2.49, 2.39, 2.30, 2.21, 2.12, 2.04, 1.96,
1.89, 1.81, 1.74, 1.68, 1.61, 1.55, 1.49, 1.43, 1.37, 1.32, 1.27, 1.22, 1.17,
0.99, 0.86, 0.75, 0.66, 0.57, 0.50, 0.44, 0.38, 0.33, 0.29, 0.26, 0.22, 0.20,
0.17, 0.15, 0.13, 0.11, 0.10, 0.09, 0.08, 0.07, 0.06, 0.05, 0.04 ]

# Concentration profile for 5 mg of oxycodone at 30-minute intervals
# Source: Roxicodone (oxycodone hydrochloride), Xanodyne Pharmaceuticals, Inc.,
# Newport KY (2009) with linear interpolation
oxycodone = [ 0.00, 4.22, 7.73, 7.30, 6.43, 5.92, 5.40, 5.00, 4.60, 4.43, 4.27,
4.10, 3.93, 3.69, 3.45, 3.21, 2.97, 2.78, 2.59, 2.39, 2.20, 1.96, 1.72, 1.47,
1.23, 1.16, 1.10, 1.03, 0.97, 0.90, 0.83, 0.77, 0.70, 0.64, 0.58, 0.52, 0.47,
0.41, 0.35, 0.29, 0.23, 0.21, 0.18, 0.16, 0.13, 0.11, 0.08, 0.06, 0.03 ]

# ---------------------------------------------------------------------------- #

# Read tab-delimited time(hr)-dose(mg) pairs from the given data file name
doses = []
for line in open(sys.argv[1]).readlines():
terms = string.split(line)
doses.append( ( int( 2.0 * float(terms[0]) ), int(terms[1]) ) )
start = doses[0][0]
stop = doses[-1][0]
slack = max( len(oxycontin), len(oxycodone) )
duration = stop - start + slack

profile = [ 0.0 ] * duration

for dose in doses:
if dose[1] == 5:
for t in range( len(oxycodone) ):
profile[ dose[0] - start + t ] += oxycodone[t]
else:
for t in range( len(oxycontin) ):
profile[ dose[0] - start + t ] += ( dose[1] / 20.0 ) * oxycontin[t]

for t in range( len(profile) ):
print 0.5 * ( start + t ), profile[t]

sys.exit()

# ---------------------------------------------------------------------------- #


Wednesday, June 10, 2009

Those fiendish cells

The protein called carcinoembryonic antigen (CEA) speaks volumes about my battles with cancer. I wrote about it twice before:

Today I have an update tracking the concentration of that protein in my body over the past five years.

When chemotherapy stopped holding down the cancer in late 2008, I traveled to Baltimore for a heroic surgery to remove the two big tumors and apply heated chemotherapy drugs to kill any stray cells. My surgeon was pleased that he was able to remove the tumors without too much destruction, but there was one area at the back of my pelvis where he worried that some cancer cells might still be hiding.

So our plan was to let me recover from surgery and then follow up with chemotherapy or radiation to clear out that trouble area. The big drop in CEA in January 2009 shows that the surgery was effective in reducing the tumor load and a CT scan in February looked good (for a person who has been reassembled a couple times already).

In the following months my CEA climbed back up to the limits of normal (5 nanograms per milliliter), solidly abnormal (over 10 ng/mL), and now stratospheric (633 ng/mL). Scans in May showed a tumor at the back of my pelvis eroding my tailbone and another sitting on the pubic bone in front of my bladder.

I've spent the last few weeks scurrying to figure out the current situation and choose the best plan of attack. The leading contender right now is radiation, first to the tailbone and then to the pubic bone. I'm hoping that those areas are the only ones with cancer and that the radiation will be at least as effective as it was on my pelvic mass in 2007.

There are other options to consider too: Taking the chemotherapy drug Xeloda during radiation to increase its effectiveness. Trying another chemotherapy drug like Vectibix (which is related to the drug Erbitux which brought me much suffering and little benefit). Or entering a clinical trial to try re-engineering my immune system to attack the CEA-laced cancer cells.

The rapid rise in CEA and the sudden worsening of pain is spurring me to move quickly. I was looking forward to summer travel, more time with family, and gainful employment; but those plans are postponed now. The next stage of treatment – six weeks of radiation – is scheduled to start in five days.