Predicting Mortality of ICU Patients: The PhysioNet/Computing in Cardiology Challenge 2012 1.0.0
(4,741 bytes)
function [prob,died]=physionet2012(tm,category,val)
%
% Submission #4 for the PhysioNet 2012 Challenge, Phase 1.
%
% Written by Alexandros Pantelopoulos, 24/04/2012
%
%
% Inputs:
% -------
% tm - (Nx1 Cell Array) Cell array containing time of measurement
% category- (Nx1 Cell Array) Cell array containing type (category)
% measurement
% value - (Nx1 Cell Array) Cell array containing value of measurement
%
%
% Outputs:
% --------
% prob - (Scalar) Probability value of the patient dying in the
% hospital.
% died - (Logical) Binary classification if the patient is going to
% die in the hospital (1 - Died, 0 - Survived)
%
%
% Requirements:
% -------------
% mat file 'nnet.mat'
%
%
% Description:
% ------------
% My submission calculates the in-hospital death probability using several
% simple statistical features extracted from the timeseries data and a
% neural network classifier. In order to run it requires the mat file
% 'nnet.mat' to be in the same folder. This mat file contains the neural
% network object created by MATLAB after training the classifier. It calls
% the basic MATLAB function 'sim' in order to calculate the probability of
% death in the hospital. In the case this probability is bigger than 0.5,
% then the prediction is made that the patient will die in the hospital.
% In this version the timestamps of the measurements are not utilized in
% the classifier. Finally this function normalizes all features based on
% the mean and stdev values calculated from the training set.
%
% Load the neural network object & the saved mean & stdev values
load('nnet4.mat')
% Set the mean for Gender and MechVent to zero
MEAN(2) = 0; MEAN(4) = 0;
% Basic attribute descriptions
attributes = {'RecordID','Age','Gender','Height','Weight','Albumin','ALP','ALT','AST','Bilirubin','BUN','Cholesterol',...
'Creatinine','DiasABP','FiO2','GCS','Glucose','HCO3','HCT','HR','K','Lactate','Mg','MAP','MechVent','Na','NIDiasABP',...
'NIMAP','NISysABP','PaCO2','PaO2','pH','Platelets','RespRate','SaO2','SysABP','Temp','TroponinI','TroponinT','Urine','WBC'};
numAtributes = length(attributes);
% feature array initialization
numStaticF = 4;
numDynamicF = 36;
numStatsPerA = 5;
numFeatures = numDynamicF*numStatsPerA + numStaticF;
features = zeros(numFeatures,1);
% Extract all the attributes in individual cells
for j = 1:numAtributes
eval([attributes{j} ' = val(strcmp(category,attributes(j)));'])
end
% Extract all the features from the existing attributes
ctr = 0;
% Age
j = 2;
eval(['temp = ' attributes{j} ';']);
if (length(temp)>1)
ctr = ctr + 1;
features(ctr) = max(temp);
else
ctr = ctr + 1;
features(ctr) = temp;
if (temp == -1) % missing value
features(ctr) = MEAN(ctr);
end
end
% Check for outlier values
if (features(ctr) > 110)
features(ctr) = MEAN(ctr);
end
% Gender and Height
for j = 3:4
ctr = ctr + 1;
eval(['temp = ' attributes{j} ';']);
features(ctr) = temp;
if (temp == -1) % missing value
features(ctr) = MEAN(ctr);
end
end
% Check for outlier values
if (features(3) > 240)
features(ctr) = MEAN(3);
end
% MechVent
j = 25;
eval(['temp = ' attributes{j} ';']);
ctr = ctr + 1;
if (isempty(temp))
features(ctr) = 0;
else
features(ctr) = max(temp);
end
% Grab the rest of he features from the remaining attributes
for j = 5:numAtributes
if (strcmp(attributes{j},'MechVent') == 0)
temp = 0;
eval(['temp = ' attributes{j} ';']);
if (isempty(temp))||(sum(temp == -1)>0) % missing value
ctr = ctr + 1;
features(ctr) = MEAN(ctr);
ctr = ctr + 1;
features(ctr) = MEAN(ctr);
ctr = ctr + 1;
features(ctr) = MEAN(ctr);
ctr = ctr + 1;
features(ctr) = MEAN(ctr);
ctr = ctr + 1;
features(ctr) = MEAN(ctr);
else
ctr = ctr + 1;
eval(['features(ctr) = mean(' attributes{j} ');']);
ctr = ctr + 1;
eval(['features(ctr) = min(' attributes{j} ');']);
ctr = ctr + 1;
eval(['features(ctr) = max(' attributes{j} ');']);
ctr = ctr + 1;
eval(['features(ctr) = sqrt(var(' attributes{j} '));']);
ctr = ctr + 1;
eval(['features(ctr) = sum(diff(' attributes{j} '));']);
end
end
end
% Normalize the features
features = (features-MEAN)./STDEV;
% Calculate the probability of in-hospital death
prob = sim(nnet,features);
% Calculate the binary prediction of in-hospital death
TH = 0.5;
died = prob>=TH;
% Scale the prob value (emprically calculated based on the training set
prob = prob.^2;