В этом примере показано, как подогнать и проанализировать модель пропорциональных рисков Кокса с использованием CoxModel объект. Модели пропорциональных рисков Кокса относятся к данным о сроке службы или времени отказа. Справочную информацию см. в разделе Что такое анализ выживания? и модель пропорциональных рисков Кокса.
Создайте данные для трех моделей жизненного цикла со следующими типами уровней опасности. Эти модели соответствуют трем уровням стратификации; см. Расширение модели пропорциональных рисков Кокса.
Ванна, частота отказов которой в начале высока, уменьшается до низкого уровня, затем поднимается к постоянному уровню
Логарифмическое увеличение: 10
Константа
Три модели имеют общий предиктор с тремя множителями для базовых уровней опасности:
1
1/20
1/100
В общей сложности данные имеют девять типов членов населения, по одному от каждого уровня стратификации и по одному от каждого уровня предиктора. Функции для создания ванны и логарифмических коэффициентов опасности приведены в разделе Вспомогательные функции в конце этого примера.
Постройте график трех уровней опасности, когда значение предиктора равно 1.
t = linspace(1,40); plot(t,hazard(t),t,log(t)/10,t,1/4*ones(size(t))) legend('Hazard 1','Hazard 2','Hazard 3','Location','northeast') ylim([0 1])

Создайте псевдослучайные данные для времени жизни, связанного с девятью моделями. Создайте 9000 выборок, выбранных случайным образом (около 1000 для каждого типа), инвертировав кумулятивные распределения. (Дополнительные сведения см. в разделе Выборка обратного преобразования.)
N = 9000; rng default mults = [1;1/20;1/100]; % Three predictors strata = randi(3,N,1); % Three strata t1 = zeros(N,1); a0 = randi(3,N,1); % Predictor a1 = mults(a0); v1 = rand(N,1); for i = 1:N switch strata(i) case 1 % Bathtub t1(i) = zeropt(a1(i),v1(i)); case 2 % Logarithmic t1(i) = zeroptold(a1(i),v1(i)); case 3 % Constant t1(i) = 1 + exprnd(4/a1(i)); end end
Поместите данные в таблицу.
a3 = categorical(a1); tbldata = table(t1,a3,strata,'VariableNames',["Lifetime" "Predictors" "Strata"]);
Подберите модель пропорциональных рисков Кокса к данным таблицы.
coxMdl = fitcox(tbldata,'Lifetime ~ Predictors',"Stratification",'Strata');
Постройте график вероятности выживания как функции времени для значения предиктора 1 и три уровня стратификации.
oo = categorical(1); plotSurvival(coxMdl,[oo;oo;oo],[1;2;3]) xlim([1,30])

Постройте график вероятности выживания как функции времени для значения предиктора 1/20 и три уровня стратификации.
tt = categorical(1/20); figure plotSurvival(coxMdl,[tt;tt;tt],[1;2;3]) xlim([1,200])

Постройте график вероятности выживания как функции времени для значения предиктора 1/100 и три уровня стратификации.
uu = categorical(1/100); figure plotSurvival(coxMdl,[uu;uu;uu],[1;2;3]) xlim([1,1000])

Даже несмотря на то, что уровни риска пропорциональны для различных предикторов, три графика выживания не пропорциональны.
Изучите коэффициенты подогнанной модели.
disp(coxMdl.Coefficients)
Beta SE zStat pValue
______ ________ ______ ______
Predictors_0.05 1.5301 0.031783 48.143 0
Predictors_1 4.5593 0.052149 87.427 0
Обратите внимание, что pValue записи 0, что означает, что указанный предиктор Beta значения не равны нулю.
Просмотрите доверительные интервалы для коэффициентов модели на уровне значимости 0,01.
coefci(coxMdl,0.01)
ans = 2×2
1.4483 1.6120
4.4249 4.6936
Чтобы вывести опасность для предиктора уровня 0,01, вспомните определение модели Кокса:
∑xijbj).
fitcox функция использует фиктивные переменные со ссылочной группой для обработки категориальных данных. В этом случае функция обрабатывает предиктор 0,01 уровня как контрольную группу и кодирует предиктор как все 0 при подгонке модели. Если ввести все 0 в функцию опасности, вы получите
(t) exp (0) = h0 (t).
) - базовая опасность, которая хранится вcoxMdl.Hazard. Поэтому, чтобы получить опасность для предиктора уровня 0,01, вы можете изучить coxMdl.Hazard. Постройте график базовой кумулятивной опасности для трех уровней стратификации.
figure hold on for i = 1:3 pred3 = find(coxMdl.Hazard(:,3) == i); % Find indices of stratification i plot(coxMdl.Hazard(pred3,1),coxMdl.Hazard(pred3,2)) end xlabel('Time') ylabel('Cumulative Hazard') xlim([1 300]) legend('X = 0.01, Stratification 1',... 'X = 0.01, Stratification 2',... 'X = 0.01, Stratification 3','Location','northwest') hold off

Кумулятивный риск для других предикторных значений равен ) умножить на базовый кумулятивный риск, где Beta является выводимым коэффициентом.
disp(exp(coxMdl.Coefficients.Beta))
4.6188 95.5127
Эти относительные значения опасности близки к теоретическим значениям для данных, которые были сгенерированы с помощью множителей 1, 1/20 и 1/100. Базовое значение соответствует множителю 1/100, поэтому теоретические множители равны 5 и 100.
Просмотр linhyptest таблица.
linhyptest(coxMdl)
ans=2×2 table
Predictor pValue
___________________ ______
{'Empty Model' } 0
{'Predictors_0.05'} 0
Опять же, модель требует 1/20 предиктор значения и предиктор значения 1.
Проверьте, поддерживают ли данные гипотезу о том, что данные взяты из модели пропорциональных рисков Кокса.
supports = coxMdl.ProportionalHazardsPValueGlobal
supports = 0.9730
Нулевая гипотеза для этого теста заключается в том, что данные взяты из модели пропорциональных рисков Кокса. Чтобы отвергнуть эту гипотезу, supports должен быть меньше 0,05 или какой-либо другой небольшой уровень значимости. Статистика указывает на поддержку гипотезы о том, что данные согласуются с моделью Кокса.
Рассчитать коэффициент опасности для значений предиктора 1, 1/20, и 1/100 по сравнению с базовым уровнем 0 для трех уровней стратификации.
hazards = hazardratio(coxMdl,... categorical([1;1;1;1/20;1/20;1/20;1/100;1/100;1/100]),... [1;2;3;1;2;3;1;2;3],'Baseline',0)
hazards = 9×1
95.5127
95.5127
95.5127
4.6188
4.6188
4.6188
1.0000
1.0000
1.0000
Коэффициенты опасности близки к теоретическим значениям 100, 5 и 1, как пояснялось в предыдущем разделе. Коэффициенты риска не зависят от уровня стратификации.
Уровень стратификации 3 имеет постоянную степень опасности 1/4. Теоретически постоянная степень опасности означает экспоненциальную функцию выживания, логарифмом которой является прямая линия. Постройте график выживания стратификации уровня 3 с использованием значения предиктора 1/20, что приводит к экспоненциальной скорости 1/80.
tt = categorical(1/20); h = figure; axes1 = axes('Parent',h); plotSurvival(coxMdl,axes1,tt,3); xlim([1 400]); axes1.YScale = 'log'; hold on tms = linspace(1,400); semilogy(tms,exp(-tms/80),'r--') hold off

Данные соответствуют теоретической строке для вероятностей, значительно превышающих 1/100.
Эта функция создает коэффициент опасности ванны.
function h = hazard(x) h = exp(-2*(x - 1)) + (1 + tanh(x/10 - 3)); end
Эта функция создает интеграл коэффициента опасности ванны из 1 кому x.
function eh = exphazard(x) eh = 1/2 - exp(-2*(x-1))/2; eh2 = (10*log(cosh(x/10 - 3)) - 10*log(cosh(1/10 - 3)) + x - 1); eh = eh + eh2; end
Эта функция используется для определения корня кумулятивного коэффициента опасности с помощью множителя a выравниваться v.
function zz = zeropt(a,v) zz = fzero(@(x)(1 - exp(-a*exphazard(x)) - v),[1 100*max(1,1/a)]); end
Эта функция создает интеграл логарифмической степени опасности с умножителем 1/10 от 1 кому x.
function cr = cumrisk(x) cr = 1/10*(x.*(log(x) - 1) + 1); end
Эта функция используется для определения корня кумулятивного коэффициента опасности с помощью множителя a выравниваться v.
function zz = zeroptold(a,v) zz = fzero(@(x)(1 - exp(-a*cumrisk(x)) - v),[1 50*max(1,1/a)]); end