exponenta event banner

sbiofit

Выполните регрессию нелинейного метода наименьших квадратов

Statistics and Machine Learning Toolbox™, Optimization Toolbox™ и Global Optimization Toolbox рекомендуются для этой функции.

Синтаксис

fitResults = sbiofit(sm,grpData,responseMap,estiminfo)
fitResults = sbiofit(sm,grpData,responseMap,estiminfo,dosing)
fitResults = sbiofit(sm,grpData,responseMap,estiminfo,dosing,functionName)
fitResults = sbiofit(sm,grpData,responseMap,estiminfo,dosing,functionName,options)
fitResults = sbiofit(sm,grpData,responseMap,estiminfo,dosing,functionName,options,variants)
fitResults = sbiofit(_,Name,Value)
[fitResults,simdata] = sbiofit(_)

Описание

пример

fitResults = sbiofit(sm,grpData,responseMap,estiminfo) оценочные параметры модели SimBiology sm с помощью регрессии нелинейного метода наименьших квадратов.

grpData является groupedData object, задающий данные, чтобы соответствовать. responseMap задает отображение между компонентами модели и данными об ответе в grpData. estimatedInfo является estimatedInfo object, который задает предполагаемые параметры в модели sm. fitResults является OptimResults object или NLINResults object или вектор этих объектов.

sbiofit использует первую доступную функцию оценки среди следующего: lsqnonlin (требуемый Optimization Toolbox), nlinfit (требуемый Statistics and Machine Learning Toolbox), или fminsearch.

По умолчанию каждая группа в grpData является подходящей отдельно, приводя к специфичным для группы оценкам параметра. Если модель содержит активные дозы и варианты, они применяются перед симуляцией.

пример

fitResults = sbiofit(sm,grpData,responseMap,estiminfo,dosing) использует информацию дозирования, указанную матрицей объектов дозы SimBiology dosing вместо того, чтобы использовать активные дозы модели sm, если существует кто-либо.

пример

fitResults = sbiofit(sm,grpData,responseMap,estiminfo,dosing,functionName) использует функцию оценки, заданную functionName. Если заданная функция недоступна, предупреждение выдано, и первая доступная функция по умолчанию используется.

пример

fitResults = sbiofit(sm,grpData,responseMap,estiminfo,dosing,functionName,options) использует дополнительные опции, заданные options для функционального functionName.

пример

fitResults = sbiofit(sm,grpData,responseMap,estiminfo,dosing,functionName,options,variants) применяет различные объекты, заданные как variants вместо того, чтобы использовать любые активные варианты модели.

пример

fitResults = sbiofit(_,Name,Value) дополнительные опции использования заданы одним или несколькими аргументами пары Name,Value.

пример

[fitResults,simdata] = sbiofit(_) также возвращается, вектор SimData возражает simdata с помощью любого из входных параметров в предыдущих синтаксисах.

Примечание

  • sbiofit объединяет sbionlinfit и функции оценки sbioparamestim. Используйте sbiofit, чтобы выполнить регрессию нелинейного метода наименьших квадратов.

  • sbiofit моделирует модель с помощью SimFunction object, который автоматически ускоряет симуляции по умолчанию. Следовательно не необходимо запустить sbioaccelerate, прежде чем вы вызовете sbiofit.

Примеры

свернуть все

Фон

Этот пример показывает, как соответствовать данным о профиле PK человека к модели с одним отсеком и оценить фармакокинетические параметры.

Предположим, что вы имеете данные о концентрации плазмы препарата от человека и хотите оценить объем центрального отсека и разрешения. Примите, что концентрация препарата по сравнению с профилем времени следует за моноэкспоненциальным снижением Ct=C0e-ket, где Ct концентрация препарата во время t, C0 начальная концентрация, и ke константа скорости устранения, которая зависит от разрешения и объема центрального отсека ke=Cl/V.

Синтетические данные в этом примере были сгенерированы с помощью следующей модели и параметров:

  • Модель с одним отсеком с болюсным введением и устранением первого порядка

  • Объем центрального отсека (Central) = 1,70 литра

  • Параметр разрешения (Cl_Central) = 0,55 литра/час

  • Постоянная ошибочная модель

Загрузите данные и визуализируйте

Данные хранятся как таблица с переменными Time и Conc, которые представляют ход времени плазменной концентрации человека после внутривенного администрирования шарика, измеренного в 13 различных моментах времени. Переменные модули для Time и Conc являются часом и миллиграммом/литр, соответственно.

clear all
load(fullfile(matlabroot,'examples','simbio','data15.mat'))
plot(data.Time,data.Conc,'b+')
xlabel('Time (hour)');
ylabel('Drug Concentration (milligram/liter)');

Преобразуйте в groupedData Формат

Преобразуйте набор данных в объект groupedData, который является необходимым форматом данных для подходящего функционального sbiofit для дальнейшего использования. Объект groupedData также позволяет вам установить независимую переменную и имена переменных группы (если они существуют). Установите модули переменных Time и Conc. Модули являются дополнительными и только необходимыми для функции UnitConversion, которая автоматически преобразовывает соответствие с физическими количествами в одну сопоставимую модульную систему.

gData = groupedData(data);
gData.Properties.VariableUnits = {'hour','milligram/liter'};
gData.Properties
ans = struct with fields:
                Description: ''
                   UserData: []
             DimensionNames: {'Row'  'Variables'}
              VariableNames: {'Time'  'Conc'}
       VariableDescriptions: {}
              VariableUnits: {'hour'  'milligram/liter'}
         VariableContinuity: []
                   RowNames: {}
           CustomProperties: [1x1 matlab.tabular.CustomProperties]
          GroupVariableName: ''
    IndependentVariableName: 'Time'

groupedData автоматически определил имя свойства IndependentVariableName к переменной Time данных.

Создайте модель с одним отсеком

Пользуйтесь встроенной библиотекой PK, чтобы создать модель с одним отсеком с болюсным введением и устранением первого порядка, где уровень устранения зависит от разрешения и объема центрального отсека. Используйте объект configset включить модульное преобразование.

pkmd                    = PKModelDesign;
pkc1                    = addCompartment(pkmd,'Central');
pkc1.DosingType         = 'Bolus';
pkc1.EliminationType    = 'linear-clearance';
pkc1.HasResponseVariable = true;
model                   = construct(pkmd);
configset               = getconfigset(model);
configset.CompileOptions.UnitConversion = true;

Для получения дополнительной информации при создании разделенных на отсеки моделей PK с помощью SimBiology® встроенная библиотека, смотрите, Создают Фармакокинетические Модели.

Задайте дозирование

Задайте одну дозу шарика 10 миллиграммов, данных во время = 0. Для получения дополнительной информации при подготовке различных расписаний дозирования, смотрите Дозы.

dose                = sbiodose('dose');
dose.TargetName     = 'Drug_Central';
dose.StartTime      = 0;
dose.Amount         = 10;
dose.AmountUnits    = 'milligram';
dose.TimeUnits      = 'hour';

Сопоставьте данные об ответе с соответствующим компонентом модели

Данные содержат данные о концентрации препарата, хранимые в переменной Conc. Эти данные соответствуют разновидностям Drug_Central в модели. Поэтому сопоставьте данные с Drug_Central можно следующим образом.

responseMap = {'Drug_Central = Conc'};

Задайте параметры, чтобы оценить

Параметры, чтобы поместиться в эту модель являются объемом центрального (Центрального) отсека и уровень раскрываемости преступлений (Cl_Central). В этом случае задайте логарифмическое преобразование для этих биологических параметров, поскольку они ограничиваются быть положительными. Объект estimatedInfo позволяет вам указать, что параметр преобразовывает, начальные значения и границы параметра в случае необходимости.

paramsToEstimate    = {'log(Central)','log(Cl_Central)'};
estimatedParams     = estimatedInfo(paramsToEstimate,'InitialValue',[1 1],'Bounds',[1 5;0.5 2]);

Оцените параметры

Теперь, когда вы задали модель с одним отсеком, данные, чтобы соответствовать, сопоставленные данные об ответе, параметры, чтобы оценить, и дозирование, используют sbiofit, чтобы оценить параметры. Функция оценки по умолчанию, которую изменит использование sbiofit, в зависимости от которого тулбоксы доступны. Чтобы видеть, какая функция использовалась во время подбора кривой, проверяйте свойство EstimationFunction соответствующего объекта результатов.

fitConst = sbiofit(model,gData,responseMap,estimatedParams,dose);

Отобразите предполагаемые параметры и постройте результаты

Заметьте, что оценки параметра не были далеки от истинных значений (1.70 и 0.55), которые использовались, чтобы сгенерировать данные. Можно также попробовать различные ошибочные модели, чтобы видеть, могли ли они далее улучшить оценки параметра.

fitConst.ParameterEstimates
ans=2×4 table
        Name        Estimate    StandardError      Bounds  
    ____________    ________    _____________    __________

    'Central'        1.6993       0.034821         1      5
    'Cl_Central'    0.53358        0.01968       0.5      2

s.Labels.XLabel     = 'Time (hour)';
s.Labels.YLabel     = 'Concentration (milligram/liter)';
plot(fitConst,'AxesStyle',s);

Используйте различные ошибочные модели

Попробуйте три других поддерживаемых ошибочных модели (пропорциональный, комбинация постоянных и пропорциональных ошибочных моделей и экспоненциал).

fitProp = sbiofit(model,gData,responseMap,estimatedParams,dose,...
                      'ErrorModel','proportional');
fitExp  = sbiofit(model,gData,responseMap,estimatedParams,dose,...
                      'ErrorModel','exponential');
fitComb = sbiofit(model,gData,responseMap,estimatedParams,dose,...
                      'ErrorModel','combined');

Используйте веса вместо ошибочной модели

Можно задать веса как числовую матрицу, где количество столбцов соответствует количеству ответов. Установка всех весов к 1 эквивалентна постоянной ошибочной модели.

weightsNumeric = ones(size(gData.Conc));
fitWeightsNumeric = sbiofit(model,gData,responseMap,estimatedParams,dose,'Weights',weightsNumeric);

Также можно использовать указатель на функцию, который принимает вектор предсказанных значений ответа и возвращает вектор весов. В этом примере используйте указатель на функцию, который эквивалентен пропорциональной ошибочной модели.

weightsFunction = @(y) 1./y.^2;
fitWeightsFunction = sbiofit(model,gData,responseMap,estimatedParams,dose,'Weights',weightsFunction);

Сравните информационные критерии образцового выбора

Сравните loglikelihood, AIC и значения BIC каждой модели, чтобы видеть, какая ошибочная модель лучше всего соответствует данным. Большее значение вероятности указывает, что соответствующая модель соответствует модели лучше. Для AIC и BIC, меньшие значения лучше.

allResults = [fitConst,fitWeightsNumeric,fitWeightsFunction,fitProp,fitExp,fitComb];
errorModelNames = {'constant error model','equal weights','proportional weights', ...
                   'proportional error model','exponential error model',...
                   'combined error model'};
LogLikelihood = [allResults.LogLikelihood]';
AIC = [allResults.AIC]';
BIC = [allResults.BIC]';
t = table(LogLikelihood,AIC,BIC);
t.Properties.RowNames = errorModelNames;
t
t=6×3 table
                                LogLikelihood      AIC        BIC  
                                _____________    _______    _______

    constant error model            3.9866       -3.9732    -2.8433
    equal weights                   3.9866       -3.9732    -2.8433
    proportional weights           -3.8472        11.694     12.824
    proportional error model       -3.8257        11.651     12.781
    exponential error model         1.1984        1.6032     2.7331
    combined error model            3.9163       -3.8326    -2.7027

На основе информационных критериев постоянная ошибочная модель (или равные веса) соответствует данным лучше всего, поскольку это имеет самое большое loglikelihood значение и самый маленький AIC и BIC.

Отобразите предполагаемые значения параметров

Покажите предполагаемые значения параметров каждой модели.

Estimated_Central       = zeros(6,1);
Estimated_Cl_Central    = zeros(6,1);
t2 = table(Estimated_Central,Estimated_Cl_Central);
t2.Properties.RowNames = errorModelNames;
for i = 1:height(t2)
    t2{i,1} = allResults(i).ParameterEstimates.Estimate(1);
    t2{i,2} = allResults(i).ParameterEstimates.Estimate(2);
end
t2
t2=6×2 table
                                Estimated_Central    Estimated_Cl_Central
                                _________________    ____________________

    constant error model             1.6993                0.53358       
    equal weights                    1.6993                0.53358       
    proportional weights             1.9045                0.51734       
    proportional error model         1.8777                0.51147       
    exponential error model          1.7872                0.51701       
    combined error model             1.7008                0.53271       

Заключение

Этот пример показал, как оценить параметры PK, а именно, объем центрального отсека и параметр разрешения человека, путем подбора кривой данным о профиле PK к модели с одним отсеком. Вы сравнили информационные критерии каждой модели и оценили, что значения параметров различных ошибочных моделей видели, какая модель лучше всего объяснила данные. Финал соответствовал результатам, предложенным обоих, которых постоянные и объединенные ошибочные модели предоставили, самые близкие оценки к значениям параметров раньше генерировали данные. Однако постоянная ошибочная модель является лучшей моделью, как обозначено loglikelihood, AIC и критериями информации о BIC.

Предположим, что у вас есть данные о концентрации плазмы препарата от трех человек, которых вы хотите использовать, чтобы оценить соответствующие фармакокинетические параметры, а именно, объем центрального и периферийного отсека (Central, Peripheral), уровень раскрываемости преступлений (Cl_Central) и межразделенное на отсеки разрешение (Q12). Примите, что концентрация препарата по сравнению с профилем времени следует за снижением biexponential Ct=Aeat+Bebt, где Ct является концентрацией препарата во время t, и a и b являются наклонами для соответствующих экспоненциальных снижений.

Синтетический набор данных содержит данные о концентрации плазмы препарата, измеренные и в центральных и в периферийных отсеках. Данные были сгенерированы с помощью модели 2D отсека с дозой вливания и устранением первого порядка. Эти параметры использовались для каждого человека.

 CentralPeripheralQ12Cl_Central
Индивидуум 11.900.680.240.57
Индивидуум 22.106.050.360.95
Индивидуум 31.704.210.460.95

Данные хранятся как таблица с переменными ID, Time, CentralConc и PeripheralConc. Это представляет ход времени плазменных концентраций, измеренных в восьми различных моментах времени и для центральных и для периферийных отсеков после дозы вливания.

clear all
load(fullfile(matlabroot,'examples','simbio','data10_32R.mat'))

Преобразуйте набор данных в объект groupedData, который является необходимым форматом данных для подходящего функционального sbiofit для дальнейшего использования. Объект groupedData также позволяет вам установить независимую переменную и имена переменных группы (если они существуют). Установите модули ID, Time, CentralConc и переменных PeripheralConc. Модули являются дополнительными и только необходимыми для функции UnitConversion, которая автоматически преобразовывает соответствие с физическими количествами в одну сопоставимую модульную систему.

gData = groupedData(data);
gData.Properties.VariableUnits = {'','hour','milligram/liter','milligram/liter'};
gData.Properties
ans = 

  struct with fields:

                Description: ''
                   UserData: []
             DimensionNames: {'Row'  'Variables'}
              VariableNames: {'ID'  'Time'  'CentralConc'  'PeripheralConc'}
       VariableDescriptions: {}
              VariableUnits: {1x4 cell}
         VariableContinuity: []
                   RowNames: {}
           CustomProperties: [1x1 matlab.tabular.CustomProperties]
          GroupVariableName: 'ID'
    IndependentVariableName: 'Time'

Создайте график решетки, который показывает профили PK трех человек.

sbiotrellis(gData,'ID','Time',{'CentralConc','PeripheralConc'},...
            'Marker','+','LineStyle','none');

Пользуйтесь встроенной библиотекой PK, чтобы создать модель 2D отсека с дозированием вливания и устранением первого порядка, где уровень устранения зависит от разрешения и объема центрального отсека. Используйте объект configset включить модульное преобразование.

pkmd                 = PKModelDesign;
pkc1                 = addCompartment(pkmd,'Central');
pkc1.DosingType      = 'Infusion';
pkc1.EliminationType = 'linear-clearance';
pkc1.HasResponseVariable = true;
pkc2                 = addCompartment(pkmd,'Peripheral');
model                = construct(pkmd);
configset            = getconfigset(model);
configset.CompileOptions.UnitConversion = true;

Примите, что каждый человек получает дозу вливания во время = 0 с общим объемом вливания 100 мг на уровне 50 мг/час. Для получения дополнительной информации при подготовке различных стратегий дозирования, смотрите Дозы.

dose             = sbiodose('dose','TargetName','Drug_Central');
dose.StartTime   = 0;
dose.Amount      = 100;
dose.Rate        = 50;
dose.AmountUnits = 'milligram';
dose.TimeUnits   = 'hour';
dose.RateUnits   = 'milligram/hour';

Данные содержат измеренные плазменные концентрации в центральных и периферийных отсеках. Сопоставьте эти переменные с соответствующими образцовыми разновидностями, которые являются Drug_Central и Drug_Peripheral.

responseMap = {'Drug_Central = CentralConc','Drug_Peripheral = PeripheralConc'};

Параметры, чтобы оценить в этой модели являются объемами центральных и периферийных отсеков (Central и Peripheral), межразделенное на отсеки разрешение Q12 и уровень раскрываемости преступлений Cl_Central. В этом случае задайте логарифмическое преобразование для Central и Peripheral, поскольку они ограничиваются быть положительными. Объект estimatedInfo позволяет вам указать, что параметр преобразовывает, начальные значения и (дополнительные) границы параметра.

paramsToEstimate   = {'log(Central)','log(Peripheral)','Q12','Cl_Central'};
estimatedParam     = estimatedInfo(paramsToEstimate,'InitialValue',[1 1 1 1]);

Соответствуйте модели ко всем данным, объединенным вместе, то есть, оцените один набор параметров для всех людей. Метод оценки по умолчанию, который изменит использование sbiofit, в зависимости от которого тулбоксы доступны. Чтобы видеть который функция оценки sbiofit, используемый для подбора кривой, проверяйте свойство EstimationFunction соответствующего объекта результатов.

pooledFit = sbiofit(model,gData,responseMap,estimatedParam,dose,'Pooled',true)
pooledFit = 

  OptimResults with properties:

                   ExitFlag: 3
                     Output: [1x1 struct]
                  GroupName: []
                       Beta: [4x3 table]
         ParameterEstimates: [4x3 table]
                          J: [24x4x2 double]
                       COVB: [4x4 double]
           CovarianceMatrix: [4x4 double]
                          R: [24x2 double]
                        MSE: 6.6220
                        SSE: 291.3688
                    Weights: []
              LogLikelihood: -111.3904
                        AIC: 230.7808
                        BIC: 238.2656
                        DFE: 44
             DependentFiles: {1x3 cell}
    EstimatedParameterNames: {'Central'  'Peripheral'  'Q12'  'Cl_Central'}
             ErrorModelInfo: [1x3 table]
         EstimationFunction: 'lsqnonlin'

Постройте подходящие результаты по сравнению с исходными данными. Несмотря на то, что три отдельных графика были сгенерированы, данные были адаптированы с помощью того же набора параметров (то есть, у всех трех человек была та же подходящая строка).

plot(pooledFit);

Оцените один набор параметров для каждого человека и смотрите, существует ли какое-либо улучшение оценок параметра. В этом примере с тех пор существует три человека, три набора параметров оцениваются.

unpooledFit =  sbiofit(model,gData,responseMap,estimatedParam,dose,'Pooled',false);

Постройте подходящие результаты по сравнению с исходными данными. Каждый человек был адаптирован по-другому (то есть, каждая подходящая строка уникальна для каждого человека), и каждая строка, казалось, соответствовала хорошо к отдельным данным.

plot(unpooledFit);

Отобразите подходящие результаты первого человека. MSE был ниже, чем та из объединенной подгонки. Это также верно для других двух человек.

unpooledFit(1)
ans = 

  OptimResults with properties:

                   ExitFlag: 3
                     Output: [1x1 struct]
                  GroupName: 1
                       Beta: [4x3 table]
         ParameterEstimates: [4x3 table]
                          J: [8x4x2 double]
                       COVB: [4x4 double]
           CovarianceMatrix: [4x4 double]
                          R: [8x2 double]
                        MSE: 2.1380
                        SSE: 25.6559
                    Weights: []
              LogLikelihood: -26.4805
                        AIC: 60.9610
                        BIC: 64.0514
                        DFE: 12
             DependentFiles: {1x3 cell}
    EstimatedParameterNames: {'Central'  'Peripheral'  'Q12'  'Cl_Central'}
             ErrorModelInfo: [1x3 table]
         EstimationFunction: 'lsqnonlin'

Сгенерируйте график невязок в зависимости от времени, чтобы сравнить объединенные и необъединенные результаты подгонки. Фигура указывает, что необъединенные подходящие невязки меньше, чем те из объединенной подгонки как ожидалось. В дополнение к сравнению невязок другие строгие критерии могут использоваться, чтобы сравнить подходящие результаты.

t = [gData.Time;gData.Time];
res_pooled = vertcat(pooledFit.R);
res_pooled = res_pooled(:);
res_unpooled = vertcat(unpooledFit.R);
res_unpooled = res_unpooled(:);
plot(t,res_pooled,'o','MarkerFaceColor','w','markerEdgeColor','b')
hold on
plot(t,res_unpooled,'o','MarkerFaceColor','b','markerEdgeColor','b')
refl = refline(0,0); % A reference line representing a zero residual
title('Residuals versus Time');
xlabel('Time');
ylabel('Residuals');
legend({'Pooled','Unpooled'});

Этот пример показал, как выполнить объединенные и необъединенные оценки с помощью sbiofit. Как проиллюстрировано, необъединенная подгонка составляет изменения из-за определенных предметов в исследовании, и, в этом случае, модель соответствует лучше к данным. Однако объединенная подгонка возвращает параметры всей генеральной совокупности. Если вы хотите оценить параметры всей генеральной совокупности при рассмотрении отдельных изменений используйте sbiofitmixed.

Этот пример показывает, как оценить специфичный для категории (такой как молодой по сравнению со старым, штекерным по сравнению с розеткой), отдельно-специфичные, и параметры всей генеральной совокупности с помощью данных о профиле PK от нескольких человек.

Фон

Предположим, что вы имеете данные о концентрации плазмы препарата от 30 человек и хотите оценить фармакокинетические параметры, а именно, объемы центрального и периферийного отсека, разрешения и межразделенного на отсеки разрешения. Примите, что концентрация препарата по сравнению с профилем времени следует за снижением biexponential Ct=Ae-at+Be-bt, где Ct концентрация препарата во время t, и a и b наклоны для соответствующих экспоненциальных снижений.

Загрузка данных

Эти синтетические данные содержат ход времени плазменных концентраций 30 человек после дозы шарика (100 мг), измеренных в разное время и для центральных и для периферийных отсеков. Это также содержит категориальные переменные, а именно, Sex и Age.

clear
load(fullfile(matlabroot,'examples','simbio','sd5_302RAgeSex.mat'))

Преобразуйте в groupedData Формат

Преобразуйте набор данных в объект groupedData, который является необходимым форматом данных для подходящего функционального sbiofit. Объект groupedData также позволяет вам независимую переменную набора и имена переменных группы (если они существуют). Установите модули ID, Time, CentralConc, PeripheralConc, Age и переменных Sex. Модули являются дополнительными и только необходимыми для функции UnitConversion, которая автоматически преобразовывает соответствие с физическими количествами в одну сопоставимую модульную систему.

gData = groupedData(data);
gData.Properties.VariableUnits = {'','hour','milligram/liter','milligram/liter','',''};
gData.Properties
ans = struct with fields:
                Description: ''
                   UserData: []
             DimensionNames: {'Row'  'Variables'}
              VariableNames: {1x6 cell}
       VariableDescriptions: {}
              VariableUnits: {1x6 cell}
         VariableContinuity: []
                   RowNames: {}
           CustomProperties: [1x1 matlab.tabular.CustomProperties]
          GroupVariableName: 'ID'
    IndependentVariableName: 'Time'

Свойства IndependentVariableName и GroupVariableName были автоматически установлены в переменные Time и ID данных.

Визуализируйте данные

Отобразите данные об ответе для каждого человека.

t = sbiotrellis(gData,'ID','Time',{'CentralConc','PeripheralConc'},...
                'Marker','+','LineStyle','none');
% Resize the figure.
t.hFig.Position(:) = [100 100 1280 800];

Настройте модель 2D отсека

Пользуйтесь встроенной библиотекой PK, чтобы создать модель 2D отсека с дозированием вливания и устранением первого порядка, где уровень устранения зависит от разрешения и объема центрального отсека. Используйте объект configset включить модульное преобразование.

pkmd                                    = PKModelDesign;
pkc1                                    = addCompartment(pkmd,'Central');
pkc1.DosingType                         = 'Bolus';
pkc1.EliminationType                    = 'linear-clearance';
pkc1.HasResponseVariable                = true;
pkc2                                    = addCompartment(pkmd,'Peripheral');
model                                   = construct(pkmd);
configset                               = getconfigset(model);
configset.CompileOptions.UnitConversion = true;

Для получения дополнительной информации при создании разделенных на отсеки моделей PK с помощью SimBiology® встроенная библиотека, смотрите, Создают Фармакокинетические Модели.

Задайте дозирование

Примите, что каждый человек получает дозу шарика 100 мг во время = 0. Для получения дополнительной информации при подготовке различных стратегий дозирования, смотрите Дозы.

dose             = sbiodose('dose','TargetName','Drug_Central');
dose.StartTime   = 0;
dose.Amount      = 100;
dose.AmountUnits = 'milligram';
dose.TimeUnits   = 'hour';

Сопоставьте данные об ответе с соответствующими компонентами модели

Данные содержат измеренную плазменную концентрацию в центральных и периферийных отсеках. Сопоставьте эти переменные с соответствующими компонентами модели, которые являются Drug_Central и Drug_Peripheral.

responseMap = {'Drug_Central = CentralConc','Drug_Peripheral = PeripheralConc'};

Задайте параметры, чтобы оценить

Задайте объемы центральных и периферийных отсеков Central и Peripheral, межразделенное на отсеки разрешение Q12 и разрешение Cl_Central как параметры, чтобы оценить. Объект estimatedInfo позволяет вам опционально указать, что параметр преобразовывает, начальные значения и границы параметра. И начиная с Central и начиная с Peripheral ограничиваются быть положительными, задать логарифмическое преобразование для каждого параметра.

paramsToEstimate    = {'log(Central)', 'log(Peripheral)', 'Q12', 'Cl_Central'};
estimatedParam      = estimatedInfo(paramsToEstimate,'InitialValue',[1 1 1 1]);

Оцените отдельно-специфичные параметры

Оцените один набор параметров для каждого человека путем установки аргумента пары "имя-значение" 'Pooled' false.

unpooledFit =  sbiofit(model,gData,responseMap,estimatedParam,dose,'Pooled',false);

Отображение результатов

Постройте подходящие результаты по сравнению с исходными данными для каждого человека (группа).

t = plot(unpooledFit);
% Resize the figure.
t.hFig.Position(:) = [100 100 1280 800];

Для необъединенной подгонки всегда возвращается sbiofit, каждый заканчивается объект для каждого человека.

Исследуйте оценки параметра на зависимости от категории

Исследуйте необъединенные оценки, чтобы видеть, существуют ли какие-либо специфичные для категории параметры, то есть, если некоторые параметры связаны с одной или несколькими категориями. Если существуют какие-либо зависимости от категории, может быть возможно уменьшать количество степеней свободы путем оценки только специфичных для категории значений для тех параметров.

Сначала извлеките ID и значения категории для каждого ID

catParamValues = unique(gData(:,{'ID','Sex','Age'}));

Добавьте переменные в таблицу, содержащую оценку каждого параметра.

allParamValues            = vertcat(unpooledFit.ParameterEstimates);
catParamValues.Central    = allParamValues.Estimate(strcmp(allParamValues.Name, 'Central'));
catParamValues.Peripheral = allParamValues.Estimate(strcmp(allParamValues.Name, 'Peripheral'));
catParamValues.Q12        = allParamValues.Estimate(strcmp(allParamValues.Name, 'Q12'));
catParamValues.Cl_Central = allParamValues.Estimate(strcmp(allParamValues.Name, 'Cl_Central'));

Постройте оценки каждого параметра для каждой категории. gscatter требует Statistics and Machine Learning Toolbox™. Если у вас нет его, используйте другие альтернативные функции построения графика, такие как plot.

h           = figure;
ylabels     = {'Central','Peripheral','Cl\_Central','Q12'};
plotNumber  = 1;
for i = 1:4
    thisParam = estimatedParam(i).Name;
    
    % Plot for Sex category
    subplot(4,2,plotNumber);
    plotNumber  = plotNumber + 1;
    gscatter(double(catParamValues.Sex), catParamValues.(thisParam), catParamValues.Sex);
    ax          = gca;
    ax.XTick    = [];
    ylabel(ylabels(i));
    legend('Location','bestoutside')
    % Plot for Age category
    subplot(4,2,plotNumber);
    plotNumber  = plotNumber + 1;
    gscatter(double(catParamValues.Age), catParamValues.(thisParam), catParamValues.Age);
    ax          = gca;
    ax.XTick    = [];
    ylabel(ylabels(i));
    legend('Location','bestoutside')
end
% Resize the figure.
h.Position(:) = [100 100 1280 800];

На основе графика кажется, что молодые люди склонны иметь более высокие объемы центральных и периферийных отсеков (Central, Peripheral), чем старые люди (то есть, объемы, кажется, являются возрастными). Кроме того, штекеры имеют тенденцию иметь более низкий уровень раскрываемости преступлений (Cl_Central), чем розетки, но противоположное для параметра Q12 (то есть, разрешение и Q12, кажется, сексуально-специфичны).

Оцените специфичные для категории параметры

Используйте свойство 'CategoryVariableName' объекта estimatedInfo задать который категория использовать во время подбора кривой. Используйте 'Sex' в качестве группы к пригодному для разрешения параметры Q12 и Cl_Central. Используйте 'Age' в качестве группы к пригодному для параметров Peripheral и Central.

estimatedParam(1).CategoryVariableName = 'Age';
estimatedParam(2).CategoryVariableName = 'Age';
estimatedParam(3).CategoryVariableName = 'Sex';
estimatedParam(4).CategoryVariableName = 'Sex';
categoryFit = sbiofit(model,gData,responseMap,estimatedParam,dose)
categoryFit = 
  OptimResults with properties:

                   ExitFlag: 3
                     Output: [1x1 struct]
                  GroupName: []
                       Beta: [8x5 table]
         ParameterEstimates: [120x6 table]
                          J: [240x8x2 double]
                       COVB: [8x8 double]
           CovarianceMatrix: [8x8 double]
                          R: [240x2 double]
                        MSE: 0.4362
                        SSE: 205.8690
                    Weights: []
              LogLikelihood: -477.9195
                        AIC: 971.8390
                        BIC: 1.0052e+03
                        DFE: 472
             DependentFiles: {1x3 cell}
    EstimatedParameterNames: {'Central'  'Peripheral'  'Q12'  'Cl_Central'}
             ErrorModelInfo: [1x3 table]
         EstimationFunction: 'lsqnonlin'

При подборе кривой по категориям (или группа), всегда возвращается sbiofit, каждый заканчивается объект, не один для каждого уровня категории. Это вызвано тем, что и штекерные и розеточные люди считаются частью той же оптимизации с помощью тех же ошибочных параметров модели и параметров ошибок, так же для молодых и старых людей.

Постройте результаты

Постройте специфичные для категории предполагаемые результаты.

t = plot(categoryFit);
% Resize the figure.
t.hFig.Position(:) = [100 100 1280 800];

Для Cl_Central и параметров Q12, все штекеры имели те же оценки, и так же для розеток. Для Central и параметров Peripheral, у всех молодых людей были те же оценки, и так же для старых людей.

Оцените параметры всей генеральной совокупности

Чтобы лучше сравнить результаты, соответствуйте модели ко всем данным, объединенным вместе, то есть, оцените один набор параметров для всех людей путем установки аргумента пары "имя-значение" 'Pooled' true. Предупреждающее сообщение говорит вам, что эта опция проигнорирует любую специфичную для категории информацию (если они будут существовать).

pooledFit = sbiofit(model,gData,responseMap,estimatedParam,dose,'Pooled',true);
Warning: CategoryVariableName property of the estimatedInfo object is ignored when using the 'Pooled' option.

Постройте результаты

Постройте подходящие результаты по сравнению с исходными данными. Несмотря на то, что отдельный график был сгенерирован для каждого человека, данные были адаптированы с помощью того же набора параметров (то есть, у всех людей была та же подходящая строка).

t = plot(pooledFit);
% Resize the figure.
t.hFig.Position(:) = [100 100 1280 800];

Сравните невязки

Сравните невязки CentralConc и ответов PeripheralConc для каждой подгонки.

t = gData.Time;
allResid(:,:,1) = pooledFit.R;
allResid(:,:,2) = categoryFit.R;
allResid(:,:,3) = vertcat(unpooledFit.R);

h = figure;
responseList = {'CentralConc', 'PeripheralConc'};
for i = 1:2
    subplot(2,1,i);
    oneResid = squeeze(allResid(:,i,:));
    plot(t,oneResid,'o');
    refline(0,0); % A reference line representing a zero residual
    title(sprintf('Residuals (%s)', responseList{i}));
    xlabel('Time');
    ylabel('Residuals');
    legend({'Pooled','Category-Specific','Unpooled'});
end
% Resize the figure.
h.Position(:) = [100 100 1280 800];

Как показано в графике, необъединенная подгонка произвела лучшую подгонку к данным, когда это соответствует данным к каждому человеку. Это ожидалось, поскольку это использовало большую часть количества степеней свободы. Подгонка категории уменьшала количество степеней свободы подгонкой данных к двум категориям (пол и возраст). В результате невязки были больше, чем необъединенная подгонка, но еще меньшими, чем подгонка генеральной совокупности, которая оценила всего один набор параметров для всех людей. Подходящая категорией сила быть хорошим компромиссом между необъединенным и объединенным подбором кривой при условии, что любая иерархическая модель существует в ваших данных.

Этот пример использует дрожжи гетеротримерные данные модели белка G и экспериментальные данные, о которых сообщают [1]. Для получения дополнительной информации о модели, смотрите раздел Background в Сканировании Параметра, Оценке Параметра и Анализе чувствительности в Дрожжах Гетеротримерный Цикл Белка G.

Загрузите модель белка G.

sbioloadproject gprotein

Храните экспериментальные данные, содержащие курс времени для части активного белка G.

time = [0 10 30 60 110 210 300 450 600]';
GaFracExpt = [0 0.35 0.4 0.36 0.39 0.33 0.24 0.17 0.2]';

Создайте groupedData, основанный на объектах на экспериментальных данных.

tbl = table(time,GaFracExpt);
grpData = groupedData(tbl);

Сопоставьте соответствующий компонент модели с экспериментальными данными. Другими словами, укажите, которому разновидность в модели соответствует который переменная отклика в данных. В этом примере сопоставьте параметр модели GaFrac с переменной GaFracExpt экспериментальных данных из grpData.

responseMap = 'GaFrac = GaFracExpt';

Используйте объект estimatedInfo задать параметр модели kGd в качестве параметра, чтобы быть оцененными.

estimatedParam = estimatedInfo('kGd');

Выполните оценку параметра.

fitResult = sbiofit(m1,grpData,responseMap,estimatedParam);

Просмотрите предполагаемое значение параметров kGd.

fitResult.ParameterEstimates
ans=1×3 table
    Name     Estimate    StandardError
    _____    ________    _____________

    'kGd'    0.11307      3.4439e-05  

Предположим, что вы хотите построить результаты симуляции модели с помощью предполагаемого значения параметров. Можно или повторно выполнить функцию sbiofit и задать, чтобы возвратить дополнительный второй выходной аргумент, который содержит результаты симуляции, или используйте метод fitted, чтобы получить результаты, не повторно выполняя sbiofit.

[yfit,paramEstim] = fitted(fitResult);

Постройте результаты симуляции.

sbioplot(yfit);

Этот пример показывает, как оценить задержку, прежде чем доза шарика была введена и длительность дозы с помощью модели с одним отсеком.

Загрузите набор выборочных данных.

load lagDurationData.mat

Отобразите данные на графике.

plot(data.Time,data.Conc,'x')
xlabel('Time (hour)')
ylabel('Conc (milligram/liter)')

Преобразуйте в groupedData.

gData = groupedData(data);
gData.Properties.VariableUnits = {'hour','milligram/liter'};

Создайте модель с одним отсеком.

pkmd                    = PKModelDesign;
pkc1                    = addCompartment(pkmd,'Central');
pkc1.DosingType         = 'Bolus';
pkc1.EliminationType    = 'linear-clearance';
pkc1.HasResponseVariable = true;
model                   = construct(pkmd);
configset               = getconfigset(model);
configset.CompileOptions.UnitConversion = true;

Добавьте два параметра, которые представляют задержку и длительность дозы. Параметр задержки задает задержку, прежде чем доза будет введена. Параметр длительности задает отрезок времени, который требуется, чтобы ввести дозу.

lagP = addparameter(model,'lagP');
lagP.ValueUnits = 'hour';
durP = addparameter(model,'durP');
durP.ValueUnits = 'hour';

Создайте объект дозы. Установите свойства LagParameterName и DurationParameterName дозы к именам параметров задержки и длительности, соответственно.

dose                = sbiodose('dose');
dose.TargetName     = 'Drug_Central';
dose.StartTime      = 0;
dose.Amount         = 10;
dose.AmountUnits    = 'milligram';
dose.TimeUnits      = 'hour';
dose.LagParameterName = 'lagP';
dose.DurationParameterName = 'durP';

Сопоставьте образцовые разновидности с соответствующими данными.

responseMap = {'Drug_Central = Conc'};

Задайте параметры задержки и длительности как параметры, чтобы оценить. Логарифмическое преобразование параметры. Инициализируйте их к 2 и установите верхнюю границу и нижнюю границу.

paramsToEstimate    = {'log(lagP)','log(durP)'};
estimatedParams     = estimatedInfo(paramsToEstimate,'InitialValue',2,'Bounds',[1 5]);

Выполните оценку параметра.

fitResults = sbiofit(model,gData,responseMap,estimatedParams,dose,'fminsearch')
fitResults = 
  OptimResults with properties:

                   ExitFlag: 1
                     Output: [1x1 struct]
                  GroupName: One group
                       Beta: [2x4 table]
         ParameterEstimates: [2x4 table]
                          J: [11x2 double]
                       COVB: [2x2 double]
           CovarianceMatrix: [2x2 double]
                          R: [11x1 double]
                        MSE: 0.0024
                        SSE: 0.0213
                    Weights: []
              LogLikelihood: 18.7511
                        AIC: -33.5023
                        BIC: -32.7065
                        DFE: 9
             DependentFiles: {1x2 cell}
    EstimatedParameterNames: {'lagP'  'durP'}
             ErrorModelInfo: [1x3 table]
         EstimationFunction: 'fminsearch'

Отобразите результат.

fitResults.ParameterEstimates
ans=2×4 table
     Name     Estimate    StandardError    Bounds
    ______    ________    _____________    ______

    'lagP'     1.986        0.0051568      1    5
    'durP'     1.527         0.012956      1    5

plot(fitResults)

Входные параметры

свернуть все

Модель SimBiology, заданная как model object SimBiology. Активный configset object модели содержит настройки решателя для симуляции. Любые активные дозы и варианты применяются к модели во время симуляции, если не задано в противном случае с помощью dosing и входных параметров variants, соответственно.

Данные, чтобы соответствовать, заданный как groupedData object.

Имя переменной времени должно быть задано в свойстве IndependentVariableName grpData. Например, если именем переменной времени является 'TIME', то задайте его можно следующим образом.

grpData.Properties.IndependentVariableName = 'TIME';

Если данные содержат больше чем одну группу измерений, имя группирующей переменной должно быть задано в свойстве GroupVariableName grpData. Например, если именем группирующей переменной является 'GROUP', то задайте его можно следующим образом.

grpData.Properties.GroupVariableName = 'GROUP';
Группа обычно обращается к набору измерений, которые представляют один курс времени, часто соответствуя конкретному человеку или экспериментальному условию.

Примечание

sbiofit использует функцию categorical, чтобы идентифицировать группы. Если какие-либо значения группы преобразованы в то же значение categorical, то те наблюдения обработаны как принадлежащий той же группе. Например, если некоторые наблюдения не имеют никакой информации о группе (то есть, пустой символьный вектор ''), то categorical преобразовывает пустые символьные вектора в <undefined>, и эти наблюдения обработаны как одна группа.

Отображение информации компонентов модели к grpData, заданному как вектор символов, строка, представляет в виде строки вектор или массив ячеек из символьных векторов.

Каждый вектор символов или строка являются подобным уравнению выражением, подобным правилам присвоения в SimBiology. Это содержит имя (или полностью определенное имя) количества (разновидности, отсек или параметр) в модели sm, сопровождаемой символьным '=' и именем переменной в grpData. Для ясности пробелы позволены между именами и '='.

Например, если у вас есть данные о концентрации 'CONC' в grpData для разновидности 'Drug_Central', можно задать его можно следующим образом.

responseMap = 'Drug_Central = CONC';

Чтобы назвать разновидность однозначно, используйте полностью определенное имя, которое включает имя отсека. Чтобы назвать ограниченный по объему реакцией параметр, используйте имя реакции, чтобы квалифицировать параметр. Если имя не является допустимым именем переменной MATLAB®, окружите его квадратными скобками, такими как [reaction 1].[parameter 1].

Ошибка выпущена, если какое-либо (квалифицированное) имя совпадает с двумя компонентами того же типа. Однако можно использовать (квалифицированное) имя, которое совпадает с двумя компонентами различных типов, и функция сначала находит разновидности с именем, сопровождаемым отсеками и затем параметрами.

Предполагаемые параметры, заданные как estimatedInfo object или вектор объектов estimatedInfo, который задает предполагаемые параметры в модели sm и другую дополнительную информацию, такие как их первоначальные оценки, преобразования, связали ограничения и категории. Поддерживаемыми преобразованиями является log, logit и probit.

Можно задать границы для всех методов оценки. Нижняя граница должна быть меньше, чем верхняя граница. Для получения дополнительной информации см. boundValues.

При использовании scattersearch необходимо задать конечные преобразованные границы для каждого предполагаемого параметра.

При использовании fminsearch, nlinfit или fminunc с границами, целевая функция возвращает Inf, если границы превышены. Когда вы включаете опции, такие как FunValCheck, оптимизация может ошибка, если границы превышены во время оценки. При использовании nlinfit это может сообщить о предупреждениях о якобиане, являющемся плохо обусловленным или не бывшем способном оценивать, слишком близок ли конечный результат к границам.

Если вы не задаете аргумент пары "имя-значение" Pooled, sbiofit использует свойство CategoryVariableName estiminfo решить, должны ли параметры быть оценены для каждого человека, группы, категории или всех людей в целом. Используйте опцию Pooled, чтобы заменить любые значения CategoryVariableName. Для получения дополнительной информации о свойстве CategoryVariableName, смотрите estimatedInfo object.

Примечание

sbiofit использует функцию categorical, чтобы идентифицировать группы или категории. Если какие-либо значения группы преобразованы в то же значение categorical, то те наблюдения обработаны как принадлежащий той же группе. Например, если некоторые наблюдения не имеют никакой информации о группе (то есть, пустой символьный вектор '' как значение группы), то categorical преобразовывает пустые символьные вектора в <undefined>, и эти наблюдения обработаны как одна группа.

Дозирование информации, указанной как пустой массив или 2D матрица объектов дозы (ScheduleDose object или RepeatDose object).

  • Если пустой, никакие дозы не применяются во время симуляции, даже если модель имеет активные дозы.

  • Если не пустой, матрица должна иметь одну строку или одну строку на группу во входных данных. Если это имеет одну строку, те же дозы применяются ко всем группам во время симуляции. Если это имеет несколько строк, каждая строка применяется к отдельной группе в том же порядке, как группы появляются во входных данных.

  • Несколько столбцов позволены так, чтобы можно было применить несколько объектов дозы к каждой группе. Все дозы в столбце должны сослаться на те же компоненты в модели. Например, дозы в том же столбце должны иметь ту же цель дозы (TargetName). Если вы параметризовали какое-либо свойство дозы, то всем дозам в рамках столбца нужно было параметризовать это свойство к тому же параметру. Если некоторые группы требуют большего количества доз, чем другие, то заполняют матрицу с (фиктивными) дозами по умолчанию.

  • Доза по умолчанию имеет значения по умолчанию для всех свойств, за исключением свойства Name. Создайте дозу по умолчанию можно следующим образом.

    d1 = sbiodose('d1');

  • В дополнение к ручному построению объектов дозы с помощью sbiodose, если grpData имеет информацию о дозировании, можно использовать метод createDoses, чтобы создать дозы.

Имя функции оценки, заданное как вектор символов или строка. Выбор следующие.

  • 'fminsearch'

  • 'nlinfit' (Statistics and Machine Learning Toolbox требуется.)

  • 'fminunc' (Optimization Toolbox требуется.)

  • 'fmincon' (Optimization Toolbox требуется.)

  • 'lsqcurvefit' (Optimization Toolbox требуется.)

  • 'lsqnonlin' (Optimization Toolbox требуется.)

  • 'patternsearch' (Global Optimization Toolbox требуется.)

  • 'ga' (Global Optimization Toolbox требуется.)

  • 'particleswarm' (Global Optimization Toolbox требуется.)

  • 'scattersearch'

По умолчанию sbiofit использует первую доступную функцию оценки среди следующего: lsqnonlin, nlinfit или fminsearch. Тот же приоритет применяется к локальному выбору решателя по умолчанию за scattersearch.

Для сводных данных поддерживаемых методов и подходящих опций, см. Поддерживаемые Методы для Оценки Параметра.

Опции, характерные для функции оценки, заданной как struct или объект optimoptions.

  • Struct statset для nlinfit

  • Struct optimset для fminsearch

  • Объект optimoptions для lsqcurvefit, lsqnonlin, fmincon, fminunc, particleswarm, ga и patternsearch

  • struct для scattersearch

Смотрите Опции по умолчанию для Алгоритмов Оценки для получения дополнительной информации и опции по умолчанию, сопоставленные с каждой функцией оценки.

Варианты, заданные как пустой массив или вектор различных объектов. Если пустой, никакие варианты не используются, даже если модель имеет активные варианты.

Аргументы в виде пар имя-значение

Укажите необязательные аргументы в виде пар ""имя, значение"", разделенных запятыми. Имя (Name) — это имя аргумента, а значение (Value) — соответствующее значение. Name должен появиться в кавычках. Вы можете задать несколько аргументов в виде пар имен и значений в любом порядке, например: Name1, Value1, ..., NameN, ValueN.

Пример: 'ErrorModel','constant','UseParallel',true задает постоянную ошибочную модель и запускать симуляции параллельно во время оценки параметра.

Ошибочные модели, используемые для оценки, заданной как вектор символов, строка, представляют в виде строки вектор, массив ячеек из символьных векторов, категориальный вектор или таблицу.

Если это - таблица, это должно содержать одну переменную, которая является вектор-столбцом ошибочных имен модели. Имена могут быть массивом ячеек из символьных векторов, вектором строки или вектором категориальных переменных. Если таблица имеет больше чем одну строку, то свойство RowNames должно совпадать с именами переменной отклика, заданными в правой стороне responseMap. Если таблица не использует свойство RowNames, n th ошибка сопоставлен с n th ответ.

Если вы задаете только одну ошибочную модель, то sbiofit оценивает один набор параметров ошибок для всех ответов.

Если вы задаете несколько ошибочных моделей с помощью категориального вектора, вектора строки, или массив ячеек из символьных векторов, длина векторного массива или массива ячеек должна совпадать с количеством ответов в аргументе responseMap.

Можно задать несколько ошибочных моделей, только если вы используете эти методы: lsqnonlin, lsqcurvefit, fmincon, fminunc, fminsearch, patternsearch, ga и particleswarm.

Существует четыре встроенных ошибочных модели. Каждая модель задает ошибку стандартный средний нуль и переменная (Gaussian) модульного отклонения e, результаты симуляции f и один или два параметра a и b.

  • 'constant': y=f+ae

  • 'proportional': y=f+b|f|e

  • 'combined': y=f+(a+b|f|)e

  • 'exponential': y=fexp(ae)

Примечание

Если вы задаете ошибочную модель, вы не можете задать веса за исключением постоянной ошибочной модели.

Веса использовали для оценки, заданной как матрица действительных положительных весов, где количество столбцов соответствует количеству ответов или указателю на функцию, который принимает вектор предсказанных значений ответа и возвращает вектор действительных положительных весов.

Если вы задаете ошибочную модель, вы не можете использовать веса за исключением постоянной ошибочной модели. Если ни один, 'ErrorModel' или 'Weights' заданы, по умолчанию функция, не использует постоянную ошибочную модель с равными весами.

Подходящий флаг опции, задавая, соответствовать ли каждому человеку (false) или объединить все отдельные данные (true).

То, когда true, функция выполняет подхождение всем людям или группам, одновременно использующим те же оценки параметра, и fitResults является скаляром, заканчивается объект.

Когда false, функция соответствует каждой группе или человеку, отдельно использующему группу - или отдельно-специфичные параметры, и fitResults является вектором объектов результатов с одним результатом для каждой группы.

Примечание

Используйте эту опцию, чтобы заменить любые значения CategoryVariableName estiminfo.

Отметьте, чтобы включить распараллеливание, заданное как true или false. Если true и Parallel Computing Toolbox™ доступны, sbiofit поддерживает несколько уровней распараллеливания, но только один уровень используется за один раз.

Для необъединенной подгонки ('Pooled' = false) для нескольких групп, каждая подгонка запущена параллельно.

Для объединенной подгонки ('Pooled' = true), распараллеливание происходит на уровне решателя. Другими словами, вычисления решателя, такие как оценки целевой функции, запущены параллельно. Для получения дополнительной информации смотрите Несколько Оценок Параметра параллельно.

Отметьте, чтобы использовать чувствительность параметра, чтобы определить градиенты целевой функции, заданной как true или false. По умолчанию это - true для fmincon, fminunc, lsqnonlin и методов lsqcurvefit. В противном случае это - false. Если это верно, SimBiology всегда использует решатель sundials, независимо от того, что вы выбрали как свойство SolverType в объекте Configset.

SimBiology использует метод приближения комплексного шага, чтобы вычислить чувствительность параметра. Такая расчетная чувствительность может использоваться, чтобы определить градиенты целевой функции во время оценки параметра, чтобы улучшить подбор кривой. Поведение по умолчанию sbiofit должно использовать такую чувствительность, чтобы определить градиенты каждый раз, когда алгоритм основан на градиенте и если модель SimBiology® поддерживает анализ чувствительности. Для получения дополнительной информации об образцовых требованиях и анализе чувствительности, смотрите Вычисление Чувствительности.

Отметьте, чтобы показать прогресс оценки параметра, заданной как true или false. Если true, новая фигура открывается содержащий графики, которые показывают логарифмическую вероятность, критерии завершения и оцененные параметры для каждой итерации. Эта опция не поддержана для метода nlinfit.

Если вы используете функции Optimization Toolbox (fminunc, fmincon, lsqcurvefit, lsqnonlin), данные также показывают Оптимальность Первого порядка (Optimization Toolbox) график.

Для необъединенной подгонки каждая строка на графиках представляет человека. Для объединенной подгонки одна строка представляет всех людей. Строка становится увядшей, когда подгонка завершена. Графики также отслеживают прогресс, когда вы запускаете sbiofit (и для объединенных и для необъединенных подгонок) в параллельных использующих удаленных кластерах. Для получения дополнительной информации см. График Прогресса.

Выходные аргументы

свернуть все

Результаты оценки, возвращенные как OptimResults object или NLINResults object или вектор этих объектов. Оба объекта результатов являются подклассами LeastSquaresResults object.

Если функция использует nlinfit, то fitResults является NLINResults object. В противном случае fitResults является OptimResults object.

Когда 'Pooled' установлен в false, функция соответствует каждой группе, отдельно использующей специфичные для группы параметры, и fitResults является вектором объектов результатов с, каждый заканчивается объект для каждой группы.

То, когда 'Pooled' установлен в true, функция выполняет подхождение всем людям или группам, одновременно использующим те же оценки параметра, и fitResults является скаляром, заканчивается объект.

Когда 'Pooled' не используется, и значениями CategoryVariableName estiminfo является весь <none>, fitResults является одним объектом результата. Это - то же поведение как установка 'Pooled' к true.

Когда 'Pooled' не используется, и значениями CategoryVariableName estiminfo является весь <GroupVariableName>, fitResults является вектором объектов результатов. Это - то же поведение как установка 'Pooled' к false.

Во всех других случаях fitResults является скалярным объектом, содержащим оцененные значения параметров для различных групп или категорий, заданных CategoryVariableName.

Результаты симуляции, возвращенные как вектор объектов SimData, представляющих результаты симуляции для каждой группы или человека.

Если опцией 'Pooled' является false, то каждая симуляция использует специфичные для группы значения параметров. Если true, то все симуляции используют те же значения параметров (всей генеральной совокупности).

Состояния, о которых сообщают в simdata, являются состояниями, которые были включены во входной параметр responseMap и любые другие состояния, перечисленные в свойстве StatesToLog опций во время выполнения (RuntimeOptions) модели SimBiology sm.

Больше о

свернуть все

Оценка наибольшего правдоподобия

SimBiology оценивает параметры методом наибольшего правдоподобия. Вместо того, чтобы непосредственно максимизировать функцию правдоподобия, SimBiology создает эквивалентную проблему минимизации. Каждый раз, когда возможно, оценка формулируется как оптимизация метода взвешенных наименьших квадратов (WLS), которая минимизирует сумму квадратов взвешенных невязок. В противном случае оценка формулируется как минимизация отрицания логарифма вероятности (NLL). Формулировка WLS часто сходится лучше, чем формулировка NLL, и SimBiology может использовать в своих интересах специализированные алгоритмы WLS, такие как алгоритм Levenberg-Marquardt, реализованный в lsqnonlin и lsqcurvefit. SimBiology использует WLS, когда существует одна ошибочная модель, которая является постоянной, пропорциональной, или экспоненциальной. SimBiology использует NLL, если у вас есть объединенная ошибочная модель или модель нескольких-ошибок, то есть, модель, имеющая ошибочную модель для каждого ответа.

sbiofit поддерживает различные методы оптимизации и передает в сформулированном WLS или выражении NLL к методу оптимизации, который минимизирует его.

 Выражение, которое минимизируется
Метод взвешенных наименьших квадратов (WLS)Для постоянной ошибочной модели, iN(yifi)2
Для пропорциональной ошибочной модели, iN(yifi)2fi2/fgm2
Для экспоненциальной ошибочной модели, iN(lnyilnfi)2
Для числовых весов, iN(yifi)2wgm/wi
Отрицательная логарифмическая вероятность (NLL)Для объединенной ошибочной модели и модели нескольких-ошибок, iN(yifi)22σi2+iNln2πσi2

Переменные заданы можно следующим образом.

NКоличество экспериментальных наблюдений
yiith экспериментальное наблюдение
fiОжидаемое значение ith наблюдения
σiСтандартное отклонение ith наблюдения.
  • Для постоянной ошибочной модели, σi=a

  • Для пропорциональной ошибочной модели, σi=b|fi|

  • Для объединенной ошибочной модели, σi=a+b|fi|

fgmfgm=(iN|fi|)1N
wiВес ith ожидаемого значения
wgmwgm=(iNwi)1N

Когда вы используете числовые веса или функцию веса, веса приняты, чтобы быть обратно пропорциональными отклонению ошибки, то есть, σi2=a2wi где a является постоянным параметром ошибок. Если вы используете веса, вы не можете задать ошибочную модель кроме постоянной ошибочной модели.

Различные методы оптимизации имеют различные требования к функции, которая минимизируется. Для некоторых методов оценка параметров модели выполняется независимо от оценки ошибочных параметров модели. Следующая таблица обобщает ошибочные модели и любые отдельные формулы, используемые для оценки ошибочных параметров модели, где a и b являются ошибочными параметрами модели, и e является стандартным средним нулем и переменной (Gaussian) модульного отклонения.

Ошибочная модельФункция оценки параметра ошибок
'constant': yi=fi+aea2=1NiN(yifi)2
'exponential': yi=fiexp(ae)a2=1NiN(lnyilnfi)2
'proportional': yi=fi+b|fi|eb2=1NiN(yififi)2
'combined': yi=fi+(a+b|fi|)eПараметры ошибок включены в минимизацию.
Весаa2=1NiN(yifi)2wi

Примечание

nlinfit только поддерживает одну ошибочные модели, не модели нескольких-ошибок, то есть, специфичные для ответа ошибочные модели. Для объединенной ошибочной модели это использует итеративный алгоритм WLS. Для других ошибочных моделей это использует алгоритм WLS, как описано ранее. Для получения дополнительной информации смотрите nlinfit.

Примечание

Если вы используете пропорциональную ошибочную модель во время подбора кривой данных, стараетесь не задавать точки данных время от времени, где решение (результат симуляции) является нулем, или устойчивое состояние является нулем. В противном случае можно столкнуться с проблемами деления на нуль. Рекомендуется, чтобы вы удалили те точки данных из набора данных.

Опции по умолчанию для алгоритмов оценки

ФункцияОпции по умолчанию
nlinfit

sbiofit использует структуру опций по умолчанию, сопоставленную с nlinfit, за исключением:

FunValCheck = 'off'
DerivStep = max(eps^(1/3), min(1e-4,SolverOptions.RelativeTolerance)), где свойство SolverOptions соответствует активному configset object модели.
fmincon

sbiofit использует структуру опций по умолчанию, сопоставленную с fmincon, за исключением:

Display = 'off'
FunctionTolerance = 1e-6*f0, где f0 является начальным значением целевой функции.
OptimalityTolerance = 1e-6*f0, где f0 является начальным значением целевой функции.
Algorithm = 'trust-region-reflective', когда 'SensitivityAnalysis' верен, или 'interior-point', когда 'SensitivityAnalysis' является ложным.
FiniteDifferenceStepSize = max(eps^(1/3), min(1e-4,SolverOptions.RelativeTolerance)), где свойство SolverOptions соответствует образцовому активному configset object.
TypicalX = 1e-6 * x0, где x0 является массивом преобразованных первоначальных оценок.
fminunc

sbiofit использует структуру опций по умолчанию, сопоставленную с fminunc, за исключением:

Display = 'off'
FunctionTolerance = 1e-6*f0, где f0 является начальным значением целевой функции.
OptimalityTolerance = 1e-6*f0, где f0 является начальным значением целевой функции.
Algorithm = 'trust-region', когда 'SensitivityAnalysis' верен, или 'quasi-newton', когда 'SensitivityAnalysis' является ложным.
FiniteDifferenceStepSize = max(eps^(1/3), min(1e-4,SolverOptions.RelativeTolerance)), где свойство SolverOptions соответствует образцовому активному configset object.
TypicalX = 1e-6 * x0, где x0 является массивом преобразованных первоначальных оценок.
fminsearch

sbiofit использует структуру опций по умолчанию, сопоставленную с fminsearch, за исключением:

Display = 'off'
TolFun = 1e-6 * f0, где f0 является начальным значением целевой функции.
lsqcurvefit, lsqnonlin

Требует Optimization Toolbox.

sbiofit использует структуру опций по умолчанию, сопоставленную с lsqcurvefit и lsqnonlin, за исключением:

Display = 'off'
FunctionTolerance = 1e-6 * norm(f0), где f0 является начальным значением целевой функции.
OptimalityTolerance = 1e-6*f0, где f0 является начальным значением целевой функции.
FiniteDifferenceStepSize = max(eps^(1/3), min(1e-4,SolverOptions.RelativeTolerance)), где свойство SolverOptions соответствует образцовому активному configset object.
TypicalX = 1e-6 * x0, где x0 является массивом преобразованных первоначальных оценок.
patternsearch

Требует Global Optimization Toolbox.

sbiofit использует объект опций по умолчанию (optimoptions), сопоставленный с patternsearch, за исключением:

Display = 'off'
FunctionTolerance = 1e-6 * f0, где f0 является начальным значением целевой функции.
MeshTolerance = 1.0e-3
AccelerateMesh = true
ga

Требует Global Optimization Toolbox.

sbiofit использует объект опций по умолчанию (optimoptions), сопоставленный с ga, за исключением:

Display = 'off'
FunctionTolerance = 1e-6 * f0, где f0 является начальным значением целевой функции.
MutationFcn = @mutationadaptfeasible
particleswarm

Требует Global Optimization Toolbox.

sbiofit использует следующие опции по умолчанию для алгоритма particleswarm, за исключением:
Display = 'off'
FunctionTolerance = 1e-6 * f0, где f0 является начальным значением целевой функции.
InitialSwarmSpan = 2000 or 8; 2000 для предполагаемых параметров без преобразования; 8 для предполагаемых параметров с log, logit или probit преобразовывает.
scattersearchСмотрите поля точек алгоритм поиска.

Рассейте алгоритм поиска

Метод scattersearch реализует глобальный алгоритм оптимизации [2], который обращается к некоторым проблемам оценки параметра динамические модели, такие как сходимость к локальным минимумам.

Обзор алгоритма

Алгоритм выбирает подмножество точек от начального пула точек. В том подмножестве некоторые точки являются лучшими по качеству (то есть, самое низкое значение функции), и некоторые случайным образом выбраны. Алгоритм итеративно оценивает точки и исследует различные направления вокруг различных решений найти лучшие решения. Во время этого шага итерации алгоритм заменяет любое старое решение на новое лучшего качества. Итерации продолжают, пока любому критерию остановки не соответствуют. Это затем запускает локальный решатель на лучшей точке.

Инициализация

Чтобы запустить поля точек поиск, алгоритм сначала решает, что общему количеству точек было нужно (NumInitialPoints). По умолчанию общим количеством является 10*N, где N является количеством предполагаемых параметров. Это выбирает точки NumInitialPoints (строки) из InitialPointMatrix. Если InitialPointMatrix не имеет достаточного количества точек, алгоритм вызывает функцию, определяемую в CreationFcn, чтобы сгенерировать дополнительные необходимые точки. По умолчанию латинская выборка гиперкуба используется, чтобы сгенерировать эти дополнительные точки. Алгоритм затем выбирает подмножество точек NumTrialPoints от точек NumInitialPoints. Часть (FractionInitialBest) подмножества содержит лучшие точки с точки зрения качества. Остающиеся точки в подмножестве случайным образом выбраны.

Шаги итерации

Алгоритм выполняет итерации на точках в подмножестве можно следующим образом:

  1. Задайте гиперпрямоугольники вокруг каждой пары точек при помощи относительных качеств (то есть, значения функции) этих точек как мера смещения, чтобы создать эти прямоугольники.

  2. Оцените новое решение в каждом прямоугольнике. Если новое решение превосходит исходное решение по характеристикам, замените оригинал на новый.

  3. Примените движение - вне стратегии к улучшенным решениям и использованию многообещающие направления, чтобы найти лучшие решения.

  4. Запустите локальный поиск в каждой итерации LocalSearchInterval. Используйте вероятность LocalSelectBestProbability, чтобы выбрать лучшую точку как отправную точку для локального поиска. По умолчанию решение случайно, давая равному шансу выбрать лучшую точку или случайную точку от испытательных точек. Если новое решение превосходит старое решение по характеристикам, замените старый на новый.

  5. Замените любую остановленную точку, которая не производит нового решения для поражения после секунд MaxStallTime с другой точкой от начального набора.

  6. Оцените критерий остановки. Прекратите выполнять итерации, если каким-либо критериям соответствуют.

Алгоритм затем запускает локальный решатель на лучшей замеченной точке.

Критерий остановки

Алгоритм выполняет итерации, пока он не достигает останавливающегося критерия.

Остановка опцииОстановка теста
FunctionTolerance и MaxStallIterations

Относительное изменение в лучшем значении целевой функции по последнему MaxStallIterations является меньше, чем FunctionTolerance.

MaxIterations

Количество итераций достигает MaxIterations.

OutputFcn

OutputFcn может остановить итерации.

ObjectiveLimit

Лучшее значение целевой функции в итерации меньше чем или равно ObjectiveLimit.

MaxStallTime

Лучшее значение целевой функции не изменилось за прошлые секунды MaxStallTime.

MaxTime

Функциональное время выполнения превышает  секунды MaxTime.

Опции алгоритма

Вы создаете опции для алгоритма с помощью struct.

ОпцияОписание
CreationFcn

Обработайте к функции, которая создает дополнительные точки, необходимые для алгоритма. Значением по умолчанию является вектор символов 'auto', который использует латинскую выборку гиперкуба.

Функциональная подпись: points = CreationFcn(s,N,lb,ub), где s является общим количеством выбранных точек, N, является количеством предполагаемых параметров, lb является нижней границей, и ub является верхней границей. Если какой-либо вывод от функции превышает границы, эти результаты являются усеченными к границам.

Display

Уровень отображения возвращен в командную строку.

  • 'off' или 'none' (значение по умолчанию) не отображают вывода.

  • 'iter' дает итеративное отображение.

  • 'final' отображает только окончательный вывод.

FractionInitialBest

Числовой скаляр от 0 до 1. Значением по умолчанию является 0.5. Этот номер является частью NumTrialPoints, которые выбраны как лучшие точки из точек NumInitialPoints.

FunctionTolerance

Числовой скаляр от 0 до 1. Значением по умолчанию является 1e-6. Решатель останавливается, если относительное изменение в лучшем значении целевой функции по последнему MaxStallIterations является меньше, чем FunctionTolerance. Эта опция также используется, чтобы удалить дублирующиеся локальные решения. Смотрите XTolerance для деталей.

InitialPointMatrix

Начальная буква (или частичный) набор точек. M-by-N действительная конечная матрица, где M является числом точек и N, является количеством предполагаемых параметров.

Если M < NumInitialPoints, то scattersearch создает больше точек так, чтобы общим количеством строк был NumInitialPoints.

Если M > NumInitialPoints, то scattersearch использует первые строки NumInitialPoints.

Значением по умолчанию являются преобразованные значения начальной буквы предполагаемых параметров, сохраненных в свойстве InitialTransformedValue estimatedInfo object, то есть, [estiminfo.InitialTransformedValue].
LocalOptionsОпции для локального решателя. Это может быть struct (созданный с optimset или statset) или объект optimoptions, в зависимости от локального решателя. Значением по умолчанию является вектор символов 'auto', который использует опции по умолчанию выбранного решателя за некоторыми исключениями. В дополнение к этим исключениям следующие опции ограничивают время, проведенное в локальном решателе, потому что это неоднократно называется:
  • MaxFunEvals (максимальное количество функциональных позволенных оценок) = 300

  • MaxIter (максимальное количество позволенных итераций) = 200

LocalSearchInterval

Положительное целое число. Значением по умолчанию является 10. Алгоритм scattersearch применяет локальный решатель к одной из испытательных точек после первой итерации и снова каждой итерации LocalSearchInterval.

LocalSelectBestProbability

Числовой скаляр от 0 до 1. Значением по умолчанию является 0.5. Это - вероятность выбора лучшей точки как отправная точка для локального поиска. В других случаях одна из испытательных точек выбрана наугад.

LocalSolver

Вектор символов или строка, задающая имя локального решателя. Поддерживаемыми методами является 'fminsearch', 'lsqnonlin', 'lsqcurvefit', 'fmincon', 'fminunc', 'nlinfit'.

Локальный решатель по умолчанию выбран со следующим приоритетом:

  • Если Optimization Toolbox доступен, решателем является lsqnonlin.

  • Если Statistics and Machine Learning Toolbox доступен, решателем является nlinfit.

  • В противном случае решателем является fminsearch.

MaxIterations

Положительное целое число. Значением по умолчанию является вектор символов 'auto', представляющий 20*N, где N является количеством предполагаемых параметров.

MaxStallIterations

Положительное целое число. Значением по умолчанию является 50. Решатель останавливается, если относительное изменение в лучшем значении целевой функции по последним итерациям MaxStallIterations является меньше, чем FunctionTolerance.

MaxStallTime

Положительная скалярная величина. Значением по умолчанию является Inf. Решатель останавливается, если секунды MaxStallTime передали начиная с последнего улучшения лучше всего замеченного значения целевой функции. Здесь, время является стеной, показывают время в противоположность циклам процессора.

MaxTime

Положительная скалярная величина. Значением по умолчанию является Inf. Решатель останавливается, если секунды MaxTime передали с начала поиска. Время здесь означает, что стена показывает время в противоположность циклам процессора.

NumInitialPoints

Положительное целое число, которое является >= NumTrialPoints. Решатель генерирует точки NumInitialPoints прежде, чем выбрать подмножество испытательных точек (NumTrialPoints) для последующих шагов. Значением по умолчанию является вектор символов 'auto', который представляет 10*N, где N является количеством предполагаемых параметров.

NumTrialPoints

Положительное целое число, которое является >= 2 и <= NumInitialPoints. Решатель генерирует точки начальной буквы NumInitialPoints прежде, чем выбрать подмножество испытательных точек (NumTrialPoints) для последующих шагов. Значением по умолчанию является вектор символов 'auto', который представляет первое четное число n для который n2n10*N, где N является количеством предполагаемых параметров.

ObjectiveLimit

Скаляр. Значением по умолчанию является -Inf. Решатель останавливается, если лучшее значение целевой функции в итерации меньше чем или равно ObjectiveLimit.

OutputFcn

Указатель на функцию или cell-массив указателей на функцию. Выходные функции могут считать итеративные данные и остановить решатель. Значением по умолчанию является [].

Подписью выходной функции является stop = myfun(optimValues,state), где:

  • stop является логическим скаляром. Установите на true, чтобы остановить решатель.

  • optimValues является структурой, содержащей информацию об испытательных точках с полями.

    • bestx является найденной точкой лучшего решения, соответствуя значению функции bestfval.

    • bestfval является лучшим (самым низким) найденным значением целевой функции.

    • iteration является номером итерации.

    • medianfval является средним значением целевой функции среди всех текущих испытательных точек.

    • stalliterations является количеством итераций начиная с последнего изменения в bestfval.

    • trialx является матрицей текущих испытательных точек. Каждая строка представляет одну точку, и количество строк равно NumTrialPoints.

    • trialfvals является вектором значений целевой функции для испытательных точек. Это - матрица для методов lsqnonlin и lsqcurvefit.

  • state является вектором символов, дающим состояние текущей итерации.

    • 'init' – Решатель не начал выполнять итерации. Ваша выходная функция может использовать это состояние, чтобы открыть файлы или настроить структуры данных или графики для последующих итераций.

    • 'iter' – Решатель является продолжением его итераций. Как правило, это состояние - то, где ваша выходная функция выполняет свою работу.

    • сделанный Решатель достигает останавливающегося критерия. Ваша выходная функция может использовать это состояние, чтобы вымыться, такие как закрытие любых файлов, которые это открыло.

TrialStallLimit

Положительное целое число, со значением по умолчанию 22. Если конкретная испытательная точка не улучшается после итераций TrialStallLimit она заменяется другой точкой.

UseParallel

Логический флаг, чтобы вычислить целевую функцию параллельно. Значением по умолчанию является false.

XTolerance

Числовой скаляр от 0 до 1. Значением по умолчанию является 1e-6. Эта опция задает, как близко две точки должны быть должны считать их идентичными для создания вектора локальных решений. Решатель вычисляет расстояние между парой точек с norm, Евклидово расстояние. Если два решения на расстоянии XTolerance друг друга и имеют значения целевой функции в FunctionTolerance друг друга, решатель считает их идентичными. Если оба условия не соблюдают, решатель сообщает о решениях как отличных.

Получить отчет каждого потенциального локального минимального, набора XTolerance к 0. Чтобы получить отчет меньшего количества результатов, установите XTolerance на большее значение.

Несколько оценок параметра параллельно

Существует два способа использовать параллельные вычисления для оценки параметра.

Установите 'UseParallel' на истину

Чтобы включить распараллеливание для sbiofit, установите пару "имя-значение" 'UseParallel' на true. Функция поддерживает несколько уровней распараллеливания, но только один уровень используется за один раз. Для необъединенного пригодного для нескольких групп (или люди), каждая подгонка запускается параллельно. Для объединенной подгонки распараллеливание происходит на уровне решателя, если решатель поддерживает его. Таким образом, sbiofit устанавливает параллельную опцию соответствующего метода оценки (решатель) к истине, и оценки функции возражения выполняются параллельно. Например, градиенты вычисляются параллельно для основанных на градиенте методов. Если вы выполняете объединенную подгонку с несколькими группами, использующими решатель, который не имеет параллельной опции, симуляции запущенный параллельно для каждой группы во время оптимизации (оценка наибольшего правдоподобия).

Используйте parfeval или parfor

Можно также вызвать sbiofit в цикле parfor или использовать parfeval в for - цикл, чтобы выполнить несколько оценок параметра параллельно. Рекомендуется, чтобы вы использовали parfeval потому что эти параллельные оценки, запущенные асинхронно. Если одна подгонка производит ошибку, она не влияет на другие подгонки.

При попытке найти глобальный минимум, можно использовать глобальные решатели, такие как particleswarm или ga (Global Optimization Toolbox требуется). Однако, если вы хотите задать начальные условия и запустить подгонки параллельно, смотрите следующий пример, который показывает, как использовать и parfor и parfeval.

Модель и Setup данных

Загрузите модель белка G.

sbioloadproject gprotein

Храните экспериментальные данные, содержащие курс времени для части активного белка G [1].

time = [0 10 30 60 110 210 300 450 600]';
GaFracExpt = [0 0.35 0.4 0.36 0.39 0.33 0.24 0.17 0.2]';

Создайте groupedData object на основе экспериментальных данных.

tbl = table(time,GaFracExpt);
grpData = groupedData(tbl);

Сопоставьте соответствующий элемент модели с экспериментальными данными.

responseMap = 'GaFrac = GaFracExpt';

Задайте параметр, чтобы оценить.

paramToEstimate    = {'kGd'};

Сгенерируйте начальные значения параметров для kGd.

rng('default');
iniVal = abs(normrnd(0.01,1,10,1));
fitResultPar = [];

Параллельный Setup пула

Запустите параллельный пул с помощью локального профиля.

poolObj = parpool('local');
Starting parallel pool (parpool) using the 'local' profile ...
Connected to the parallel pool (number of workers: 6).

Отправьте модель каждому рабочему. Следующий код гарантирует, что модель распределяется только однажды каждому рабочему.

modelOnWorkers = parallel.pool.Constant(m1);

Используя (рекомендуемый) parfeval

Во-первых, задайте указатель на функцию, который использует локальную функцию sbiofitpar для оценки. Убедитесь, что функциональный sbiofitpar задан в конце скрипта.

optimfun = @(x) sbiofitpar(modelOnWorkers.Value,grpData,responseMap,x);

Выполните несколько оценок параметра параллельно через parfeval с помощью различных начальных значений параметров.

for i=1:length(iniVal)
    f(i) = parfeval(optimfun,1,iniVal(i)); 
end
fitResultPar = fetchOutputs(f);

Обобщите результаты для каждого выполнения.

allParValues = vertcat(fitResultPar.ParameterEstimates);
allParValues.LogLikelihood = [fitResultPar.LogLikelihood]';
allParValues.RunNumber = (1:length(iniVal))';
allParValues.Name = categorical(allParValues.Name);
allParValues.InitialValue = iniVal;
% Rearrange the columns.
allParValues = allParValues(:,[5 1 6 2 3 4]);
% Sort rows by LogLikelihood.
sortrows(allParValues,'LogLikelihood')
ans=10×6 table
    RunNumber    Name    InitialValue    Estimate    StandardError    LogLikelihood
    _________    ____    ____________    ________    _____________    _____________

        9        kGd        3.5884        3.0219         0.13319         -1.2842   
       10        kGd        2.7794         2.779        0.029701         -1.2319   
        3        kGd        2.2488        2.2488        0.096013         -1.0786   
        2        kGd        1.8439         1.844         0.28825        -0.90104   
        6        kGd        1.2977        1.2977        0.011344        -0.48209   
        4        kGd       0.87217       0.65951        0.003583          0.9279   
        1        kGd       0.54767       0.54776       0.0020424          1.5323   
        7        kGd       0.42359       0.42363       0.0024555          2.6097   
        8        kGd       0.35262       0.35291      0.00065289          3.6098   
        5        kGd       0.32877       0.32877      0.00042474          4.0604   

Задайте локальную функцию sbiofitpar, который выполняет оценку параметра с помощью sbiofit.

function fitresult = sbiofitpar(model,grpData,responseMap,initialValue)
estimatedParam = estimatedInfo('kGd');
estimatedParam.InitialValue = initialValue;
fitresult = sbiofit(model,grpData,responseMap,estimatedParam);
end

Используя parfor

Также можно выполнить несколько оценок параметра параллельно через цикл parfor.

parfor i=1:length(iniVal)
    estimatedParam = estimatedInfo(paramToEstimate,'InitialValue',iniVal(i));
    fitResultTemp = sbiofit(modelOnWorkers.Value,grpData,responseMap,estimatedParam); 
    fitResultPar = [fitResultPar;fitResultTemp];
end

Закройте параллельный пул.

delete(poolObj);

Оценка параметра с гибридными решателями

sbiofit поддерживает глобальные методы оптимизации, а именно, ga и particleswarm (требуемый Global Optimization Toolbox). Чтобы улучшить результаты оптимизации, эти методы позволяют вам запустить гибридную функцию после того, как глобальный решатель остановится. Гибридная функция использует конечный пункт, возвращенный глобальным решателем как его начальная точка. Поддерживаемые гибридные функции:

Убедитесь, что ваша гибридная функция принимает ваши ограничения задач. Таким образом, если ваши параметры ограничены, используйте соответствующую функцию (такую как fmincon или patternsearch) для ограниченной оптимизации. Если не ограниченный, используйте fminunc, fminsearch или patternsearch. В противном случае sbiofit выдает ошибку.

Для проиллюстрированного примера смотрите, Выполняют Гибридную Оптимизацию Используя sbiofit.

Ссылки

[1] И, T-M., Kitano, H. и Саймон, M. (2003). Количественная характеристика дрожжей гетеротримерный цикл белка G. PNAS. 100, 10764–10769.

[2] Габор, A., и Банга, J.R. (2015). Устойчивая и эффективная оценка параметра динамические модели биологических систем. Системная биология BMC. 9:74.

Расширенные возможности

Введенный в R2014a