exponenta event banner

Соответствуйте модели 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, 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.

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

Похожие темы