nlmefit
и nlmefitsa
Загрузите выборочные данные.
load indomethacin
Данные в indomethacin.mat
регистрирует концентрации препарата индометацина в кровотоке шести субъектов в течение восьми часов.
Постройте график графика поля точек индометацина в кровотоке, сгруппированной по субъектам.
gscatter(time,concentration,subject) xlabel('Time (hours)') ylabel('Concentration (mcg/ml)') title('{\bf Indomethacin Elimination}') hold on
Specifying Mixed-Effects Models
На странице рассматривается полезная модель для этого типа данных.
Создайте модель через анонимную функцию.
model = @(phi,t)(phi(1)*exp(-exp(phi(2))*t) + ...
phi(3)*exp(-exp(phi(4))*t));
Используйте nlinfit
функция для подгонки модели ко всем данным, игнорируя эффекты конкретного субъекта.
phi0 = [1 2 1 1]; [phi,res] = nlinfit(time,concentration,model,phi0);
Вычислите среднюю квадратичную невязку.
numObs = length(time); numParams = 4; df = numObs-numParams; mse = (res'*res)/df
mse = 0.0304
Супер наложить модель на график поля точек данных.
tplot = 0:0.01:8; plot(tplot,model(phi,tplot),'k','LineWidth',2) hold off
Нарисуйте прямоугольный график невязок по субъектам.
colors = 'rygcbm'; h = boxplot(res,subject,'colors',colors,'symbol','o'); set(h(~isnan(h)),'LineWidth',2) hold on boxplot(res,subject,'colors','k','symbol','ko') grid on xlabel('Subject') ylabel('Residual') hold off
Прямоугольный график невязок по субъектам показывает, что коробки в основном выше или ниже нуля, что указывает на то, что модель не учитывала эффекты конкретного субъекта.
Для расчета эффектов конкретного субъекта подбирайте модель отдельно к данным для каждого субъекта.
phi0 = [1 2 1 1]; PHI = zeros(4,6); RES = zeros(11,6); for I = 1:6 tI = time(subject == I); cI = concentration(subject == I); [PHI(:,I),RES(:,I)] = nlinfit(tI,cI,model,phi0); end PHI
PHI = 2.0293 2.8277 5.4683 2.1981 3.5661 3.0023 0.5794 0.8013 1.7498 0.2423 1.0408 1.0882 0.1915 0.4989 1.6757 0.2545 0.2915 0.9685 -1.7878 -1.6354 -0.4122 -1.6026 -1.5069 -0.8731
Вычислите среднюю квадратичную невязку.
numParams = 24; df = numObs-numParams; mse = (RES(:)'*RES(:))/df
mse = 0.0057
Постройте график графика поля точек данных и наложите модель для каждого субъекта.
gscatter(time,concentration,subject) xlabel('Time (hours)') ylabel('Concentration (mcg/ml)') title('{\bf Indomethacin Elimination}') hold on for I = 1:6 plot(tplot,model(PHI(:,I),tplot),'Color',colors(I)) end axis([0 8 0 3.5]) hold off
PHI
приводит оценки четырех параметров модели для каждого из шести субъектов. Оценки значительно варьируются, но, взятые как 24-параметрическая модель данных, средняя квадратная ошибка 0,0057 является значительным сокращением от 0,0304 в исходной четырехпараметрической модели.
Нарисуйте прямоугольный график невязок по субъектам.
h = boxplot(RES,'colors',colors,'symbol','o'); set(h(~isnan(h)),'LineWidth',2) hold on boxplot(RES,'colors','k','symbol','ko') grid on xlabel('Subject') ylabel('Residual') hold off
Теперь прямоугольный график показывает, что большая модель учитывает большинство эффектов конкретного субъекта. Разброс невязок (вертикальная шкала прямоугольного графика) намного меньше, чем на предыдущем прямоугольном графике, и теперь коробки в основном сосредоточены на нуле.
Хотя модель с 24 параметрами успешно учитывает изменения из-за конкретных предметов в исследовании, она не рассматривает субъектов как представителей большего населения. Распределение дискретизации, из которого берутся субъекты, вероятно, более интересно, чем сама выборка. Цель моделей смешанных эффектов состоит в том, чтобы более широко учитывать специфические для субъекта изменения, поскольку случайные эффекты, варьирующиеся вокруг средств населения.
Используйте nlmefit
функция для подгонки модели смешанных эффектов к данным. Можно также использовать nlmefitsa
вместо nlmefit
.
Следующая анонимная функция, nlme_model
, адаптирует модель с четырьмя параметрами, используемую nlinfit
к синтаксису вызова nlmefit
путем разрешения отдельных параметров для каждого индивидуума. По умолчанию nlmefit
присваивает случайные эффекты всем параметрам модели. Также по умолчанию nlmefit
принимает диагональную ковариационную матрицу (нет ковариации среди случайных эффектов), чтобы избежать сверхпараметеризации и связанных с ней проблем сходимости.
nlme_model = @(PHI,t)(PHI(:,1).*exp(-exp(PHI(:,2)).*t) + ... PHI(:,3).*exp(-exp(PHI(:,4)).*t)); phi0 = [1 2 1 1]; [phi,PSI,stats] = nlmefit(time,concentration,subject, ... [],nlme_model,phi0)
phi = 2.8277 0.7729 0.4606 -1.3459 PSI = 0.3264 0 0 0 0 0.0250 0 0 0 0 0.0124 0 0 0 0 0.0000 stats = struct with fields: dfe: 57 logl: 54.5882 mse: 0.0066 rmse: 0.0787 errorparam: 0.0815 aic: -91.1765 bic: -93.0506 covb: [4x4 double] sebeta: [0.2558 0.1066 0.1092 0.2244] ires: [66x1 double] pres: [66x1 double] iwres: [66x1 double] pwres: [66x1 double] cwres: [66x1 double]
Средняя квадратная ошибка 0,0066 сопоставима с 0,0057 модели с 24 параметрами без случайных эффектов и значительно лучше, чем 0,0304 модели с четырьмя параметрами без случайных эффектов.
Предполагаемая ковариационная матрица PSI
показывает, что отклонение четвертого случайного эффекта по существу равно нулю, что позволяет предположить, что вы можете удалить ее, чтобы упростить модель. Для этого используйте 'REParamsSelect'
Пара "имя-значение", чтобы задать индексы параметров, которые будут моделироваться со случайными эффектами в nlmefit
.
[phi,PSI,stats] = nlmefit(time,concentration,subject, ... [],nlme_model,phi0, ... 'REParamsSelect',[1 2 3])
phi = 2.8277 0.7728 0.4605 -1.3460 PSI = 0.3270 0 0 0 0.0250 0 0 0 0.0124 stats = struct with fields: dfe: 58 logl: 54.5875 mse: 0.0066 rmse: 0.0780 errorparam: 0.0815 aic: -93.1750 bic: -94.8410 covb: [4x4 double] sebeta: [0.2560 0.1066 0.1092 0.2244] ires: [66x1 double] pres: [66x1 double] iwres: [66x1 double] pwres: [66x1 double] cwres: [66x1 double]
Область логарифмической правдоподобности logl
почти идентично тому, что было со случайными эффектами для всех параметров, информационного критерия Акаике aic
уменьшается с -91,1765 до -93,1750, и байесовский информационный критерий bic
уменьшается с -93,0506 до -94,8410. Эти меры поддерживают решение отказаться от четвертого случайного эффекта.
Уточнение упрощенной модели с полной ковариационной матрицей позволяет идентифицировать корреляции среди случайных эффектов. Для этого используйте CovPattern
параметр для задания расположения ненулевых элементов в ковариационной матрице.
[phi,PSI,stats] = nlmefit(time,concentration,subject, ... [],nlme_model,phi0, ... 'REParamsSelect',[1 2 3], ... 'CovPattern',ones(3))
phi = 2.8159 0.8263 0.5570 -1.1478 PSI = 0.4737 0.1145 0.0491 0.1145 0.0323 0.0029 0.0491 0.0029 0.0227 stats = struct with fields: dfe: 55 logl: 58.4419 mse: 0.0061 rmse: 0.0783 errorparam: 0.0781 aic: -94.8838 bic: -97.1744 covb: [4x4 double] sebeta: [0.3018 0.1104 0.1170 0.1675] ires: [66x1 double] pres: [66x1 double] iwres: [66x1 double] pwres: [66x1 double] cwres: [66x1 double]
Предполагаемая ковариационная матрица PSI
показывает, что случайные эффекты на первых двух параметрах имеют относительно сильную корреляцию, и оба имеют относительно слабую корреляцию с последним случайным эффектом. Эта структура в ковариационной матрице более очевидна, если вы преобразовываете PSI
в корреляционную матрицу, использующую corrcov
.
RHO = corrcov(PSI) clf; imagesc(RHO) set(gca,'XTick',[1 2 3],'YTick',[1 2 3]) title('{\bf Random Effect Correlation}') h = colorbar; set(get(h,'YLabel'),'String','Correlation');
RHO = 1.0000 0.9264 0.4735 0.9264 1.0000 0.1070 0.4735 0.1070 1.0000
Включите эту структуру в модель путем изменения спецификации ковариационного шаблона на блочно-диагональную.
P = [1 1 0;1 1 0;0 0 1] % Covariance pattern [phi,PSI,stats,b] = nlmefit(time,concentration,subject, ... [],nlme_model,phi0, ... 'REParamsSelect',[1 2 3], ... 'CovPattern',P)
P = 1 1 0 1 1 0 0 0 1 phi = 2.7830 0.8981 0.6581 -1.0000 PSI = 0.5180 0.1069 0 0.1069 0.0221 0 0 0 0.0454 stats = struct with fields: dfe: 57 logl: 58.0804 mse: 0.0061 rmse: 0.0768 errorparam: 0.0782 aic: -98.1608 bic: -100.0350 covb: [4x4 double] sebeta: [0.3171 0.1073 0.1384 0.1453] ires: [66x1 double] pres: [66x1 double] iwres: [66x1 double] pwres: [66x1 double] cwres: [66x1 double] b = -0.8507 -0.1563 1.0427 -0.7559 0.5652 0.1550 -0.1756 -0.0323 0.2152 -0.1560 0.1167 0.0320 -0.2756 0.0519 0.2620 0.1064 -0.2835 0.1389
Блок-диагональная ковариационная структура уменьшает aic
от -94,9462 до -98,1608 и bic
от -97.2368 до -100.0350 без существенного влияния на логарифмическую правдоподобность. Эти меры поддерживают ковариационную структуру, используемую в конечной модели. Область выхода b
дает предсказания трех случайных эффектов для каждого из шести субъектов. Они объединяются с оценками фиксированных эффектов в phi
для создания модели смешанных эффектов.
Постройте график модели смешанных эффектов для каждого из шести субъектов. Для сравнения также показана модель без случайных эффектов.
PHI = repmat(phi,1,6) + ... % Fixed effects [b(1,:);b(2,:);b(3,:);zeros(1,6)]; % Random effects RES = zeros(11,6); % Residuals colors = 'rygcbm'; for I = 1:6 fitted_model = @(t)(PHI(1,I)*exp(-exp(PHI(2,I))*t) + ... PHI(3,I)*exp(-exp(PHI(4,I))*t)); tI = time(subject == I); cI = concentration(subject == I); RES(:,I) = cI - fitted_model(tI); subplot(2,3,I) scatter(tI,cI,20,colors(I),'filled') hold on plot(tplot,fitted_model(tplot),'Color',colors(I)) plot(tplot,model(phi,tplot),'k') axis([0 8 0 3.5]) xlabel('Time (hours)') ylabel('Concentration (mcg/ml)') legend(num2str(I),'Subject','Fixed') end
Если очевидные выбросы в данных (видимые на предыдущих прямоугольных графиках) игнорируются, график нормальной вероятности невязок показывает разумное согласие с допущениями модели об ошибках.
clf; normplot(RES(:))