simFunction and dose Array from an input file
7 views (last 30 days)
Show older comments
Hi. After fitting my model (fitting was successful using sbiofit) I wrote the code below to generate simfunction to run the model with estimated values and the parmetr in the gData for each case.In gData the doses has been detemined and they are diffent rated doses for each patient applied at diffent time points. I was not able to pass
dosesForFit = createDoses(gData, 'DOSE', 'dose_rate', d3)
to simfunction because
Invalid dosing information. Specify doses as a row vector
and then I used
dosesForFit = reshape(dosesForFit, 1, []); % Ensure dosesForFit is a row vector
and the problem solved and simFunction was executed but the dose considered the same for all of the cases and was combinatin of all of the doses. How can I solve this problem. I attached input file and the code is below: Thanks
%% Update Parameters with Estimated Values and Running the Model
d3 = sbiodose('DOSE');
d3.TargetName = 'plasma.A1';
d3.LagParameterName = '';
d3.AmountUnits = 'nanomole';
d3.RateUnits = 'nanomole/day';
d3.TimeUnits=configsetObj.TimeUnits;
dosesForFit = createDoses(gData, 'DOSE', 'dose_rate', d3);
dosesForFit = reshape(dosesForFit, 1, []); % Ensure dosesForFit is a row vector
doseTable = getTable(dosesForFit);
% getTable(dosesForFit)
% Extract Observables and Experimental Data
for i = 1:length(fitResults.EstimatedParameterNames)
paramObj = sbioselect(model, 'Name', fitResults.EstimatedParameterNames{i});
paramObj.Value = fitResults.ParameterEstimates.Estimate(i);
end
% Define parameter names to extract
variantParams = {'BW', 'SLD', 'HSCR', 'FRAPS'};
% Extract IDs in the order they appear in the input file
idsInOrder = exp_data.ID; % Retain original ID order
[uniqueIDs, ~, idOrder] = unique(idsInOrder, 'stable'); % Preserve order from input file
% Initialize paramMatrix with zeros
numIDs = length(uniqueIDs);
paramMatrix = zeros(numIDs, length(variantParams)); % Rows for IDs, columns for parameters
% Populate paramMatrix with parameter values based on the input file order
for i = 1:numIDs
% Filter data for the current ID
currentID = uniqueIDs(i);
idData = exp_data(exp_data.ID == currentID, :);
% Assign parameter values (assume these are constant per ID)
paramMatrix(i, :) = [idData.BW(1), idData.SLD(1), idData.HSCR(1), idData.FRAPS(1)];
end
% Observables for the simulation
obs = {'CAb_plasma', 'CADC_plasma', 'CPLun_plasma'}; % Observables to track
% Create SimFunction
sfxn = createSimFunction(model, variantParams, obs, dosesForFit,'UseParallel', true, 'AutoAccelerate', true);
% Simulate Using the Parameter Matrix
% Create dose table from dosesForFit
% Simulate the model using the parameter matrix
simData = sfxn(paramMatrix, [], doseTable, time);
3 Comments
Accepted Answer
Arthur Goldsipe
on 23 Jan 2025
Ok, I think I finally understand what's going on.
When you create the SimFunction, you only need to specify one "template" dose (for example, d3 or dosesForFit(1)) instead of the entire dose vector. This dose is basically just used to identify the dose target needed for each simulation. In fact, another option would be to just specify the dose target (that is, 'plasma.ADC_plasma') instead of a dose object. You are only required to pass in dose objects (rather than target names) if the dose object has any parameter names specified in its properties (most commonly, lag or duration).
Also, if your goal is to simluate the model using the estimated parameter values, another option would be to use the predict method on the fit results. That is less flexible than creating your own SimFunction, but it's also less work to set up (assuming it meets your needs).
(Sorry if I'm overusing parentheses.)
-Arthur
5 Comments
Arthur Goldsipe
on 23 Jan 2025
After you create the SimFunction, pass in the dose tables as a column vector. That should be how they are returned by createDoses. I think the only change you need to make to your code is to update the createSimFunction line of code to use d3 instead of dosesForFit (although you could also remove the reshape). For completeness, here's an updated excerpt of the code you provided:
d3 = sbiodose('DOSE');
d3.TargetName = 'plasma.ADC_plasma';
d3.LagParameterName = '';
d3.AmountUnits = 'nanomole';
d3.RateUnits = 'nanomole/day';
d3.TimeUnits=configsetObj.TimeUnits;
dosesForFit = createDoses(gData, 'DOSE', 'dose_rate', d3); dosesForFit = createDoses(gData, 'DOSE', 'dose_rate', d3);
sfxn = createSimFunction(model, variantParams, obs, d3.TargetName,'UseParallel', false, 'AutoAccelerate', false);
doseTable = getTable(dosesForFit);
simData = sfxn(paramMatrix, [], doseTable, time);
More Answers (0)
See Also
Categories
Find more on Scan Parameter Ranges in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!