Подбирайте модель 2D отсека к профилям PK нескольких индивидуумов

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

Предположим, что у вас есть данные о концентрации плазмы препарата от трех индивидуумов, которых вы хотите использовать, чтобы оценить соответствующие фармакокинетические параметры, а именно, объем центрального и периферийного отсека (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Время, CentralConc, и PeripheralConc. Это представляет ход времени плазменных концентраций, измеренных в восьми различных моментах времени и для центральных и для периферийных отсеков после капельного внутривенного введения.

load('data10_32R.mat')

Преобразуйте набор данных в groupedData объект, который является необходимым форматом данных для подходящей функции sbiofit для дальнейшего использования. groupedData объект также позволяет вам установить независимую переменную и имена переменных группы (если они существуют). Установите модули IDВремя, 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 мг/час. Для получения дополнительной информации при подготовке различных стратегий дозирования, смотрите Дозы в Моделях 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.

Смотрите также

Похожие темы