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

File: <base>/sources/steven.l.hamilton_at_gmail.com/entry9/physionet2012.m (9,285 bytes)
%Phase 2 Entry 4 (9) - Hamilton 8/23/12.
%Uses statistics toolbox.
function [prob,died]=physionet2012(tm,category,val)

Xall=var_vals(tm,category,val);
Tx=Xall;

Tx1=sign(Tx).*abs(Tx).^0.073;
X=[Tx Tx1];

b=[-637.759394  -2.839494  -0.255158  -0.003559   0.002912  -0.078425 ...
     -0.178800   0.010406  -0.027513  -0.006074  -1.284829  -0.039269 ...
     -0.375362   0.077386  -0.040079  -0.140393  -0.034464   0.009125 ...
     -0.002369  -0.158427   0.131746  -0.004464  -1.359007  -0.049666 ...
     -0.021945  -0.050222   0.213305   2.021342  -0.000317  -0.049189 ...
     -0.066031 118.724492  -1.548487   2.222297  26.854516   6.588410 ...
     -0.185591  50.662895 -14.946793 -10.657186  14.847681  -0.313795 ...
     29.295945  -0.295035  13.766002  -0.165168  47.788079 103.922041 ...
     14.298825  88.695888   0.154137  -1.843631   5.576434   6.050360  18.161906]'; 

include=[	  4   6   8  11  29  34  36  42  53  54  56  65  86  87  91 ... 
        	100 104 111 151 153 161 173 196 211 214 219 222 242 252 260 ... 
        	284 304 309 336 347 349 371 393 407 410 426 431 433 434 461 ... 
        	476 487 491 494 503 519 522 532 540 ]; 
X=X(1,include);
PHAT=mnrval(b,X);
%prob=PHAT(2);
PHAT_ratio=.4428; %from analysis with set-a
died=0;
if PHAT(2)/PHAT(1) > PHAT_ratio
    died=1;
end


Tx1=sign(Tx).*abs(Tx).^0.046;
X=[Tx Tx1];

b=[-981.519499  -2.366329  -0.240325  -0.075240  -0.201572   0.010833 ...
     -0.027743  -0.005762  -1.237252  -0.039041  -0.359124   0.075271 ...
     -0.038638  -0.137108  -0.033895   0.008735  -0.002377  -0.150412 ...
      0.125555  -0.004568  -1.371826  -0.050619  -0.020975  -0.048473 ...
      0.212094   2.001252  -0.000286  -0.044420  -0.065545 164.967902 ...
     -6.342734   3.601628  47.162864   9.516793  -0.190345  86.851435 ...
    -25.819714 -16.497386  23.276084  -0.295196  47.214111  -0.294153 ...
     23.401073  -0.168441  86.822522 184.913423  24.624774 155.110493 ...
      0.151762  -3.534219  10.221708   9.393324  31.944775]'; 

include=[	  4   6  29  34  36  42  53  54  56  65  86  87  91 100 104 ... 
        	111 151 153 161 173 196 211 214 219 222 242 252 260 284 288 ... 
        	309 336 347 349 371 393 407 410 426 431 433 434 461 476 487 ... 
        	491 494 503 519 522 532 540 ]; 

X=X(1,include);
PHAT=mnrval(b,X);
prob=PHAT(2);
%PHAT_ratio=.4428; %from analysis with set-a
%died=0;
%if PHAT(2)/PHAT(1) > PHAT_ratio
%    died=1;
%end


end

function[Xall]=var_vals(varargin)

inputs={'tm','category','val'};
for n=1:nargin
    if(~isempty(varargin{n}))
        eval([inputs{n} '=varargin{n};'])
    end
end
cap_C={'Albumin' 'ALP' 'ALT' 'AST' 'Bilirubin' 'BUN' 'HCT' 'HR' 'K' 'Lactate' ...
    'Mg' 'MAP' 'PaCO2' 'PaO2' 'pH' 'Platelets' 'RespRate' 'Cholesterol' ...
    'Creatinine' 'DiasABP' 'FiO2' 'GCS' 'Glucose' 'HCO3' 'MechVent' 'Na' ...
    'NIDiasABP' 'NIMAP' 'NISysABP' 'SaO2' 'SysABP' 'Temp' 'TroponinI' 'TroponinT' ...
    'Urine' 'WBC' 'Weight' 'Age' 'Gender' 'Height'};    

ncols=size(cap_C,2); nrows=7;
X_keep=1:ncols*nrows;
Xall=zeros(1,size(X_keep,2));

xtmp =[2.7525       2.5921       2.3694          2.8       1.2114      0.41682       2.5528 ...
       131.22       153.24       129.04       177.56       1.3839      -1.9813       158.25 ...
        215.3       432.91       247.05       607.27         1.39       113.65       475.98 ...
        357.7       725.81       354.19       1154.8         1.39       191.29       763.28 ...
        3.581       5.9506       5.1964       6.7018       1.4036      0.60069        6.309 ...
       36.475       37.252       32.722       41.996       1.5746      0.85382       37.987 ...
       31.873       31.239       28.258       34.072       1.6108     -0.80667       30.745 ...
       93.408       89.823       70.123       118.14       1.9702      -2.7509       89.092 ...
       4.2018       4.1637       3.7155       4.6756       1.6014    -0.076944       4.1043 ...
       3.2945       3.4827       2.2085       5.0312       1.3809     -0.69943       2.9986 ...
       1.9589       2.0659       1.8184       2.3165       1.5768      0.16685       2.1227 ...
       86.378       79.613       55.815       119.93       1.9355      -8.8754       79.916 ...
       40.186       38.827       32.406       47.274       1.6425       2.2454       39.014 ...
       169.59        136.7       85.207       235.31       1.6487      -24.977        119.1 ...
        7.536       7.7541       7.2748       9.3273       1.6514      -2.2315       7.3826 ...
       213.15       197.06       169.78       227.94       1.5509      -17.838       182.95 ...
       22.828       21.184       13.357       31.126       1.9458      -1.2643       21.302 ...
       148.61            0            0            0            0            0            0 ...
        1.752       1.7968       1.5433       2.0659       1.5763     0.045016       1.8254 ...
       61.538       58.624       42.656       82.893       1.9266       2.6115       59.246 ...
      0.76651      0.55773      0.45085      0.83531       1.8081     -0.21026      0.51395 ...
       9.7468       9.5512       7.1515       11.779       1.8974     -0.34758       9.3084 ...
       162.02       148.69       109.12        201.1       1.5812      -16.693       139.38 ...
       22.199       22.244       20.185       24.293       1.5712      0.33446       22.558 ...
            1            1            1            1       1.8631            0            1 ...
       138.57       139.07       136.73       141.29       1.5889      0.63304       139.37 ...
       58.889       54.811       37.584       79.819        1.314       4.8444       54.068 ...
       77.793       73.655       55.893       97.003       1.3098       3.3078       72.912 ...
       119.27       114.59       88.568       144.62       1.3195      -1.0956       114.27 ...
         95.6        95.95       92.941       97.737       1.4636       3.0826       96.075 ...
       124.79       116.94       83.897       158.08       1.9266      0.61414       119.64 ...
         36.4       36.847       35.299        37.91       1.8917      0.30484       36.932 ...
       8.0193       8.3954       6.3222       10.541       1.1394      -1.1581       7.7926 ...
       1.0897       1.1854      0.80534       1.6655       1.1667     -0.11389       1.1029 ...
       289.34       97.936       23.592        447.8       1.9237      -106.39        100.2 ...
       14.451       14.056       11.329       17.069       1.5451     -0.12581        14.03 ...
       74.527        81.42        78.72       82.717       1.9626       2.7016       82.045 ...
         70.2       5198.3            0            0            0            0            0 ...
      0.99336            0            0            0            0            0            0 ...
       78.941            0            0            0            0            0            0];
    
tmp=[repmat('$',size(tm,1),1) char(tm)];

tmp=[reshape(tmp',1,numel(tmp)) '$'];
colons=findstr(':',tmp);  dollas=findstr('$',tmp);
times_mins=zeros(size(colons,2),1);
for k2=1:size(colons,2)
    times_mins(k2)= str2num(tmp(dollas(k2)+1:colons(k2)-1))*60+...
                    str2num(tmp(colons(k2)+1:dollas(k2+1)-1));
end

c=cellstr(category);
params=unique(c);  

X=zeros(nrows,ncols);
   for k2=1:size(params,1)
       idxs=strcmp(params(k2),c);
       t=times_mins(idxs);
       vnam=char(c(idxs,:)); 
       vnam=vnam(1,:);
       vals=val(idxs);
       if findstr(vnam,'Age')
            not_bogus=logical(vals<105);
            vals=vals(not_bogus);
            if isempty(vals)
                vals=64.039; t=0;
            else
                vals=vals(end); t=t(end);
            end
            
       end
       X_col=strcmp(vnam,cap_C);
       nvals=size(vals,1);
       
       if nvals>1
            minval=min(vals);
            maxval=max(vals);
            dt=diff(t);
            nonzero_ts=find(t~=0);
            nonzero_dts=find(dt~=0);
            dvdt=0;
            t_in=0;
            
            if ~isempty(nonzero_ts)&&~isempty(nonzero_dts)
                t_in=max(t)/1440;
                dvdt=(vals(nvals)-vals(1))/((max(t)-min(t))/1440);
            end
            average=mean(vals);
            nonzero_dts=[1;find(dt~=0)+1];
            vals=vals(nonzero_dts);
            t=t(nonzero_dts);
            nvals=size(vals,1);
            
            if nvals==1
                predictors=[vals;0;0;0;0;0;0];
                X(1:nrows,find(X_col==1))=predictors;
                break;
            end
            post=vals(nvals);
            predictors=[vals(1);average; minval;maxval;t_in;dvdt;post ];

       elseif size(vals,1)==1
            predictors=[vals;0;0;0;0;0;0];
       end
       
       if findstr(vnam,'Age')
           predictors=[vals; vals*vals; 0;0;0;0;0];
       end
           
       if sum(X_col)
           X(1:nrows,find(X_col==1))=predictors;
       end
   end
       
   tmp=reshape(X,1,numel(X));
   Xall(1,1:size(X_keep,2))=tmp(X_keep);
   Xall_indx=logical(Xall==0);
   Xall(Xall_indx)=xtmp(Xall_indx);

end