function [ X ] = pniExtractFeaturesA(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 % % pred = zeros(size(data,1),1); % header_extract = {'Urine','Platelets','BUN','Creatinine','PaO2',... % 'PaCO2','pH','HR','Temp','Age',... % 'FiO2','NIMAP','MAP'}; % fields to extract high/low data from % % [low,h_L] = pnSubsampleData(data, 60*48,'low',header_extract(2:end)); % Lowest data for 24 hours % [high,h_H] = pnSubsampleData(data, 60*48,'high',header_extract(2:end)); % Highest data for 24 hours % % %=== Split into training + test % [ idxK, idxTraining, idxTest ] = pnCreateIndices; % idxTraining = idxTraining(:,4); idxTest = idxTest(:,4); % % trainL = low(idxTraining,:); % trainH = high(idxTraining,:); % testL = low(idxTest,:); % testH = high(idxTest,:); % % %=== Impute data as needed % medianL = nanmedian(trainL,1); % medianH = nanmedian(trainH,1); % % for k=1:size(trainL,2) % trainL(isnan(trainL(:,k)),k) = medianL(k); % testL(isnan(testL(:,k)),k) = medianL(k); % end % for k=1:size(trainH,2) % trainH(isnan(trainH(:,k)),k) = medianH(k); % testH(isnan(testH(:,k)),k) = medianH(k); % end % % train = [trainL, trainH]; % test = [testL, testH]; % % data = zeros(4000,size(train,2)); % data(idxTraining,:) = train; % data(idxTest,:) = test; N = size(data,1); header = {'GCS_LAST','GCS_MAXIMUM','GCS_DELTA','Age_MAX','Lactate_LAST','ALP_MAXIMUM',... 'BUN_MV','BUN_MAXIMUM',... 'WaveCreatClear_4_logabs','Na_Moment4','GCS_Moment3',... 'StatsHCO3_7','StatsGlucose_9','StatsUrine_9_sqr','StatsAge_1','StatsLactate_12_logder_binary',... 'StatsOOR_dUrineDt_3','StatsOOR_NISysABP_6_binary','PaFi'}; %=== Extract all the data here %=== Extract the first row of header X1 = nan(N,5); temp = pnExtractField(data,'GCS'); idxEmpty = ~cellfun(@isempty,temp(:,4)); X1(idxEmpty,1:3) = [ cellfun(@(x) x(end), temp(idxEmpty,4)), ... cellfun(@(x) max(x), temp(idxEmpty,4)), ... cellfun(@(x) x(end)-x(1), temp(idxEmpty,4))]; temp = pnExtractField(data,'Age'); idxEmpty = ~cellfun(@isempty,temp(:,4)); X1(idxEmpty,4) = cellfun(@(x) max(x), temp(idxEmpty,4)); temp = pnExtractField(data,'Lactate'); idxEmpty = ~cellfun(@isempty,temp(:,4)); X1(idxEmpty,5) = cellfun(@(x) x(end), temp(idxEmpty,4)); temp = pnExtractField(data,'ALP'); idxEmpty = ~cellfun(@isempty,temp(:,4)); X1(idxEmpty,6) = cellfun(@(x) max(x), temp(idxEmpty,4)); X2 = nan(N,2); temp = pnExtractField(data,'BUN'); idxEmpty = ~cellfun(@isempty,temp(:,4)); X2(:,1) = idxEmpty; X2(idxEmpty,2) = cellfun(@(x) max(x), temp(idxEmpty,4)); %=== Third row X3 = nan(N,3); temp = pnExtractField(data,'Na'); idxEmpty = ~cellfun(@isempty,temp(:,4)); X3(idxEmpty,2) = cellfun(@(x) ((sum((x-mean(x)).^4)/numel(x)) / (sum((x-mean(x)).^2)/numel(x)).^2)-3,... temp(idxEmpty,4)); temp = pnExtractField(data,'GCS'); idxEmpty = ~cellfun(@isempty,temp(:,4)); X3(idxEmpty,3) = cellfun(@(x) sqrt(numel(x)*(numel(x)-1))/(numel(x)-2)*((sum((x-mean(x)).^3) / numel(x)) / (sum((x-mean(x)).^2)/numel(x)).^1.5),... temp(idxEmpty,4)); %=== Fourth row, stats % 1: min day 1 % 2: median % 3: max % 4: std day1 % 5: kurtosis day1 % 6: skewness day1 % 7: min day 2 % 8: median % 9: max % 10: std day2 % 11: kurtosis day2 % 12: skewness day2 X4 = nan(N,5); temp = pnExtractField(data,'HCO3'); idxDay = cellfun(@(x) x>1440, temp(:,2), 'UniformOutput',false); temp(:,4) = cellfun(@(x,y) x(y), temp(:,4), idxDay, 'UniformOutput',false); idxEmpty = ~cellfun(@isempty,temp(:,4)); X4(idxEmpty,1) = cellfun(@(x) min(x), temp(idxEmpty,4)); temp = pnExtractField(data,'Glucose'); idxDay = cellfun(@(x) x>1440, temp(:,2), 'UniformOutput',false); temp(:,4) = cellfun(@(x,y) x(y), temp(:,4), idxDay, 'UniformOutput',false); idxEmpty = ~cellfun(@isempty,temp(:,4)); X4(idxEmpty,2) = cellfun(@(x) max(x), temp(idxEmpty,4)); temp = pnExtractField(data,'Urine'); idxDay = cellfun(@(x) x>1440, temp(:,2), 'UniformOutput',false); temp(:,4) = cellfun(@(x,y) x(y), temp(:,4), idxDay, 'UniformOutput',false); idxEmpty = ~cellfun(@isempty,temp(:,4)); X4(idxEmpty,3) = cellfun(@(x) sqrt(max(x)), temp(idxEmpty,4)); temp = pnExtractField(data,'Age'); idxDay = cellfun(@(x) x<1441, temp(:,2), 'UniformOutput',false); temp(:,4) = cellfun(@(x,y) x(y), temp(:,4), idxDay, 'UniformOutput',false); idxEmpty = ~cellfun(@isempty,temp(:,4)); X4(idxEmpty,4) = cellfun(@(x) sqrt(min(x)), temp(idxEmpty,4)); temp = pnExtractField(data,'Lactate'); idxDay = cellfun(@(x) x>1440, temp(:,2), 'UniformOutput',false); temp(:,4) = cellfun(@(x,y) x(y), temp(:,4), idxDay, 'UniformOutput',false); idxEmpty = ~cellfun(@isempty,temp(:,4)); X4(:,5) = idxEmpty; X6 = nan(N,4); %=== harder to extract features % dUrineDt temp = pnExtractField(data,'Urine'); idxDay = cellfun(@(x) x<1441, temp(:,2), 'UniformOutput',false); temp(:,2) = cellfun(@(x,y) x(y), temp(:,2), idxDay, 'UniformOutput',false); temp(:,4) = cellfun(@(x,y) x(y), temp(:,4), idxDay, 'UniformOutput',false); idxLen = cellfun(@(x) numel(x) > 2, temp(:,4)); X6(idxLen,1) = cellfun(@(x,y) max(cumtrapz(x,y./x)), temp(idxLen,2), temp(idxLen,4)); % OOR_NISysABP range.NISysABP = {90,180}; temp = pnExtractField(data,'NISysABP'); idxDay = cellfun(@(x) x<1441, temp(:,2), 'UniformOutput',false); temp(:,2) = cellfun(@(x,y) x(y), temp(:,2), idxDay, 'UniformOutput',false); idxEmpty = ~cellfun(@isempty,temp(:,2)); X6(:,2) = zeros(N,1); OORtmp = cellfun(@(x) diff(x), temp(idxEmpty,2), 'UniformOutput',false); X6(idxEmpty,2) = cellfun(@(x) any(x<120), OORtmp); temp = pnPaFi(data); idxEmpty = ~cellfun(@isempty,temp(:,4)); X6(idxEmpty,3) = cellfun(@(x) x(1), temp(idxEmpty,4)); X6(idxEmpty,4) = cellfun(@(x) x(end), temp(idxEmpty,4)); X = [X1,X2,X3,X4,X6]; end