В этом примере показано, как преобразовать данные выживания в форму процесса подсчета, а затем построить модель пропорциональных рисков Кокса с зависимыми от времени ковариатами.
Модель Кокса с зависящими от времени ковариатами требует, чтобы данные выживания находились в форме процесса подсчета, а не в стандартной компоновке. Чтобы увидеть разницу между данными выживания в стандартном формате и в форме процесса подсчета, загрузите следующие примеры данных.
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
Для получения подробной информации о том, как оценить модель пропорциональных рисков Кокса, см. Модель пропорциональных рисков Кокса для цензурированных данных.