В этом примере показано, как преобразовать данные о выживании в форму процесса подсчета и затем создать модель пропорциональных рисков Кокса с зависящими от времени ковариатами.
Модель Кокса с зависящими от времени ковариатами требует, чтобы данные о выживании находились в форме процесса подсчета, а не в стандартном размещении. Чтобы увидеть различие между данными о выживании в стандартном размещении и в форме процесса подсчета, загрузите следующие выборочные данные.
load simplesurvivaldata
Эти выборочные данные содержат две таблицы: relapseS
и relapseCP
. Эти две таблицы представляют одни и те же простые данные о выживании в стандартном размещении и в форме процесса подсчета, соответственно.
Отображение данных в стандартном размещении.
relapseS
relapseS=2×5 table
ID Time Censoring Age StopTreatment
__ ____ _________ ___ _____________
1 5 0 20 NaN
2 20 1 30 12
Эти данные представляют двух пациентов, чей статус лечения изменяется с течением времени. Пациент 1 не принимал лечение в течение интервала с 0 по 5 неделю и рецидивировал в конце интервала. Пациент 2 принимал лечение в течение интервала от 0 до 12 недели, но не в течение интервала от 12 до 20 недели. Пациент 2 не рецидивировал и покинул исследование после 20 недели.
Теперь отобразите те же данные в форме процесса подсчета.
relapseCP
relapseCP=3×6 table
ID tStart tStop Censoring Age TreatmentStatus
__ ______ _____ _________ ___ _______________
1 0 5 0 20 0
2 0 12 1 30 1
2 12 20 1 30 0
В форме процесса подсчета каждая строка представляет интервал риска (tStart,tStop]
вместо одного значения времени события. Censoring
0, если событие наблюдается в конце интервала риска, и 1, если это не так TreatmentStatus.
соответствует зависящей от времени ковариате, которая представляет ту же информацию с StopTreatment
в стандартном размещении. Обратите внимание, что модель Кокса принимает зависящие от времени ковариаты, чтобы быть постоянными в каждом интервале риска.
Затем загрузите выборочные данные для преобразования.
load survivaldatacp
Эти выборочные данные содержат таблицу labS
, которые моделируют данные о выживаемости, включая повторное измерение для каждого пациента в стандартном размещении.
Отобразите моделируемые данные о выживании в стандартном размещении.
labS
labS=6×7 table
ID Time Censoring Sex Lab_0 Lab_50 Lab_100
__ ____ _________ ___ _____ ______ _______
1 46 0 1 0.3 NaN NaN
2 138 1 0 0.2 0.23 0.39
3 94 0 1 0.18 0.22 NaN
4 50 0 0 0.21 0.2 NaN
5 106 0 0 0.25 0.21 0.42
6 98 0 0 0.21 0.22 NaN
В стандартном размещении каждая строка таблицы показывает информацию для одного пациента.
ID
указывает идентификатор пациента. Вы не включаете ID
как вход модели Кокса. Включите ID
в наборе данных, чтобы подтвердить, что набор данных правильно преобразован в форму процесса подсчета.
Time
представляет время до события в днях, что соответствует переменной отклика.
Censoring
имеет цензурную информацию для каждого пациента, где 1 указывает на цензурные данные, а 0 указывает, что точное время до события наблюдается в конце периода наблюдения.
Sex
является независимым от времени предиктором, где 1 указывает на самку, а 0 указывает на самку.
Lab_0
, Lab_50
, и Lab_100
представление трех последовательных лабораторных результатов, измеренных на 0, 50 и 100 день, которые соответствуют зависящему от времени предиктору.
Чтобы преобразовать данные выживания labS
для подсчета формы процесса выполните код ниже. Этот код преобразует Time
в интервал риска (tStart,tStop]
и объединяет три вектора зависящего от времени предиктора, Lab_0
, Lab_50
, и Lab_100
, в один вектор, Lab
.
mTime = [0 50 100]; % Measurement time threeLabs = [labS.Lab_0 labS.Lab_50 labS.Lab_100]; nLabMeasure = sum(sum(~isnan(threeLabs))); % Number of lab measurements data = zeros(nLabMeasure,6); % One row for each observation oID = 0; % Observation ID for i = 1 : size(labS,1) idx = find(mTime <= labS.Time(i)); for j = 1 : length(idx)-1 oID = oID + 1; data(oID,:) = [labS.ID(i) mTime(j:j+1) 1 labS.Sex(i) threeLabs(i,j)]; end oID = oID + 1; data(oID,:) = [labS.ID(i) mTime(length(idx)) labS.Time(i) ... labS.Censoring(i) labS.Sex(i) threeLabs(i,length(idx))]; end labCP = table(data(:,1),data(:,2),data(:,3),data(:,4),data(:,5),data(:,6), ... 'VariableNames', {'ID','tStart','tStop','Censoring','Sex','Lab'});
Отобразите данные о выживании в форме процесса подсчета.
labCP
labCP=13×6 table
ID tStart tStop Censoring Sex Lab
__ ______ _____ _________ ___ ____
1 0 46 0 1 0.3
2 0 50 1 0 0.2
2 50 100 1 0 0.23
2 100 138 1 0 0.39
3 0 50 1 1 0.18
3 50 94 0 1 0.22
4 0 50 1 0 0.21
4 50 50 0 0 0.2
5 0 50 1 0 0.25
5 50 100 1 0 0.21
5 100 106 0 0 0.42
6 0 50 1 0 0.21
6 50 98 0 0 0.22
В форме процесса подсчета каждая строка таблицы labCP
показывает информацию одного наблюдения, соответствующего одному интервалу риска. Обратите внимание, что модель Кокса принимает Lab
быть постоянным в интервале риска (tStart,tStop]
. Значение в Censoring
0, если событие наблюдается в конце интервала риска, и 1, если событие не наблюдается.
Для примера пациент 3 имеет два лабораторных измерения на 0 и 50 день, так что существует две строки данных для пациента 3 в форме процесса подсчета. Модель Кокса предполагает, что результаты лаборатории 0,18 и 0,22 являются постоянными в интервале (0,50] и (50,94], соответственно. Censoring
1 в (0,50] и 0 в (50,94], потому что точное время наступления 3 пациента наблюдается в день 94.
Найдите пациента, у которого есть интервал риска нулевой длины.
idxInvalid = labCP.ID(find(labCP.tStart == labCP.tStop))
idxInvalid = 4
Проверьте данные для пациента 4.
labCP(find(labCP.ID==idxInvalid),:)
ans=2×6 table
ID tStart tStop Censoring Sex Lab
__ ______ _____ _________ ___ ____
4 0 50 1 0 0.21
4 50 50 0 0 0.2
Время до наступления пациента 4 совпадает с днем 50 измерения. Однако (50,50] является недопустимым интервалом риска для модели Кокса, потому что модель не принимает интервал нулевой длины. Установите допустимый интервал риска. В качестве суммы корректировки можно выбрать любое значение, меньше единицы времени. Выбор суммы корректировки произволен, и она не меняет результат.
idxAdjust = find(labCP.ID==idxInvalid); labCP.tStop(idxAdjust(1)) = labCP.tStop(idxAdjust(1))-0.5; labCP.tStart(idxAdjust(2)) = labCP.tStart(idxAdjust(2))-0.5; labCP(idxAdjust,:)
ans=2×6 table
ID tStart tStop Censoring Sex Lab
__ ______ _____ _________ ___ ____
4 0 49.5 1 0 0.21
4 49.5 50 0 0 0.2
Подбор модели пропорциональных рисков Кокса с независимой от времени переменной Sex
и зависящую от времени переменную Lab
.
X = [labCP.Sex labCP.Lab]; T = [labCP.tStart labCP.tStop]; b = coxphfit(X,T,'Censoring',labCP.Censoring,'Baseline',0)
b = 2×1
2.0054
29.7530
Для получения дополнительной информации о том, как оценить модель пропорциональных опасностей Кокса, см. Модель пропорциональных опасностей Кокса для цензурированных данных.