Mixed/parallel absorption from the same dosepoint

Can someone comment on in NLME for parallel (at the same time) subcutaneous absorption from a sigle site of absorption, how this would be done if for example, 50% of the dose is assumed to be absorbed via first-order ka and the remaining 50% would be via a zero-order? How would this differ if this were sequential 1st-order, followed by 0-order from the same site? How would F be stated to account for bioavail? Thank you, Elliot

Hi Elliot, I’ll write in some code here that should do the trick, assuming you have a central compartment (Ac) and a skin compartment (As). deriv(As = -kaAs) deriv(Ac = kaAs - keAc) dosepoint(As, bioavail = FFsplit) doisepoint(Ac, bioavail = F*(1-Fsplit), duration = Tzero) stparm( ka = tvkaexp(nka) ke = tvkeexp(nke) Fsplit = ilogit(pFsplit + nFsplit) F = ilogit(pF + nF) Tzero = tvTzeroexp(nTzero) ) fixef(…) ranef(…) You can do the usual initial estimates for fixef and ranef statements. Note that the parameters that should be between zero and one use the ilogit transform, so the initial values of the fixed effects (which I usually preface with “p” to call out that they are transformed into a probability distribution) can be zero if F is near .5, and an offset of 3 in either direction will move it to .1 or .9, approx. You can remove random effects and freeze some of the fixed effects as needed. Note that the zero order absorption goes directly to the circulation, that’s the most convenient way to write this, but you could also dose to the skin and then mess with an absorption rate parameter if you want. To set this up as sequential it is probably better to it the second way, because you’ll need to throw a switch to stop the first order absorption, which could leave some mass in the skin compartment (it may be tiny, but timing is everything here). When to stop, given that the first order dose is never fully absorbed? Well, say you find a way to compute a good switching time, then we can do this: arate = flag1kaAs + flag0zrate deriv(As = -arate) deriv(Ac = arate - keAc) dosepoint(As, bioavail = F) double(Tswitch) double(flag0) double(flag1) sequence{Tswitch = …; flag1=1; #turn on just first order flag0=0; sleep(Tswitch); #compute normally until Tswitch time units have elapsed flag1 = 0; #switch over to zero order flag0 = 1; sleep(As/zrate); #compute normally until all the drug is absorbed (remember dosepoint handles bioavail already) flag0=0; #make sure all absorption is turned off } stparm( ka = tvkaexp(nka) ke = tvkeexp(nke) Fsplit = ilogit(pFsplit + nFsplit) #I’ll assume you still want Fsplit as part of figuring out the switching time F = ilogit(pF + nF) zrate= zrateexp(zrate) #this will be MUCH easier if we use a rate here ) fixef(…) ranef(…) Now… how these behave differently depends on how fast the zero order rate is. If it is really slow you probably won’t see much difference unless the fraction of dose at zero order is large. Also, iunless you are careful about transition time you will have a discontinuity in absorption rate. You can draw this out conceptually for the two cases. The absorption rate from the first order process will look like an exonential decay, the height of which (at t=0) is kaDoseFFsplit. The rate of decay is ka. For the zero order process you have a straight line at y=zrate, whose AUC (ratetime) is DoseF(1-Fsplit). Superimpose the curves to get the composite rate, and see what happens when you delay the zero order. With all that said, you may not see much difference in the final results depending on parameter values. And if you want to delay the zero order but decide you don’t really care too much about the sequential nature you can go with the simpler model above and just add a Tlag term to the dosepoint for Ac. I hope this helps, -Jason

Hi Jason, first off, thanks for this. I love this idea of a forum like this and have been reading posts from others to see if there are any other tidbits of wisdom I can gleam. Second, the code is helpful, and I wil ldefinitely find use for it, but wondering if there is an approach using the

Hi Elliot, The graphical model can get you off to a great start. You can click on compartments and add in a dosepoint for them. You can create the first case (simultaneous dosing) easily this way. You can use the split option to split the dose to a compartment, but consider if you want to model zero order uptake FROM the skin rather than a zero order dose to the skin. For the second case, with the sequential dosing, it will more difficult to do with the graphical approach, just because you’ll have to create a procedure block to handle all of the sequencing. Your description of using the dosepoints from the UI is spot on. If you use 2 dosepoint you have to put the amount dosed for each. If you spllit the dosepoint you enter 1 dose and control the fraction of the split, I think, using the bioavailability term. I’m checking on the split option, but you can do it with 2 dosepoints using bioavailability and giving the full dose to both dosepoints. -Jason

What if you don’t know “F” i.e. you are fitting CL/F and V/F. How would this change the split and/or 2-dospoint approach?

If you don’t have a reference formulation (eg. IV, IR, etc) to go with the SC dose, then you won’t be able to identify F. I would just fix F to a value of 1 in that case and recognize that the parameters are ratios, as you have written.

Hi Jason, Can you confirm if this code is appropriate to describe the mixed/parallel absorption? I’m not clear on how we control for duration for the zero order or does the software assume the zero order absorption is simply the duration of the sampling? My objective is to split the absorption as partially zero order (from the SC space) and 1st order. I don’t want a lag time since I believe mechanistically the two are occuring in parallel. Test (){ dosepoint(Aa, bioavail = F, idosevar = AaDose, infdosevar = AaInfDose, infratevar = AaInfRate, split) dosepoint2(Aa, bioavail = (1-F), rate = (k0)) C = A1 / V deriv(Aa = - Ka * Aa) deriv(A1 = (Ka * Aa) - (Cl * C) - (konCRf) + (koffDR)-(Cl2 * (C - C2))) deriv(A2 = (Cl2 * (C - C2))) C2 = A2/V2 deriv(DR=(Ckon*Rf)-(koff+kint)*DR) Rf=Rmax-DR error(CEps = 0.25) observe(CObs = C * (1 + CEps))

Dear Elliot Just in case Jason did not answer you yet, I wrote a code that would I think mix zero order with first order. Me personally I prefer using 2 comaprtments, one being the absorption compartment and the other having dose input into the central compartment with a specific rate which would mimic the zero order absorption. I am attaching a project that shows you first how to make a template using the edit as graphical where you can define easily the mixed absorption process and then shift to edit as textual to add the kon/koff equations. I assumed that all undefined parameters are log_normal and put F in the logit domain to make sure F will be between 0 and 1. I hope this will help you too. best Regards; Serge [file name=MIXED_ABSORPTION_official_version.phxproj size=160473]Certara | Drug Development Solutions (157 KB)

Hi Serge, it seems the zipped file is locked. Is there a password I am missing? thank you, Elliot

Dear Elliot I know this problem. In order to open the project. close first Phoenix, then double click on the attached project from the forum I just sent you. It should open Phoenix with that project. When I am trying to save the project and then open Phoenix, I am also locked. Try the way I just explain. It is working from my hand. best Serge Just in case here is the code. You must put the zero order absorption as a dose input in the central compartment with the rate or duration as parameter. That will mimic what youa re trying to do while the first order part is handled as usual. If you split the 2 doses from the same absoprtion compartment, my understanding is that you will get partla zero order (cste infusion) in the absoprtion compartment but then the only way to get the central compartment will be by first order. Therefore, zero order absorption must be done using the dose input in the central compartment. In fact, mathematically zero order absoprtion or constant IV infusion is the same. Best Serge test(){ deriv(A1=-(konCRf)+(koffDR) -ClC -Q*(C-C2) +AaKa ) deriv(DR=(Ckon*Rf)-(koff+kint)*DR) Rf=Rmax-DR urinecpt(A0 = (Cl * C)) deriv(A2 = (Q * (C - C2))) deriv(Aa = - (Aa * Ka)) C = A1 / V dosepoint(A1, bioavail = (1-F), rate = (rate), idosevar = A1Dose, infdosevar = A1InfDose, infratevar = A1InfRate) error(CEps = 0.1) observe(CObs = C * (1 + CEps)) C2 = A2 / V2 dosepoint(Aa, bioavail = (F), idosevar = AaDose, infdosevar = AaInfDose, infratevar = AaInfRate) stparm(kon = tvkon * exp(nkon)) stparm(koff = tvkoff * exp(nkoff)) stparm(kint = tvkint * exp(nkint)) stparm(Rmax = tvRmax * exp(nRmax)) stparm(V = tvV * exp(nV)) stparm(Cl = tvCl) stparm(V2 = tvV2) stparm(Q = tvQ) stparm(Ka = tvKa) stparm(F = ilogit(tvF + nF)) stparm(rate = tvrate * exp(nrate)) fixef(tvV = c(, 1, )) fixef(tvCl = c(, 1, )) fixef(tvV2 = c(, 1, )) fixef(tvQ = c(, 1, )) fixef(tvKa = c(, 1, )) fixef(tvF = c(, 1, )) fixef(tvrate = c(, 1, )) fixef(tvkon = c(, 1, )) fixef(tvkoff = c(, 1, )) fixef(tvkint = c(, 1, )) fixef(tvRmax = c(, 1, )) ranef(diag(nV, nF, nrate, nCl, nV2, nQ, nKa, nkon, nkoff, nkint, nRmax) = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)) }

Hi Serge, unfortunately, the file did not open or launch Phoenix when I click on the link in the forum post. However I cut and pasted the code into the project and its currently running. I’m concerned though how slowly the FO algorithmn is running when I use this approach. It doesn’t run nearly as slowly when I use a single dose point using the exact same data, even when I use a textual model. For exapmle, a single dosepoint might run the FO in something like 5-30 minutes whereas I’m now on 3.5 hours and its only processed 3 iterations and still going. Before you ask, no I don’t have the MPI option clicked because of how it was installed originally on my PC, and its something I will be rectifying in the near future, but regardless its incredibly slow for this type of model which makes me wonder if I’ve either got too small or too large estimates for fixed and random effects. Any thoughts? Elliot

Elliot, if you’re using IE in particular as your browser it “helpfully” renames the PHXPROJ file to Zip (since it is in fact a compressed file). Just download the file then rename the extension back to xxx.PHXPROJ and then you should be fine to open it up in Phoenix usually. I use Firefox and I don’t have this problem, nor does Chrome etc. Simon.