Выполните нелинейный метод наименьших квадратов регрессию
Для этой функции рекомендованы Statistics and Machine Learning Toolbox™, Optimization Toolbox™ и Global Optimization Toolbox.
оценивает параметры модели SimBiology fitResults
= sbiofit(sm
,grpData
,responseMap
,estiminfo
)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
подгоняется отдельно, получая оценки параметров для конкретной группы. Если модель содержит активные дозы и варианты, они применяются перед симуляцией.
использует информацию о дозах, заданную матрицей объектов дозы SimBiology fitResults
= sbiofit(sm
,grpData
,responseMap
,estiminfo
,dosing
)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
аргументы в виде пар.
[
также возвращает вектор объектов SimData fitResults
,simdata
]
= sbiofit(_)simdata
использование любого из входных параметров в предыдущих синтаксисах.
Примечание
sbiofit
объединяет sbionlinfit
и sbioparamestim
функции оценки. Использовать sbiofit
для выполнения нелинейного метода наименьших квадратов регрессии.
sbiofit
моделирует модель с помощью a SimFunction object
, который автоматически ускоряет симуляции по умолчанию. Следовательно, нет необходимости бежать sbioaccelerate
перед вызовом sbiofit
.
Фон
Этот пример показывает аппроксимацию данных профиля PK индивидуума к модели с одним отделением и оценку фармакокинетических параметров.
Предположим, что у вас есть данные о концентрации лекарственного средства в плазме от индивидуума и вы хотите оценить объем центрального отделения и зазор. Предположим, что концентрация препарата в зависимости от временного профиля следует за моноэкспоненциальным снижением , где - концентрация препарата в момент t, является начальной концентрацией, и - константа скорости устранения, которая зависит от зазора и объема центрального отсека .
Синтетические данные в этом примере были сгенерированы с использованием следующей модели, параметров и дозы:
Однокамерная модель с болюсным дозированием и устранением первого порядка
Объем центрального отсека (Central
) = 1,70 л
Параметр зазора (Cl_Central
) = 0,55 л/час
Модель постоянной ошибки
Болусовая доза 10 мг
Загрузка данных и визуализация
Данные хранятся как таблица с переменными Time
и Conc
которые представляют временное течение концентрации индивидуума в плазме после внутривенного болюсного введения, измеренное в 13 различных временных точках. Переменные модули для Time
и Conc
час и миллиграмм/литр, соответственно.
clear all load('data15.mat')
plot(data.Time,data.Conc,'b+') xlabel('Time (hour)'); ylabel('Drug Concentration (milligram/liter)');
Преобразование в формат сгруппированных данных
Преобразуйте набор данных в groupedData
объект, который является необходимым форматом данных для функции аппроксимации sbiofit
для дальнейшего использования. A 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. Для получения дополнительной информации о настройке различных графиков дозирования, смотрите Дозы в SimBiology Моделях.
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'};
Задайте параметры для оценки
Параметрами, подходящими в этой модели, являются объем центрального отсека (Central) и скорость зазора (Cl_Central). В этом случае задайте логарифмическое преобразование для этих биологических параметров, поскольку они ограничены, чтобы быть положительными. The 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);
Сравнение информационных критериев для выбора модели
Сравните значения логарифмической правдоподобности, 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
Основываясь на информационных критериях, постоянная модель ошибки (или равные веса) лучше всего подходит для данных, поскольку она имеет самое большое значение логарифмической правдоподобности и самые маленькие 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 к модели с одним отсеком. Вы сравнили информационные критерии каждой модели и оцененные значения параметров различных моделей ошибок, чтобы увидеть, какая модель лучше всего объяснила данные. Окончательные подгоняемые результаты позволили предположить, что как постоянная, так и комбинированная модели ошибок предоставили самые близкие оценки значениям параметров, используемым для генерации данных. Однако модель постоянной ошибки является лучшей моделью, на которую указывает логарифмическую правдоподобность, AIC и информационные критерии BIC.
Предположим, что у вас есть данные о концентрации лекарственного средства в плазме от трёх индивидуумов, которые вы хотите использовать, чтобы оценить соответствующие фармакокинетические параметры, а именно объем центрального и периферического отделения (Central
, Peripheral
), коэффициент клиренса (Cl_Central
) и межкомпартментальное разминирование (Q12
). Предположим, что концентрация препарата в зависимости от временного профиля следует за биексоненциальным снижением , где Ct - концентрация препарата в момент t, и a и b являются склонами для соответствующего экспоненциального снижения.
Синтетический набор данных содержит данные о концентрации лекарственного средства в плазме, измеренные как в центральном, так и в периферийном отсеках. Данные были сгенерированы с использованием двухкамерной модели с капельным внутривенным введением и первоклассным устранением. Эти параметры использовались для каждого индивидуума.
Central | Peripheral | Q12 | Cl_Central | |
---|---|---|---|---|
Индивидуальный 1 | 1.90 | 0.68 | 0.24 | 0.57 |
Индивидуальный 2 | 2.10 | 6.05 | 0.36 | 0.95 |
Индивидуальный 3 | 1.70 | 4.21 | 0.46 | 0.95 |
Данные хранятся как таблица с переменными ID
, Time
, CentralConc
, и PeripheralConc
. Это представляет собой временное течение концентраций в плазме, измеренных в восьми различных временных точках как для центрального, так и для периферийного отсеков после капельного внутривенного введения.
load('data10_32R.mat')
Преобразуйте набор данных в groupedData
объект, который является необходимым форматом данных для функции аппроксимации sbiofit
для дальнейшего использования. A 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 для создания двухкамерной модели с инфузионным дозированием и устранением первого порядка, где скорость устранения зависит от зазора и объема центрального отделения. Используйте объект 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 мг/час. Для получения дополнительной информации о настройке различных стратегий дозирования, смотрите Дозы в SimBiology Моделей.
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 индивидуумов, и вы хотите оценить фармакокинетические параметры, а именно объемы центрального и периферического отделения, клиренс и межкомпартментарный клиренс. Предположим, что концентрация препарата в зависимости от временного профиля следует за биексоненциальным снижением , где - концентрация лекарственного средства в момент t, и и являются склонами для соответствующего экспоненциального падения.
Загрузка данных
Эти синтетические данные содержат временное течение концентраций в плазме 30 индивидуумов после болюсной дозы (100 мг), измеренной в разное время как для центрального, так и для периферического отделения. Он также содержит категориальные переменные, а именно Sex
и Age
.
clear
load('sd5_302RAgeSex.mat')
Преобразование в формат сгруппированных данных
Преобразуйте набор данных в groupedData
объект, который является необходимым форматом данных для функции аппроксимации sbiofit
. A 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'
The IndependentVariableName
и GroupVariableName
свойства были автоматически установлены на Time
и ID
переменные данных.
Визуализация данных
Отображение данных отклика для каждого индивидуума.
t = sbiotrellis(gData,'ID','Time',{'CentralConc','PeripheralConc'},... 'Marker','+','LineStyle','none'); % Resize the figure. t.hFig.Position(:) = [100 100 1280 800];
Настройте двухкамерную модель
Используйте встроенную библиотеку PK для создания двухкамерной модели с инфузионным дозированием и устранением первого порядка, где скорость устранения зависит от зазора и объема центрального отделения. Используйте 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. Для получения дополнительной информации о настройке различных стратегий дозирования, смотрите Дозы в SimBiology Моделей.
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
как параметры для оценки. The 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
всегда возвращает по одному объекту результатов для каждого индивидуума.
Исследуйте оценки параметров для зависимостей категорий
Исследуйте неохлажденные оценки, чтобы увидеть, есть ли какие-либо параметры для категории, то есть, связаны ли некоторые параметры с одной или несколькими категориями. Если есть какие-либо зависимости категории, возможно, удастся уменьшить количество степеней свободы, оценив только значения этих параметров для категории.
Сначала извлеките идентификатор и значения категорий для каждого идентификатора
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'
как группа, подходящая для зазора Cl_Central
и Q12
параметры. Использование 'Age'
как группа, подходящая для Central
и Peripheral
параметры.
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]. Для получения дополнительной информации о модели смотрите раздел «Фон» в Сканировании параметров, Оценке параметров и Анализе чувствительности в дрожжевом гетеротримерном цикле 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;
Добавьте два параметра, которые представляют задержку во времени и длительность дозы. Параметр lag определяет временную задержку перед введением дозы. Параметр длительности задает время, необходимое для введения дозы.
lagP = addparameter(model,'lagP'); lagP.ValueUnits = 'hour'; durP = addparameter(model,'durP'); durP.ValueUnits = 'hour';
Создайте объект дозы. Установите LagParameterName
и DurationParameterName
свойства дозы к именам параметров задержки и длительности, соответственно. Установите суммарную дозу в 10 миллиграммов, которая была количеством, используемым для генерации данных.
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)
sm
- SimBiology модельSimBiology модель, заданная как SimBiology model object
. Активное configset object
модели содержит настройки решателя для симуляции. Любые активные дозы и варианты применяются к модели во время симуляции, если не указано иное с помощью dosing
и variants
входные параметры, соответственно.
grpData
- Данные в соответствииДанные в соответствии, заданные как groupedData
object
.
Имя временной переменной должно быть определено в IndependentVariableName
свойство grpData
. Например, если имя временной переменной 'TIME'
, затем укажите его следующим образом.
grpData.Properties.IndependentVariableName = 'TIME';
Если данные содержат более одной группы измерений, имя сгруппированной переменной должно быть определено в GroupVariableName
свойство grpData
. Например, если имя сгруппированной переменной 'GROUP'
, затем укажите его следующим образом.
grpData.Properties.GroupVariableName = 'GROUP';
Примечание
sbiofit
использует categorical
функция для идентификации групп. Если какие-либо значения групп преобразуются в одно и то же значение, categorical
затем эти наблюдения рассматривают как принадлежность к той же группе. Например, если некоторые наблюдения не имеют информации о группе (то есть пустом символьном векторе ''
), затем categorical
преобразует пустые символьные векторы в <undefined>
и эти наблюдения рассматриваются как одна группа.
responseMap
- Отображение информации о компонентах модели с grpData
Сопоставление информации о компонентах модели с grpData
, заданный как вектор символов, строка, строковый вектор или массив ячеек из векторов символов.
Каждый вектор или строка символов является выражением, подобным уравнению, подобным правилам назначения в SimBiology. Он содержит имя (или квалифицированное название) количества (вида, отделения или параметра) или observable
объект в модели sm
, далее следует символ '='
и имя переменной в grpData
. Для ясности, белые пространства разрешены между именами и '='
.
Для примера, если у вас есть данные о концентрации 'CONC'
в grpData
для видового 'Drug_Central'
, можно задать его следующим образом.
responseMap = 'Drug_Central = CONC';
Чтобы однозначно назвать вид, используйте квалифицированное имя, которое включает в себя имя отсека. Чтобы назвать параметр области реакции, используйте имя реакции, чтобы определить параметр.
Если имя компонента модели или grpData
имя переменной не является допустимым MATLAB® имя переменной, окружайте ее квадратными скобками, такими как:
responseMap = '[Central 1].Drug = [Central 1 Conc]';
Если само имя переменной содержит квадратные скобки, вы не можете использовать его в выражении, чтобы задать информацию о отображении.
Выдается ошибка, если любое (квалифицированное) имя совпадает с двумя компонентами одного типа. Однако можно использовать (квалифицированное) имя, которое совпадает с двумя компонентами разных типов, и функция сначала находит виды с заданным именем, далее указываются отделения, а затем параметры.
estiminfo
- Расчетные параметрыestimatedInfo
| вектор объекта estimatedInfo
объектыПредполагаемые параметры, заданные как 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>
и эти наблюдения рассматриваются как одна группа.
dosing
- Информация о дозах[]
| 2-D матрица объектов дозыИнформация о дозах, заданная как пустой массив или 2-D матрица объектов дозы (ScheduleDose object
или RepeatDose object
).
Если он пуст, никакие дозы не применяются во время симуляции, даже если модель имеет активные дозы.
Если не пустой, матрица должна иметь одну строку или по одной строке на группу во входных данных. Если она имеет одну строку, одинаковые дозы применяются ко всем группам во время симуляции. Если она имеет несколько строк, каждая строка применяется к отдельной группе в том же порядке, в котором группы появляются во входных данных.
Допускается использование нескольких столбцов, чтобы можно было применить несколько объектов дозы к каждой группе. Все дозы в столбце должны ссылаться на одни и те же компоненты в модели. Для примера дозы в том же столбце должны иметь ту же дозу, что и целевые (TargetName
). Если вы параметризоваете любое свойство дозы, то все дозы в столбце должны иметь это свойство, параметризованное к одному и тому же параметру. Если одни группы требуют больше доз, чем другие, то заполните матрицу стандартными (манекенщицами) дозами.
Доза по умолчанию имеет значения по умолчанию для всех свойств, кроме Name
свойство. Создайте дозу по умолчанию следующим образом.
d1 = sbiodose('d1');
В дополнение к ручному построению объектов дозы с помощью sbiodose
, если grpData
имеет информацию о дозах, вы можете использовать createDoses
СПОСОБ СОЗДАНИЯ ДОЗ.
functionName
- Имя функции оценкиИмя функции оценки, заданное как вектор символов или строка. Варианты являются следующими.
'fminsearch'
'nlinfit'
(Требуется набор инструментов Statistics and Machine Learning Toolbox.)
'fminunc'
(Требуется Optimization Toolbox.)
'fmincon'
(Требуется Optimization Toolbox.)
'lsqcurvefit'
(Требуется Optimization Toolbox.)
'lsqnonlin'
(Требуется Optimization Toolbox.)
'patternsearch'
(Требуется глобальный набор инструментов оптимизации.)
'ga'
(Требуется глобальный набор инструментов оптимизации.)
'particleswarm'
(Требуется глобальный набор инструментов оптимизации.)
По умолчанию, sbiofit
использует первую доступную функцию оценки среди следующих: lsqnonlin
(Optimization Toolbox), nlinfit
(Statistics and Machine Learning Toolbox), или fminsearch
. Тот же приоритет применяется к выбору локального решателя по умолчанию для scattersearch
.
Для сводных данных поддерживаемых методов и параметров аппроксимации смотрите Поддерживаемые методы оценки параметра в SimBiology.
options
- Опции, характерные для функции оценкиОпции, характерные для функции оценки, заданные как struct или optimoptions
объект.
statset
struct для nlinfit
optimset
struct для fminsearch
optimoptions
объект для lsqcurvefit
, lsqnonlin
, fmincon
, fminunc
, particleswarm
, ga
, и patternsearch
struct
для scattersearch
Смотрите Опции по умолчанию для Алгоритмов оценки для получения дополнительной информации и опций по умолчанию, связанных с каждой функцией оценки.
variants
- Варианты[]
| вектор вариантов объектовВарианты, заданные как пустой массив или вектор объектов варианта. Если он пуст, никакие варианты не используются, даже если у модели есть активные варианты.
Задайте необязательные разделенные разделенными запятой парами Name,Value
аргументы. Name
- имя аргумента и Value
- соответствующее значение. Name
должны находиться внутри кавычек. Можно задать несколько аргументов в виде пар имен и значений в любом порядке Name1,Value1,...,NameN,ValueN
.
'ErrorModel','constant','UseParallel',true
задает модель постоянной ошибки и запускает параллельные симуляции во время оценки параметра.'ErrorModel'
- Модель ошибки'constant'
(по умолчанию) | вектор символов | строковый | строковый вектор | массив ячеек вектора символов | категориального вектора | таблицыМодели ошибок, используемые для оценки, заданные как вектор символов, строка, строковый вектор, массив ячеек из векторов символов, категориальный вектор или таблица.
Если это таблица, она должна содержать одну переменную, которая является вектором-столбцом имен моделей ошибок. Имена могут быть массивом ячеек из векторов символов, строковым вектором или вектором категориальных переменных. Если таблица имеет более одной строки, то RowNames
свойство должно совпадать с именами переменных отклика, заданными в правой части responseMap
. Если таблица не использует RowNames
свойство, n-я ошибка связана с n-й характеристикой.
Если вы задаете только одну модель ошибки, то sbiofit
оценивает один набор параметров ошибки для всех ответов.
Если вы задаете несколько моделей ошибок с помощью категориального вектора, строкового вектора или массива ячеек из векторов символов, длина вектора или массива ячеек должна совпадать с количеством откликов в responseMap
аргумент.
Можно задать несколько моделей ошибок, только если вы используете следующие методы: lsqnonlin
, lsqcurvefit
, fmincon
, fminunc
, fminsearch
, patternsearch
, ga
, и particleswarm
.
Существует четыре встроенные модели ошибок. Каждая модель определяет ошибку при использовании стандартного среднего нуля и отклонения модуля (Гауссовская) переменная e, результаты симуляции f, и один или два параметра a и b.
'constant'
:
'proportional'
:
'combined'
:
'exponential'
:
Примечание
Если вы задаете модель ошибки, вы не можете задать веса, кроме модели постоянной ошибки.
Если вы используете пропорциональную или комбинированную модель ошибки во время подбора кривой данных, избегайте задавать точки данных в моменты, когда решение (результат симуляции) является нулем или установившееся состояние равняется нулю. В противном случае вы можете столкнуться с задачами деления на нули. Рекомендуется удалить эти точки данных из набора данных. Для получения дополнительной информации о функциях оценки параметра ошибки, смотрите Максимальную оценку правдоподобия.
'Weights'
- ВесаВеса, используемые для оценки, заданные как матрица вещественных положительных весов, где количество столбцов соответствует количеству откликов, или указатель на функцию, который принимает вектор предсказанных значений отклика и возвращает вектор действительных положительных весов.
Если вы задаете модель ошибки, вы не можете использовать веса, кроме модели постоянной ошибки. Если ни один из 'ErrorModel'
или 'Weights'
задано, по умолчанию функция использует модель постоянной ошибки с равными весами.
'Pooled'
- Флаг опции подгонкиfalse
(по умолчанию) | true
Флаг опции подгонки, определяющий, подходить ли каждому индивидууму (false
) или объедините все отдельные данные (true
).
Когда true
функция выполняет подбор кривой для всех индивидуумов или групп одновременно, используя одни и те же оценки параметров, и fitResults
является скалярным объектом результатов.
Когда false
функция подходит для каждой группы или индивидуума отдельно, используя параметры, относящиеся к группе или отдельности, и fitResults
является вектором объектов результатов с одним результатом для каждой группы.
Примечание
Используйте эту опцию, чтобы переопределить любое CategoryVariableName
значения estiminfo
.
'UseParallel'
- Флаг для параллельных симуляцийfalse
(по умолчанию) | true
Флаг для включения параллелизации, заданный как true
или false
. Если true
и доступно Parallel Computing Toolbox™, sbiofit
поддерживает несколько уровней параллелизации, но одновременно используется только один уровень.
Для неохлажденной подгонки ('Pooled'
= false
) для нескольких групп каждая подгонка выполняется параллельно.
Для объединенной подгонки ('Pooled'
= true
), параллелизация происходит на уровне решателя. Другими словами, расчеты решателя, такие как вычисления целевой функции, выполняются параллельно. Для получения дополнительной информации см. «Множественные оценки параметров параллельно».
'SensitivityAnalysis'
- Флаг, чтобы использовать чувствительности параметров для определения градиентов целевой функцииtrue
| false
Флаг, чтобы использовать чувствительности параметров для определения градиентов целевой функции, заданный как true
или false
. По умолчанию это true
для fmincon
, fminunc
, lsqnonlin
, и lsqcurvefit
методы. В противном случае это false
. Если это правда, SimBiology всегда использует sundials
решатель, независимо от того, что вы выбрали в качестве SolverType
свойство в Configset
объект.
SimBiology использует метод приближения комплексного шага, чтобы вычислить чувствительность параметра. Такие вычисленные чувствительности могут использоваться, чтобы определить градиенты целевой функции во время оценки параметра, чтобы улучшить подбор кривой. Поведение по умолчанию sbiofit
использовать такие чувствительности для определения градиентов всякий раз, когда алгоритм основан на градиентах и если SimBiology® модель поддерживает анализ чувствительности. Для получения дополнительной информации о требованиях модели и анализе чувствительности, см. Анализ чувствительности в SimBiology.
'ProgressPlot'
- Флаг для отображения прогресса оценки параметраfalse
(по умолчанию) | true
Флаг для отображения прогресса оценки параметра, заданный как true
или false
. Если true
Откроется новый рисунок, содержащая графики, которые показывают логарифмическую правдоподобность, критерии завершения и предполагаемые параметры для каждой итерации. Эта опция не поддерживается для nlinfit
способ.
Если вы используете функции Optimization Toolbox (fminunc
, fmincon
, lsqcurvefit
, lsqnonlin
), рисунок также показывает график Оптимальности первого порядка (Optimization Toolbox).
Для неохлажденной подгонки каждая линия на графиках представляет отдельный индивидуума. Для объединенной подгонки одна линия представляет всех индивидуумов. Линия становится затухшей, когда подгонка завершена. Графики также отслеживают прогресс, когда вы запускаете sbiofit
(для объединенных и неохваченных подгонок) параллельно с использованием удаленных кластеров. Для получения дополнительной информации смотрите График прогресса.
fitResults
- Результаты оценкиOptimResults object
| NLINResults object
| Вектор объектов результатовРезультаты оценки, возвращенные как OptimResults
object
или NLINResults object
или вектор этих объектов. Оба объекта результатов являются подклассами LeastSquaresResults object
.
Если функция использует nlinfit
(Statistics and Machine Learning Toolbox), затем 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
- Результаты симуляцииSimData
объектыРезультаты симуляции, возвращенные как вектор SimData
объекты, представляющие результаты симуляции для каждой группы или индивидуума.
Если на 'Pooled'
опция false
, затем в каждой симуляции используются специфичные для группы значения параметров. Если true
, затем во всех симуляциях используются одни и те же (по всей популяции) значения параметров.
Информация о состояниях представлена в simdata
являются состояниями, которые были включены в responseMap
входной параметр и любые другие состояния, перечисленные в StatesToLog
свойство опций среды выполнения (RuntimeOptions
) модели SimBiology sm
.
SimBiology оценивает параметры методом максимальной вероятности. Вместо того, чтобы непосредственно максимизировать функцию правдоподобия, SimBiology создает эквивалентную задачу минимизации. Когда это возможно, оценка формулируется как взвешенная оптимизация методом наименьших квадратов (WLS), которая минимизирует сумму квадратов взвешенных невязок. В противном случае оценка формулируется как минимизация противоположного логарифма вероятности (NLL). Формулировка WLS часто сходится лучше, чем формулировка NLL, и SimBiology может использовать специализированные алгоритмы WLS, такие как алгоритм Левенберга-Марквардта, реализованный в lsqnonlin
и lsqcurvefit
. SimBiology использует WLS, когда существует единственная модель ошибки, которая является постоянной, пропорциональной или экспоненциальной. SimBiology использует NLL, если у вас есть комбинированная модель ошибки или модель с несколькими ошибками, то есть модель, имеющая модель ошибки для каждого ответа.
sbiofit
поддерживает различные методы оптимизации и передает в сформулированном выражении WLS или NLL метод оптимизации, который минимизирует его. Для простоты каждое выражение, показанное ниже, принимает только одну модель ошибки и один ответ. Если ответов несколько, SimBiology принимает сумму выражений, которые соответствуют моделям ошибок заданных ответов.
Выражение, которое минимизируется | |
---|---|
Взвешенные наименьшие квадраты (WLS) | Для модели постоянной ошибки, |
Для пропорциональной модели ошибки, | |
Для экспоненциальной модели ошибки, | |
Для числовых весов, | |
Отрицательная логарифмическая правдоподобность (NLL) | Для комбинированной модели ошибки и модели с несколькими ошибками, |
Переменные определяются следующим образом.
N | Количество экспериментальных наблюдений |
yi | i-е экспериментальное наблюдение |
Предсказанное значение i-го наблюдения | |
Стандартное отклонение i-го наблюдения.
| |
Вес i-го предсказанного значения | |
Когда вы используете числовые веса или функцию веса, веса приняты обратно пропорциональными отклонения ошибки, то есть где a - параметр постоянной ошибки. Если вы используете веса, вы не можете задать модель ошибки, кроме модели постоянной ошибки.
Различные методы оптимизации имеют различные требования к функции, которая минимизируется. Для некоторых методов оценка параметров модели выполняется независимо от оценки параметров модели ошибки. В следующей таблице обобщены модели ошибок и любые отдельные формулы, используемые для оценки параметров модели ошибок, где a и b являются параметрами модели ошибок, и e является стандартной переменной среднего нуля и единичной дисперсии (Гауссова).
Модель ошибки | Функция оценки параметра ошибки |
---|---|
'constant' : | |
'exponential' : | |
'proportional' : | |
'combined' : | Параметры ошибки включены в минимизацию. |
Веса |
Примечание
nlinfit
поддерживаются только модели с одной ошибкой, а не модели с несколькими ошибками, то есть модели с конкретной реакцией. Для комбинированной модели ошибки он использует итерационный алгоритм WLS. Для других моделей ошибок он использует алгоритм WLS, как описано ранее. Для получения дополнительной информации см. nlinfit
(Statistics and Machine Learning Toolbox).
В следующей таблице представлены опции по умолчанию для различных функций оценки.
Функция | Опции по умолчанию | ||||||
---|---|---|---|---|---|---|---|
nlinfit (Statistics and Machine Learning Toolbox) |
| ||||||
fmincon (Optimization Toolbox) |
| ||||||
fminunc (Optimization Toolbox) |
| ||||||
fminsearch |
| ||||||
lsqcurvefit (Optimization Toolbox), lsqnonlin (Optimization Toolbox) | Требуется Optimization Toolbox.
| ||||||
patternsearch (Global Optimization Toolbox) | Требуется Global Optimization Toolbox.
| ||||||
ga (Global Optimization Toolbox) | Требуется Global Optimization Toolbox.
| ||||||
particleswarm (Global Optimization Toolbox) | Требуется Global Optimization Toolbox. sbiofit использует следующие опции по умолчанию для particleswarm алгоритм, кроме:
| ||||||
scattersearch | См. Алгоритм поиска рассеяния. |
The scattersearch
метод реализует глобальный алгоритм оптимизации [2], который решает некоторые проблемы оценки параметра в динамических моделях, таких как сходимость к локальным минимумам.
Алгоритм выбирает подмножество точек из начального пула точек. В этом подмножестве некоторые точки являются лучшими по качеству (то есть самым низким значением функции), а некоторые выбираются случайным образом. Алгоритм итеративно оценивает точки и исследует различные направления вокруг различных решений, чтобы найти лучшие решения. На этом шаге итерации алгоритм заменяет любое старое решение на новое, более качественное. Итерации продолжаются до тех пор, пока не будут достигнуты какие-либо критерии остановки. Затем он запускает локальный решатель на лучшей точке.
Инициализация
Чтобы запустить поиск рассеяния, алгоритм сначала определяет общее число точек, необходимое (NumInitialPoints
). По умолчанию общая сумма 10*N
, где N количество предполагаемых параметров. Он выбирает NumInitialPoints
точки (строки) из InitialPointMatrix
. Если InitialPointMatrix
не имеет достаточного количества точек, алгоритм вызывает функцию, заданную в CreationFcn
чтобы сгенерировать дополнительные точки, необходимые. По умолчанию для генерации этих дополнительных точек используется латинская выборка гиперкуба. Затем алгоритм выбирает подмножество NumTrialPoints
точки из NumInitialPoints
точки. Дробь (FractionInitialBest
) подмножества содержит лучшие точки с точки зрения качества. Остальные точки в подмножестве выбираются случайным образом.
Шаги итерации
Алгоритм итератирует точки в подмножестве следующим образом:
Задайте гиперпрямоугольники вокруг каждой пары точек с помощью относительных качеств (то есть значений функции) этих точек в качестве меры смещения, чтобы создать эти прямоугольники.
Оцените новое решение внутри каждого прямоугольника. Если новое решение превзошло исходное, замените оригинал на новый.
Примените стратегию выхода за рамки к улучшенным решениям и используйте многообещающие направления, чтобы найти лучшие решения.
Запуск локального поиска в каждом LocalSearchInterval
итерация. Используйте LocalSelectBestProbability
вероятность выбрать лучшую точку в качестве начальной точки для локального поиска. По умолчанию решение является случайным, давая равный шанс выбрать лучшую точку или случайную точку из пробных точек. Если новое решение превзошло старое, замените старое на новое.
Замените любую застопорившуюся точку, которая не дает никакого нового превосходящего решения после MaxStallTime
секунд с другой точкой от начального набора.
Оцените критерий остановки. Остановите итерацию, если какие-либо критерии удовлетворены.
Затем алгоритм запускает локальный решатель на лучшую точку.
Критерий остановки
Алгоритм итализируется, пока не достигнет критерия остановки.
Опция остановки | Остановка теста |
---|---|
FunctionTolerance и MaxStallIterations | Относительное изменение значения наилучшей целевой функции за последнее |
MaxIterations | Количество итераций достигает |
OutputFcn |
|
ObjectiveLimit | Лучшее значение целевой функции на итерации меньше или равно |
MaxStallTime | Лучшее значение целевой функции не изменилось в последней |
MaxTime | Время выполнения функции превышает |
Опции для алгоритма вы создаете с помощью struct
.
Опция | Описание |
---|---|
CreationFcn | Указатель на функцию, которая создает дополнительные точки, необходимые для алгоритма. По умолчанию это вектор символов Сигнатура функции: |
Display | Level of display вернулся в командную строку.
|
FractionInitialBest | Числовой скаляр из |
FunctionTolerance | Числовой скаляр из |
InitialPointMatrix | Начальный (или частичный) набор точек. M -by - N действительная конечная матрица, где M - количество точек и N - количество оцененных параметров. Если M
< NumInitialPoints Если M
> NumInitialPoints По умолчанию это начальные преобразованные значения предполагаемых параметров, сохраненные в |
LocalOptions | Опции для локального решателя. Это может быть
|
LocalSearchInterval | Положительное целое число. По умолчанию это |
LocalSelectBestProbability | Числовой скаляр из |
LocalSolver | Вектор символов или строка, задающая имя локального решателя. Поддерживаемые методы Локальный решатель по умолчанию выбирается со следующим приоритетом:
|
MaxIterations | Положительное целое число. По умолчанию это вектор символов |
MaxStallIterations | Положительное целое число. По умолчанию это |
MaxStallTime | Положительная скалярная величина. По умолчанию это |
MaxTime | Положительная скалярная величина. По умолчанию это |
NumInitialPoints | Положительное целое число |
NumTrialPoints | Положительное целое число |
ObjectiveLimit | Скаляр. По умолчанию это |
OutputFcn | Указатель на функцию или cell-массив указателей на функцию. Выходные функции могут считывать итерационные данные и останавливать решатель. По умолчанию это Сигнатура выходной функции
|
TrialStallLimit | Положительное целое число со значением по умолчанию |
UseParallel | Логический флаг для параллельного вычисления целевой функции. По умолчанию это |
XTolerance | Числовой скаляр из Чтобы получить отчет о каждом потенциальном локальном минимуме, установите |
Существует два способа использовать параллельные вычисления для оценки параметра.
'UseParallel'
к истинномуЧтобы включить параллелизацию для sbiofit
, установите пару "имя-значение" 'UseParallel'
на true
. Функция поддерживает несколько уровней параллелизации, но одновременно используется только один уровень. Для неохлажденной подгонки для нескольких групп (или индивидуумов) каждая подгонка выполняется параллельно. Для объединенной подгонки параллелизация происходит на уровне решателя, если решатель поддерживает его. То есть, sbiofit
устанавливает параллельную опцию соответствующего метода оценки (решателя) на true, и вычисления функции возражения выполняются параллельно. Для образца градиенты вычисляются параллельно для основанных на градиентах методов. Если вы выполняете объединенную подгонку с несколькими группами с помощью решателя, который не имеет параллельной опции, симуляции выполняются параллельно для каждой группы во время оптимизации (оценка максимального правдоподобия).
parfeval
или parfor
Вы также можете вызвать sbiofit
внутри parfor
цикл или использовать parfeval
внутри for
-цикл, чтобы выполнить несколько оценок параметров параллельно. Рекомендуется использовать parfeval
потому что эти параллельные оценки выполняются асинхронно. Если одна подгонка вызывает ошибку, она не влияет на другую.
Если вы пытаетесь найти глобальный минимум, можно использовать глобальные решатели, такие как particleswarm
(Global Optimization Toolbox) или ga
(Global Optimization Toolbox) (Требуется 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).
Используя parfeval
рекомендуется
Во-первых, задайте указатель на функцию, который использует локальную функцию sbiofitpar
для оценки. Убедитесь, что функция sbiofitpar
определяется в конце скрипта.
optimfun = @(x) sbiofitpar(m1,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.022 0.127 -1.2843
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(m1,grpData,responseMap,estimatedParam); fitResultPar = [fitResultPar;fitResultTemp]; end
Закройте параллельный пул.
delete(poolObj);
sbiofit
поддерживает глобальные методы оптимизации, а именно ga
(Global Optimization Toolbox) и particleswarm
(Global Optimization Toolbox) (Требуется Global Optimization Toolbox). Чтобы улучшить результаты оптимизации, эти методы позволяют вам запустить гибридную функцию после остановки глобального решателя. Гибридная функция использует конечную точку, возвращенную глобальным решателем, в качестве своей начальной точки. Поддерживаемые гибридные функции:
fminunc
(Optimization Toolbox)
fmincon
(Optimization Toolbox)
patternsearch
(Global Optimization Toolbox)
Убедитесь, что ваша гибридная функция принимает ваши ограничения задачи. То есть, если ваши параметры ограничены, используйте соответствующую функцию (такую как fmincon
или patternsearch
) для ограниченной оптимизации. Если не ограничено, используйте fminunc
, fminsearch
, или patternsearch
. В противном случае, sbiofit
выдает ошибку.
Для иллюстрированного примера смотрите Выполнить гибридную оптимизацию Используя sbiofit.
[1] Yi, T-M., Kitano, H. and Simon, M. (2003). Количественная характеристика дрожжевого гетеротримерного G-белкового цикла. PNAS. 100, 10764–10769.
[2] Gábor, A. and Banga, J.R. (2015). Устойчивая и эффективная оценка параметров в динамических моделях биологических систем. BMC Systems Biology. 9:74.
Чтобы запустить параллельно, установите 'UseParallel'
на true
.
Для получения дополнительной информации смотрите 'UseParallel'
аргумент пары "имя-значение".
EstimatedInfo object
| fminsearch
| groupedData object
| LeastSquaresResults object
| NLINResults object
| OptimResults object
| sbiofitmixed
| ga
(Global Optimization Toolbox) | particleswarm
(Global Optimization Toolbox) | patternsearch
(Global Optimization Toolbox) | fmincon
(Optimization Toolbox) | fminunc
(Optimization Toolbox) | lsqcurvefit
(Optimization Toolbox) | lsqnonlin
(Optimization Toolbox) | nlinfit
(Statistics and Machine Learning Toolbox)
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
Вы щелкнули по ссылке, которая соответствует команде MATLAB:
Выполните эту команду, введя её в командном окне MATLAB.
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.