Source code for pharmpy.modeling.update_inits
"""
:meta private:
"""
from pharmpy.deps import pandas as pd
from pharmpy.model import Model
[docs]def update_inits(
model: Model, parameter_estimates: pd.Series, move_est_close_to_bounds: bool = False
):
"""Update initial parameter estimate for a model
Updates initial estimates of population parameters for a model.
If the new initial estimates are out of bounds or NaN this function will raise.
Parameters
----------
model : Model
Pharmpy model to update initial estimates
parameter_estimates : pd.Series
Parameter estimates to update
move_est_close_to_bounds : bool
Move estimates that are close to bounds. If correlation >0.99 the correlation will
be set to 0.9, if variance is <0.001 the variance will be set to 0.01.
Returns
-------
Model
Pharmpy model object
Example
-------
>>> from pharmpy.modeling import load_example_model, update_inits
>>> from pharmpy.tools import load_example_modelfit_results
>>> model = load_example_model("pheno")
>>> results = load_example_modelfit_results("pheno")
>>> model.parameters.inits # doctest:+ELLIPSIS
{'PTVCL': 0.00469307, 'PTVV': 1.00916, 'THETA_3': 0.1, 'IVCL': 0.0309626, 'IVV': 0.031128, 'SIGMA_1_1': 0.013241}
>>> model = update_inits(model, results.parameter_estimates)
>>> model.parameters.inits # doctest:+ELLIPSIS
{'PTVCL': 0.00469555, 'PTVV': 0.984258, 'THETA_3': 0.15892, 'IVCL': 0.0293508, 'IVV': 0.027906, ...}
"""
if move_est_close_to_bounds:
parameter_estimates = _move_est_close_to_bounds(model, parameter_estimates)
model = model.replace(parameters=model.parameters.set_initial_estimates(parameter_estimates))
return model.update_source()
def _move_est_close_to_bounds(model: Model, pe):
rvs, pset = model.random_variables, model.parameters
est = pe.to_dict()
sdcorr = rvs.parameters_sdcorr(est)
newdict = est.copy()
for dist in rvs:
rvs = dist.names
if len(rvs) > 1:
sigma_sym = dist.variance
for i in range(sigma_sym.rows):
for j in range(sigma_sym.cols):
param_name = sigma_sym[i, j].name
if i != j:
if sdcorr[param_name] > 0.99:
name_i, name_j = sigma_sym[i, i].name, sigma_sym[j, j].name
# From correlation to covariance
corr_new = 0.9
sd_i, sd_j = sdcorr[name_i], sdcorr[name_j]
newdict[param_name] = corr_new * sd_i * sd_j
else:
if not _is_zero_fix(pset[param_name]) and est[param_name] < 0.001:
newdict[param_name] = 0.01
else:
param_name = dist.variance.name
if not _is_zero_fix(pset[param_name]) and est[param_name] < 0.001:
newdict[param_name] = 0.01
return newdict
def _is_zero_fix(param):
return param.init == 0 and param.fix
[docs]def update_initial_individual_estimates(
model: Model, individual_estimates: pd.Series, force: bool = True
):
"""Update initial individual estimates for a model
Updates initial individual estimates for a model.
Parameters
----------
model : Model
Pharmpy model to update initial estimates
individual_estimates : pd.DataFrame
Individual estimates to use
force : bool
Set to False to only update if the model had initial individual estimates before
Returns
-------
Model
Pharmpy model object
Example
-------
>>> from pharmpy.modeling import load_example_model, update_initial_individual_estimates
>>> from pharmpy.tools import load_example_modelfit_results
>>> model = load_example_model("pheno")
>>> results = load_example_modelfit_results("pheno")
>>> ie = results.individual_estimates
>>> model = update_initial_individual_estimates(model, ie)
"""
if not force and model.initial_individual_estimates is None:
return model
model = model.replace(initial_individual_estimates=individual_estimates)
return model.update_source()