babelmixr2 0.1.11.9000
Monolix: a mu-referenced parameter that stays inside
exp()in the model (likecl <- exp(tcl + eta.cl) * (CRCL/100)^cl.crcl, orf(depot) <- exp(lfdepot)) was given a log-normal distribution while the model still tookexp()of it, soexp()was applied twice. It is now a normal parameter on nlmixr2’s scale (its initial value, estimate and covariance too).When lixoftConnectors cannot load or run a Monolix project, the error now includes Monolix’s reason (its
[ERROR]lines) instead of “see Monolix’s [ERROR] above”.-
Fixes found by running the NONMEM/Monolix stress kit with NONMEM 7.4:
-
nonmemControl(est="imp")andest="its"fits were always reported as unsuccessful; NONMEM ends them with “OPTIMIZATION WAS NOT TESTED FOR CONVERGENCE”, which is now read as finished. -
nonmemControl(est="posthoc")fits could not be read (no#TERM:block and no parameter history). - Box-Cox, Yeo-Johnson and logit + Yeo-Johnson residual errors were rejected by NM-TRAN (IPRED redefined in nested/
ELSE IFstructures); the transformations are now written without nested IFs. They are still transform-both-sides (DV inCCONTR, IPRED in$ERROR). Predictions at or belowsqrt(DBL_EPSILON)are floored like rxode2 instead of being set to-1000000000(which gavelnorm()fits a huge objective function), and Box-Cox no longer divides by zero when lambda is 0. - The
IPRED/PREDcomparison with NONMEM now undoes the residual transformation first (NONMEM’s predictions are on the transformed scale). - Censored (
CENS,CENS+LIMIT,LIMITonly) models were rejected by NM-TRAN (“random variable is defined in a nested IF structure”). - A
$PKparameter changed later in the model (likeif (SEX == 1) cl <- cl * 1.2) was changed in$DES, which NONMEM does not allow, and used undefined in$ERROR; it is now defined asRXPK_<name>in$PK. - Models without random effects are refused (NONMEM treats them as single-subject data, where
METHOD=CONDis invalid).
-
-
Monolix fixes found by running the NONMEM/Monolix stress kit:
- Infusions given by rate (
RATE) or duration (TINF) were written to the data but not declared in[CONTENT], so Monolix gave them as bolus doses. - Endpoints with dotted names (like
concentration.in.plasma) kept the dots in the Monolix project (OUTPUT, observation names, predictions), which Monolix cannot load. - Reading a fit with a fixed parameter (like
tfdepot <- fix(0.8)) failed with “subscript out of bounds”; Monolix’s covariance has only the estimated parameters. - A
monolixControl(runCommand=)command that finished without writing Monolix’s output now stops with an error instead of waiting for it forever.
- Infusions given by rate (
nonmemControl(cov="")now skips the covariance step as documented; before it gave an error becausematch.arg()cannot match"".The NONMEM/Monolix stress test (
inst/stress) is now a kit to run on a machine with NONMEM and/or Monolix:install-kit.Rinstalls the versions to test,run-stress.R --checkfinds NONMEM/Monolix, andrun-stress.R --kitruns every case end to end, checks that rxode2 reproduces the NONMEM/Monolix predictions and that a second fit reads the saved output, and zips the results to send back. New cases cover missing observations,evid=2, character IDs, time not starting at zero, extra data columns, a single subject, oral plus iv doses, ODE infusions (rate, steady state, modeled duration), two endpoints, bounded thetas, several covariates, models without random effects and the NONMEM/Monolix estimation options.NONMEM control streams now use
$ABBR PROTECTso NM-TRAN replacesLOG,EXP,SQRT, division and powers with NONMEM’s protected functions (NONMEM 7.4 or later). Turn it off withnonmemControl(protect=FALSE)oroptions(babelmixr2.nmProtect=FALSE). Since NM-TRAN writesB**EasPEXP(E*PLOG(B)), integer powers are written as products (or powers ofx*x, which is never negative) and powers of a positive number withDEXP(). Functions of numbers (likeexp(0),log(2*pi)orexpit(0)) and divisions of numbers are written as numbers, and model variables named like a protected function (likeplog) are renamed. babelmixr2’s own zero protection (protectZeros) is now only used withprotect=FALSE, like for NONMEM before 7.4 (#62).NONMEM control streams now explain the zero-protection code babelmixr2 adds: each
RXDZ###IFblock is preceded by a comment saying what it keeps the variable away from and why, as is theIF (W1 .EQ. 0.0)residual variance protection (#91). The protection forlfactorial()/lgamma1p()now keeps its argument above-1(it previously clamped it just below-1, makingx+1negative),log(x)and1/xno longer share one protected variable, so1/xkeeps the sign of a negativex, and a variable reassigned in the model is protected again instead of reusing the protection of its old value. Zero protection needed byf(),alag(),rate()ordur()(written in$PK) is no longer shared with other lines, which could use it before (or without) it being calculated.est="pknca"now works with covariates in the data and with a mix of intravascular and extravascular doses (#102). Doses into a compartment that the observations are calculated from are intravascular. With both routes,kais estimated from the extravascular doses andvcandclfrom the intravascular doses. Intravascular bolus doses have the concentration at the time of dosing back-extrapolated (replacing a predose concentration at the first dose), and other doses have it imputed (as the predose concentration, or zero for the first dose). When no doses are only extravascular,kais not updated. Multiple-dose data no longer need a concentration at each dose time; each dose until the next (with at least 2 concentrations) is used, withvcfrom the first dose of each route andclfrom dosing intervals mostly covered by concentrations. Doses at the same time are combined.When a NONMEM run fails,
est="nonmem"now says why and where to look instead of failing with an unclear error: a run command that was not found or wrote no output, a NONMEM license problem, an NM-TRAN error in the control stream or the data, NONMEM not starting (for example a compiler problem), NONMEM crashing or stopping during estimation, and output babelmixr2 cannot read (#46).est="pknca"now updates the initial estimates of models that are not mu-referenced, likeka <- tka * exp(eta.ka), instead of failing with “Must have names” (#101). When there is novc, a central volume namedv,V,Vc,VC,v1orV1(only one of them) now gets the NCA central volume estimate. Parameters defined asexpit()of a theta are now transformed back correctly. A message lists the parameters that could not be updated.NONMEM models can now use nested
if/else if/elsestatements (andifelse()): their branches are pruned with rxode2’s branch pruning before the model is translated to NONMEM (#11). With the defaultnonmemControl(prune="auto")a model whoseifblocks are simple is still written with NONMEMIFblocks and only a model that needs it is pruned;prune=TRUEalways prunes andprune=FALSEnever prunes (the error for unsupportedif/elsestatements suggestsprune=TRUE).monolixControl(prune=)has the same option for Monolix. Monolix writesif/elseif/else(and nestedif) statements directly, soprune="auto"(the default) only prunes a model that usesifelse(), which Monolix cannot write;prune=TRUEalways prunes andprune=FALSEnever prunes. A logical expression used as a number in a Monolix model is written as a 0/1 indicator variable (#11).A logical expression used as a number in a NONMEM model (like
cl <- tcl * (WT > 70)) is now written as a 0/1 indicator variable, since NONMEM cannot use a logical expression as a number. A numericif ()condition is written as not equal to zero.est="nonmem"andest="monolix"fits withtable=tableControl(cwres=TRUE)no longer fail with “objective function ‘FOCEi’ already present”. The fit keeps both the NONMEM (or Monolix) objective, which stays in use, and nlmixr2’s FOCEi objective (#94).as.nlmixr2()of anonmem2rxormonolix2rxmodel now also keeps the imported objective in use withcwres=TRUE, and no longer fails after an earlier import withcwres=TRUE(it started from that fit’s etas).est="monolix"now translates compartment properties (f(),alag(),rate()anddur()) that are expressions, likef(depot) <- exp(lfdepot), instead of erroring with “the complex F is not supported by babelmixr2” (#115). The expression is calculated in a new variable (likerx_f_depot) that thePK:macro uses. A property set only inside anifnow keeps rxode2’s default otherwise (1 forf(), 0 foralag()) instead of being applied unconditionally.The ACoP 2024
babelmixr2/PopEDabstract (doi:10.70534/XUMG6226) is now incitation("babelmixr2"), the package description and thePopEDarticle (#155).as.nlmixr2()of anonmem2rxmodel now stops with an informative error when the model still contains untranslated NONMEM residual variables (eps#orerr#) instead of failing inside the estimation routine (#95).popedControl(sigdig=)now sets the ODE solver tolerances itself (atol = rtol = 0.5*10^(-sigdig-2), the same values as before) instead of usingrxode2::rxControl(sigdig=). rxode2 5.1.5 loosened the tolerances thatrxControl(sigdig=)gives, which made the finite-difference FIM, and so the design OFV and RSEs, less accurate (#223).est="nonmem"now fits censored data the way nlmixr2 does (#92). M3 (CENS), M4 (CENSwith a finiteLIMIT) and M2 (CENS=0with a finiteLIMIT, including data with aLIMITbut noCENScolumn) useF_FLAGlikelihoods in$ERRORwithLAPLACIANestimation. A missingLIMITis now written as NONMEM’s infinity instead of0,CENS/LIMITcolumns that do not censor anything are dropped, the objective function is adjusted so the log-likelihood includes the censored observations correctly, and censoring with a transformed endpoint (likelnorm()) is refused instead of giving the wrong likelihood. The censored observations are left out of the NONMEMPREDcomparison since NONMEM’sPREDis their likelihood.est="nonmem"andest="monolix"now fitlinCmt()models. A purelinCmt()model uses NONMEM’s closed-form solutions (ADVAN1-ADVAN4,ADVAN11orADVAN12withTRANS1micro-constants) or Monolix’spkmodel(); a model the closed form cannot represent (other ODEs, parameters that change with time, and for Monolix modeled rates or durations, doses into more than one compartment or amounts used in the model) is translated to ODEs withrxode2::linToOde().nonmemControl(linCmt="ode")andmonolixControl(linCmt="ode")always use ODEs. The closed-form solutions need an rxode2 withlinCmtMicro(); with an older rxode2,linCmt()models use ODEs.est="poped"now designslinCmt()models (translated to ODEs).est="nlmer",est="fmeMcmc"andest="pseudoOptim"are now tested withlinCmt()models.New NONMEM/Monolix stress test (
inst/stress/), shared by the package tests and a command line runner (run-stress.R). The runner can also fit every case with NONMEM and/or Monolix end to end on a machine that has them, and optionally translate the nlmixr2lib models; seeinst/stress/README.md.The NONMEM data dropped the
RATE,SSandIIitems: which items were written was decided from settings made only after the data were converted, so infusions, steady state doses and modeled rates or durations were written as plain bolus doses. The items are now kept when the data use them.A steady state dose with a lag time (which rxode2 splits in two) is now written as one
SSdose for NONMEM and Monolix, not as two bolus doses.NONMEM now writes a modeled duration as
Dn(it wasDURn, which NONMEM does not know) and a modeled rate asRn(it was dropped).NONMEM now uses the NONMEM name of a mu-referenced covariate in
$PK(likeNLMIXRMUDERCOV1), matching$INPUT.probitInv()(which rxode2 writes witherf()) now translates to NONMEM (PHI()) and Monolix (normcdf()).est="monolix"now refuses models without between-subject variability, residual errors other thanadd(),prop()andadd() + prop(), and transformations other thanlnorm()andlogitNorm()up front with a clear error. Before, aboxCox(),yeoJohnson()orlogitNorm()residual stopped with “argument must be a character string”.Monolix now separates the arguments of the
empty()macro and thelogitNormaldistribution with commas.rxode2’s normalized powers (
Rx_pow_di(),Rx_pow()) now translate to NONMEM (**) and Monolix (^).NONMEM and Monolix data without doses (like a
$PREDmodel with the dose as a covariate) no longer stop with “undefined columns selected”.est="nonmem"now refuses residual transformations it cannot write (likeprobitNorm()) up front; before, writing the files stopped with “can only write character objects”.Monolix now applies a bioavailability or lag time to the doses of that compartment only; a property of a compartment without doses no longer stops with “values must be length 1”. A parameter written with brackets (like
v <- (tv + eta.v)) is now a normal parameter, and an unsupported parameter transformation (likelog10()) gives a clear error.est="monolix"now spells a mu-referenced parameter with a.in its name (like the taintedrx__cl.wt, orka.x <- exp(tka + eta.ka)) the same way in every section of the Monolix model (#220). TheEQUATION:block already wrote it asrx__cl__wt, butinput=,[INDIVIDUAL],<PARAMETER>and the output readers usedrx__cl.wt, so Monolix saw an undeclared variable.est="saemix"now fitslinCmt()models. The prediction was looked up in a column named after the endpoint (rxLinCmt), which the solved model does not output, so saemix stopped withnon-numeric argument to function(#212).est="saemix"now fits models where a structural theta has no between-subject variability (e.g.v <- exp(tv)). Collecting the individual etas after the fit failed withinvalid subscript type 'list'(#212).est="saemix"now refuses a model it cannot fit, instead of fitting it with a different residual error. saemix fits one endpoint with anadd(),prop(),add() + prop()(combined2, the only combination saemix has) orlnorm()residual error, or anll()likelihood. A model with more than one endpoint (previously fit against predictions of zero), acombined1add() + prop()(includingsaemixControl(addProp="combined1")),pow(),boxCox(),yeoJohnson(), a logit/probit transformation,lnorm() + prop()or a non-normal residual distribution now stops with an error, as does a fixed residual error or between-subject variability, which saemix would otherwise estimate anyway. The checks use the new rxode2 assertionsassertRxUiTransform(),assertRxUiErrType(),assertRxUiAddProp(),assertRxUiNoFixedResiduals()andassertRxUiNoFixedOmega(), so this requires rxode2 5.1.8 (#212).est="saemix"now fitslnorm()residual errors with saemix’s exponential error model; they were previously fit as an additive error with a missing starting value (#212).est="monolix"now accepts normal priors fromini({})and writes them as Monolix MAP estimation (#207). A parameter with a prior is estimated withmethod=MAP, and its prior is written to a[POPULATION]section of<MODEL>. Monolix’s prior on a typical value has the same distribution as the parameter itself, with itssdin the Gaussian space, so the prior mean is back-transformed like the estimate (exp(),expit(),probitInv()) while the prior sd is written as is:prior(tka) ~ dnorm(log(1.5), 0.5)becomeska_pop = {distribution=logNormal, typical=1.5, sd=0.5}, the same distribution with no approximation. Covariate effects get anormalprior. Checked with Monolix 2024R1: tight priors pinka_pop,cl_pop, a covariate effect and a logit-normal parameter at the prior mean, and a vague prior leaves the estimate at the MLE. Priors Monolix cannot honour are errors rather than being dropped: priors on omega elements or omega blocks, multivariate normal priors, non-normal priors, priors on aprobitInv()parameter with bounds other than (0, 1), and priors on residual error parameters – Monolix accepts a MAP prior onadd__sdbut ignores it (every estimate identical to the run without it).The “PRED absolute difference compared to Monolix PRED” line of a Monolix fit’s message is now an absolute difference (it printed a relative one). The covariance of a fit from Monolix 2020 or later now carries nlmixr2’s parameter names (
tka,cl.wt) instead of Monolix’s (ka_pop,beta_cl_lWT), like fits from older Monolix versions already did.Monolix projects with mu-referenced covariates (
cl <- exp(tcl + eta.cl + cl.wt * lWT)) now load in Monolix. The covariate was missing from the[INDIVIDUAL]inputs (Monolix:Undefined variable 'lWT'), and when every covariate was mu-referenced the structural model got a regressor line with no name (= {use=regressor}, a syntax error). Reading the results of such a fit back failed withsubscript out of bounds: the covariance looked up the covariate effect asNA_popinstead ofbeta_cl_lWT. The tests now replay Monolix 2024R1 runs, with and without MAP priors. When lixoftConnectors cannot load or run the project,nlmixr2()now stops with an error instead of waiting forever for output Monolix never writes.est="nonmem"now runs models withini({})priors, translating them to NONMEM’s$PRIOR NWPRI(#205). Normal priors on population parameters (dnorm(),stdNormal(), thetcl + tv ~ c(...)joint normal) become$THETAP/$THETAPV, andinvWishart(nu)degrees of freedom on an omega block become$OMEGAP/$OMEGAPD, with the block’s own initial estimate as the prior scale. NWPRI gives its priors to the first THETAs and the first omega blocks, so the parameters with a prior have to come first inini({}); otherwise, and for priors NWPRI cannot express (dcauchy(), a normal prior directly on an omega element, which is TNPRI), the model is refused before any file is written instead of fitting a different prior. When the output is read back, the prior values NM-TRAN adds as extra THETAs and OMEGAs are dropped, and the objective function type saysnwpribecause NONMEM’s objective includes the prior.$OMEGA BLOCK()records of 3 or more etas are now written in the order NONMEM reads them (row by row down the lower triangle). They used to be written column by column, so NONMEM started from the wrong initial omega values.The
$PROBLEMrecord of a generated NONMEM control stream now carries the model name ($PROBLEM one.cmt translated from babelmixr2). It read a misspelled getter and was always blank (#209). Because the control stream changes, an existing NONMEM export that has a.md5hash file will not match and is re-run once in a new numbered directory. Moving past a second stale export (-001-nonmemalso not matching) no longer hangs: the export directory kept its cached number and the hash check looped forever.est="fmeMcmc"now uses priors declared in the model’sini({})block (for exampleprior(tka) ~ dnorm(0, 10)) instead of refusing the model. They become thepriorfunctionFME::modMCMC()samples with, evaluated with rxode2’s shared prior kernel on the natural parameter scale, even whenscaleTypemakes FME sample a rescaled space. SupplyingfmeMcmcControl(prior=)as well is an error rather than silently preferring one of them (#208).nonmemControl(est="its")now writes$ESTIMATION METHOD=ITS INTERACTION(iterative two stage). It wroteMETHOD=IMP, so NONMEM ran importance sampling while the returned fit was labelled with thenonmem itsobjective function type (#211).A PopED design dataset that gives
cmtas a compartment number (et(amt=180, cmt=1)) now doses the right compartment.et()keepscmtas a character column, sorxode2::etTrans()read"1"as a compartment name, found no match and quietly moved the dose to an extra compartment; the design built without a warning but every prediction was zero and the FIM was degenerate (#201). This also works when the column mixes names and numbers, which is what a multiple endpoint design looks like when it names the endpoint on its observation records. A dosing record that still cannot be matched to a model compartment is now an error instead of a silently empty design.A multiple endpoint PopED design can now name its endpoints with
cmt(cmt="cp",cmt="eff") instead ofdvid. Thecmtfallback was already written but unreachable: a dataset without advidcolumn stopped withattempt to select less than one element in get1indexbefore it was tried. This applies to the usual design space; a design that gives per-IDsampling throughpopedControl(a=)still needsdvid.The PopED model translation no longer drops the
if ()condition that guards an adaptive dosing call (evid_(),bolus(),infuse(),infuseDur(),reset(), …). The branch pruner used to flatten the model unconditionally, so a model likeif (t <= 0) infuseDur(DOSE, TINF, cmt=1)pushed a dose at every design point instead of once (#131). The pruner’s capture protocol is now used and the guarded call is restored after the branches are flattened.-
Added two PopED examples showing how to make the dosing regimen itself optimizable (#131):
inst/poped/ex.10.PKPD.HCV.dose-and-tinf.babelmixr2.Rkeeps the dose record and makes the amount and infusion duration design (a) variables viaf(depot) <- DOSE(withamt=1) anddur(depot) <- TINF(withrate=-2).inst/poped/ex.10.PKPD.HCV.adaptive-dosing.babelmixr2.Rdrops the dose records entirely and pushes the regimen from inside the model withinfuseDur(), which makes the dosing interval a design variable as well. This one needs rxode2 > 5.1.7 (rxode2#1214).
Both are optimized with
poped_optim(..., opt_a=TRUE)and agree on the reference design (OFV 88.27). The NONMEM/Monolix fit cache is now written with
saveRDS()as<model>.rds/nlmixr.rdsinstead ofqs2, soqs2moved fromImportstoSuggests. Existing run directories keep working: a.qs2cache is read once (whenqs2is installed) and rewritten as the.rds, and if it cannot be read the fit is rebuilt from the run output as it would be for any missing cache.Each estimation method now carries
typeanddescriptionattributes so it appears in the category-grouped method list nlmixr2est prints for an unsupportedest=(or a barenlmixr2()call):nonmem,monolix,pknca,fmeMcmcandpseudoOptimunder “External”,saemixunder “Stochastic EM”,nlmerunder “Integral approximation”, andpopedunder “Optimal Design”.The mu-referenced covariate algorithm (
muRefCovAlg) is now applied through thenlmixr2estpreprocessing/post-final-object hooks instead of explicitnlmixr2est::.uiApplyMu2()/.uiFinalizeMu2()calls in thesaemix,nonmem,monolix, andnlmerestimation methods (#184). Thenonmemandmonolixmethods gained themumethod attribute so the hooks fire for them.The
nlmerestimation method now prints its iterations during thelme4::nlmeroptimization and records a parameter history, both driven by the sharednlmixr2estnlm machinery (not lme4). Each recordednlmerSolveGrad()evaluation logs the population parameter estimate (per-subject mean of thephicolumns) into the resident nlm scale; the accumulated history is recovered vianlmixr2est::nlmGetParHist()and stored on the fit asparHistData. No objective column is shown (lme4 owns the deviance). Iteration printing defaults on (nlmerControl(print = 1L)). Requiresnlmixr2est (>= 6.2.0).The
pseudoOptimControl()andfmeMcmcControl()functions now accept either the legacy scalarprint/printNcol/useColorarguments or a pre-builtnlmixr2est::iterPrintControl()object viaprint. Internally the control list stores a singleiterPrintControlsub-list (matching the upstreamnlmixr2estunification innlmixr2estPR #651), so iteration output from these estimators uses the same shared C++ formatter as every othernlmixr2estestimator. Requiresnlmixr2est (>= 6.0.1).The
iterPrintControlunification now also coversnlmerControl()andsaemixControl().nlmerControl()gains the standardprint/printNcol/useColorarguments (or a pre-builtnlmixr2est::iterPrintControl()object) and feeds the resultingiterPrintControlsub-list to the nlm C solving engine instead of a hard-codedprint = 0L.saemixControl()absorbs its legacyprint(logical),printNcolanduseColorarguments into the sameiterPrintControlsub-list; a nonzeroeveryenables thesaemixprogress output.Fix NONMEM export silently dropping the absorption lag (#190). A
lag(depot)/alag(depot)assignment computed the lag parameter in$PKbut never emitted the correspondingALAG<n>=statement, so NONMEM fit the model without any lag. The lag value is now assigned toALAG<n>in$PK.NONMEM export now announces when a model variable is renamed because it collides with a NONMEM reserved name (e.g. a variable named
alagbecomesRXR1). The rename was previously silent (#190).Added
nlmerestimation method: fits nlmixr2 models vialme4::nlmerusing analytical gradients from rxode2 sensitivity equations. Supports mu-referenced and non-mu-referenced random-effects models. Access vianlmixr(model, data, est = "nlmer"). The underlying lme4 fit is stored asfit$nlmer.Fix integer type safety in C++ source: loop variables and size variables now use
R_xlen_t(signed) orsize_t(unsigned) instead ofint/unsigned intwhere appropriate, preventing potential integer overflow and segfaults for vectors with more than 2^31 elements. The specific crash: ingetDvid(),int j = cmtDvid.size()whencmtDvid.size()≥ 2^31 wraps toINT_MIN, the subsequent decrement jumps toINT_MAX, andcmtDvid[INT_MAX]accesses memory far out of bounds.Add bounds check in
popedSolveIdME()andpopedSolveIdME2()to verify thatmodelSwitchvalues are within the allocated matrix column dimensions (nend), in addition to the existing check against the number of unique IDs in the global time indexer.Remove
qssince it will be archived and replace withqs2.Added
saemixestimation method
babelmixr2 0.1.9
CRAN release: 2025-08-31
Added estimation method
fmeMcmcwhich runsFME::modMCMC(). It is also compatible with thecodapackage; you can convert withas.mcmc(fit)and then run coda tools likecoda::raftery.diag(coda::as.mcmc(fit2)).Added estimation method
pseudoOptimwhich runsFME::pseudoOptim(). This estimation method requires all parameters to be bound.Added bug fix for rstudio completion
babelmixr2 0.1.6
CRAN release: 2025-01-20
Use new nlmixr2est covariate selection enforcement for babelmixr2
Fix a bug where the NONMEM export isn’t working well (#839)
Check loaded
rxode2information and compare to what the loaded model information should be. This allows better checking of which model is loaded and even more robust stability. It requiresrxode2>3.0.2.
babelmixr2 0.1.5
CRAN release: 2024-11-06
Fix bug where
PopEDcould error with certaindvidvaluesFix bug where if/else clauses in the model could cause the model to not predict the values correctly.
Fix bug so that
shrinkage()calculation worksFix bug so that you can mix 2 different
PopEDdata bases in an analysis without crashing R. While this didn’t occur with every database clash, it more frequently occurred when you interleavedPopEDcode between two differentPopEDdatabases, like in issue #131.Added a new function
babelBpopIdx(poped.db, "par")which will get the poped index for a model generated frombabelmixr2, which is useful when calculating the power (as in example 11).
babelmixr2 0.1.4
CRAN release: 2024-09-23
Added experimental
PopEDintegrationRemoved dependence on
rxode2parseImported
monolix2rxfrom themonolix2rxpackageAlso allow conversion of a model imported from monolix to a
nlmixr2fit.
babelmixr2 0.1.3
Changed default NONMEM rounding protection to FALSE
Added a
runoption to themonolixControl()andnonemControl()in case you only want to export the modeling files and not run the models.
babelmixr2 0.1.2
CRAN release: 2023-12-12
Handle algebraic
muexpressionsPKNCA controller now contains
rxControlsince it is used for some translation optionsThis revision will load the pruned ui model to query the compartment properties (i.e. bioavailability, lag time, etc) when writing out the NONMEM model. It should fix issues where the PK block does not define some of the variables and will have a larger calculated variable that can be used in the model instead.
When
nonmem2rxhas a differentlstfile, as long asnonmem2rx::nminfo(file)works, then a successful conversion to anlmixr2fit object will occur.Fix to save parameter history into
$parHistDatato accommodate changes infocei’s output ($parHistis now derived).Changed the solving options to match the new steady state options in
rxode2and how NONMEM implements them. Also changed the iwres model to account for therxerr.instead of theerr.which was updated inrxode2as well.