Predicting Mortality of ICU Patients: The PhysioNet/Computing in Cardiology Challenge 2012 1.0.0

File: <base>/sources/alistairewj_at_gmail.com/entry4/pniExtractFeaturesF.m (3,623 bytes)
function [ X ] = pniExtractFeaturesF(data)
%PNIALISTAIR	Alistair's initial entry
%	[ pred ] = pniAlistair(data) calculates a mortality prediction for each
%	each row (observation/subject) in data
%
%   The score uses the following variables:
%
%
%	Inputs:
%		data    - Cell array of data.
%           Column 1 - Subject IDs
%           Column 2 - Time stamp vectors for each subject
%           Column 3 - Feature name vectors for each subject
%           Column 4 - Data value vectors for each subject
%
%	Outputs:
%		pred   - Column vector of predictions
%
%	Example
%       %=== Load data in
%       load('data_processed_cell.mat');
%
%       %=== Calculate prediction
%       [ score ] = pniAlistair(data);
%
%	See also PNMAIN PNPREPROCESSDATA

%	References:
%       Physionet Challenge 2012
%       http://physionet.org/challenge/2012/

%	Copyright 2012 Alistair Johnson

%	$LastChangedBy: alistair $
%	$LastChangedDate: 2012-04-24 17:46:42 +0100 (Tue, 24 Apr 2012) $
%	$Revision: 339 $
%	Originally written on GLNXA64 by Alistair Johnson, 15-Apr-2012 14:40:03
%	Contact: alistairewj@gmail.com
%

N = size(data,1);

%=== Generate labels
header={'BUN','Creatinine','GCS',...
    'HR','NIMAP',...
    'RespRate','Temp','Urine','WBC',...
    'Weight','pH',...
    'Albumin',...
    'Bilirubin',};
header2 = {'Age','Gender','Height'};

%=== Pre-allocate
X.last = nan(N,numel(header));
X.total = nan(N,numel(header));
X.median = nan(N,numel(header));
X.maximum = nan(N,numel(header));
X.minimum = nan(N,numel(header));

for k=1:numel(header)
    temp = pnExtractField(data,header{k});
    idxEmpty = ~cellfun(@isempty,temp(:,4));
    X.last(idxEmpty,k) = cellfun(@(x) x(end), temp(idxEmpty,4));
    X.total(idxEmpty,k) = cellfun(@(x) numel(x), temp(idxEmpty,4));
    X.median(idxEmpty,k) = cellfun(@(x) median(x), temp(idxEmpty,4));
    X.maximum(idxEmpty,k) = cellfun(@(x) max(x), temp(idxEmpty,4));
    X.minimum(idxEmpty,k) = cellfun(@(x) min(x), temp(idxEmpty,4));
end

additional = nan(N,numel(header2));
for k=1:numel(header2)
    temp = pnExtractField(data,header2{k});
    idxEmpty = ~cellfun(@isempty,temp(:,4));
    additional(idxEmpty,k) = cellfun(@(x) x(end), temp(idxEmpty,4));
end

pafi = pnPaFi(data);
pafilast = nan(N,1);
pafimedian = nan(N,1);
pafimaximum = nan(N,1);
pafiminimum = nan(N,1);
idxEmpty = ~cellfun(@isempty,pafi(:,4));
pafilast(idxEmpty) = cellfun(@(x) x(end), pafi(idxEmpty,4));
pafimedian(idxEmpty) = cellfun(@(x) median(x), pafi(idxEmpty,4));
pafimaximum(idxEmpty) = cellfun(@(x) max(x), pafi(idxEmpty,4));
pafiminimum(idxEmpty) = cellfun(@(x) min(x), pafi(idxEmpty,4));

%=== Combine into one data matrix
X = [X.last,X.total,X.median,X.maximum,X.minimum,additional,...
    pafilast,pafimedian,pafimaximum,pafiminimum];

%=== Add in severity score/day difference
[ X1 ] = pniAndrew(data);
[ X2 ] = pniLouis(data);

X = [X,X1,X2];
idxRemove = [6,12,13,19,25,26,32,38,39,45,51,52,58,64,65];
X(:,idxRemove)=[];



medianVals = [19,0.900000000000000,15,85,75,37,90,11.1000000000000,78.6500000000000,7.40000000000000,3,3,13,55,25,14,38,3,37,7,18.5000000000000,0.900000000000000,14,86,74.3300000000000,37.0500000000000,80,11.3500000000000,78.4000000000000,7.39000000000000,22,1,15,110,96,37.8000000000000,450,13.5000000000000,79.3000000000000,7.44000000000000,16,0.800000000000000,7,68,58.6700000000000,35.9000000000000,10,9.50000000000000,76,7.32000000000000,67,1,152.400000000000,205,221,350,130,51,0.467200822797920;];
for k=1:size(X,2)
    X(isnan(X(:,k)),k) = medianVals(k);
end


end