about summary refs log tree commit diff
path: root/sourcecodes/parameter_learning/testSetPredictions.m
diff options
context:
space:
mode:
Diffstat (limited to 'sourcecodes/parameter_learning/testSetPredictions.m')
-rw-r--r--sourcecodes/parameter_learning/testSetPredictions.m361
1 files changed, 361 insertions, 0 deletions
diff --git a/sourcecodes/parameter_learning/testSetPredictions.m b/sourcecodes/parameter_learning/testSetPredictions.m
new file mode 100644
index 00000000..0fff197d
--- /dev/null
+++ b/sourcecodes/parameter_learning/testSetPredictions.m
@@ -0,0 +1,361 @@
+function  [ ] = testSetPredictions( pre )
+   %   
+   %  This function will make predictions for the cases included
+   %   in the uploaded data file.
+   %      
+   %
+   %  Input: ???ts_input.txt
+   %    This is the input file that is uploaded to BNW.
+   %    It is directly written out by the BNW php code with no modification.
+   %    The file format is a header line containing the variable that you want to predict.
+   %     Then, there is a second header line with the variable names
+   %     Finally, the file contains the data, with each case in a row.
+   %     If there is missing data, an "NA" should be entered.
+   %
+   %  Output: ???ts_output.txt
+   %
+   % It is called by the run_test_set script in the 'sourcecodes' directory.
+
+
+%  open file for input, include error handling
+dfile=strcat(pre,'ts_upload.txt');
+
+fin = fopen(dfile,'r');
+if fin < 0
+   error(['Could not open ',dfile,' for input']);
+end
+
+% Get the number of cases (the number of rows in the file excluding the header)
+ntestcases = fskipl(fin,Inf) - 2;
+
+frewind(fin);
+
+
+
+% Read in first line to get the node label of the variable that should be predicted.
+buffer = fgetl(fin);
+[predict_label,buffer] = strtok(buffer);
+
+% Read in second line to get the number of nodes and the node labels.
+buffer = fgetl(fin);    %get header line as a string
+nnodes = numel(strfind(buffer,"\t")) + 1;
+labels_test = cell(1,nnodes);
+for j=1:nnodes
+    [next,buffer] = strtok(buffer);
+    labels_test{j} = next;
+end
+
+% Read in the test_data
+data_test_temp = cell(ntestcases,nnodes);
+for i = 1:ntestcases
+    buffer = fgetl(fin);
+    for j = 1:nnodes
+         [next,buffer] = strtok(buffer);
+         data_test_temp{i,j} = next;
+    end
+end
+
+
+% Read in the training (original) data and network structure.
+sfile=strcat(pre,'structure_input.txt');
+dfile=strcat(pre,'continuous_input.txt');
+nnodefile=strcat(pre,'nnode.txt');
+fnnode = fopen(nnodefile,'r');
+nnodes = fscanf(fnnode,'%d');
+
+Std_flag=true;
+[labels,cases,bnet]=readInput(dfile,sfile,nnodes,Std_flag);
+[bnet] = parameterLearning(bnet,cases);
+
+%Get node id in actual network for variable to be predicted
+for i=1:nnodes
+   if strcmp(labels(i),predict_label)
+	predict_node = i;
+   end
+end
+
+%Reformat test data so the columns match bnet structure
+label_map = cell(2,nnodes);
+for i=1:nnodes
+    label_map{1,i} = labels_test{i};
+    for j=1:nnodes
+	if strcmp(labels_test(i),labels(j))
+		label_map{2,i} = j;
+		break
+	end
+     end
+end
+
+
+data_test = cell(ntestcases,nnodes);
+for i=1:nnodes
+   data_test(:,label_map{2,i}) = data_test_temp(:,i);
+end
+
+%%Read in training data means and standard deviations
+means_orig=cell(1,nnodes);
+stdevs_orig=cell(1,nnodes);
+labels_orig=cell(1,nnodes);
+%Read in original means and standard deviations
+mapfile = strcat(pre,'map.txt');
+fmap = fopen(mapfile,'r');
+for i=1:nnodes
+    buffer = fgetl(mapfile);
+    temp = cell(1,3);
+    for j=1:3
+        [next,buffer] = strtok(buffer);
+        temp{j} = next;
+    end
+    labels_orig{i} = temp{1};
+    means_orig{i} = str2num(temp{3});
+    stdevs_orig{i} = str2num(temp{2});
+end
+fclose(fmap);
+%Need to map the means and stdevs to the correct labels
+means = cell(1,nnodes);
+stdevs = cell(1,nnodes);
+for i = 1:nnodes
+    for j = 1:nnodes
+       if strcmp(labels{i},labels_orig{j})
+          means{i} = means_orig{j};
+          stdevs{i} = stdevs_orig{j};
+          break
+       end
+    end
+end
+
+%Get mapping of discrete levels.
+max_states = max(bnet.node_sizes) + 1;
+disc_nodes = size(bnet.dnodes,2);
+levelfile = strcat(pre,'nlevels.txt');
+flevels = fopen(levelfile,'r');
+levels = cell(disc_nodes,max_states);
+ndisc_nodes = 0;
+for i=1:disc_nodes
+    ndisc_nodes = ndisc_nodes + 1;
+    buffer = fgetl(flevels);
+     for j = 1:max_states
+       [next,buffer] = strtok(buffer);
+       if j == 1
+          levels{i,j} = next;
+       else
+          levels{i,j} = next;
+       end
+       if length(buffer) < 1
+        break
+       end
+     end
+end
+
+%Standardize continuous data and map data to levels.
+for i=1:nnodes
+  if bnet.node_sizes(i) == 1
+    for j=1:ntestcases
+	if !strcmp(data_test{j,i},"NA")
+          data_test{j,i} = (str2num(data_test{j,i}) - means{i})/stdevs{i};
+        end
+     end
+  else
+     for j=1:ntestcases
+	labels{i}
+        if !strcmp(data_test{j,i},"NA")
+	    for jj = 1:size(levels,1)
+		if strcmp(labels{i},levels{jj,1})
+		   break
+                endif
+            end
+	    for k = 1:bnet.node_sizes(i)
+               if strcmp(data_test{j,i},levels{jj,k+1})
+                 data_test{j,i} = k;
+               end
+            end
+        end
+     end
+end
+end
+
+
+%Now make predictions
+predict_cases = bnet.node_sizes(predict_node);
+
+if predict_cases == 1
+      ts_continuous(pre,bnet,nnodes,predict_label,predict_node,data_test,means,stdevs)
+else
+      pred_levels = cell(1,predict_cases);
+      for i = 1:disc_nodes
+	if strcmp(levels{i,1},predict_label);
+            for j = 1:predict_cases
+                pred_levels{j} = levels{i,j+1};
+	    end
+            break
+         end
+      end
+      ts_discrete(pre,bnet,nnodes,predict_label,predict_node,data_test,pred_levels,predict_cases)
+end
+
+%delete(dfile)
+
+end
+
+function ts_continuous(pre,bnet,nnodes,predict_label,predict_node,data_test,means,stdevs)
+
+ntestcases = size(data_test,1);
+
+predictions = zeros(ntestcases,2);
+
+for i = 1:ntestcases
+   evidence = data_test(i,:);
+   evidence{predict_node} = {};
+   for j=1:nnodes
+      if strcmp(evidence{j},"NA")
+          evidence{j} = {};
+      end
+   end
+   engine = jtree_inf_engine(bnet);
+   [engine,loglik] = enter_evidence(engine,evidence);
+   predict = marginal_nodes(engine,predict_node);
+   adj_mu = predict.mu*stdevs{predict_node}+means{predict_node};
+   adj_sigma = stdevs{predict_node}*predict.Sigma;
+   predictions(i,1) = adj_mu;
+   predictions(i,2) = adj_sigma;
+end
+
+%Open output file.
+filename = strcat(pre,'ts_output.txt');
+fileID = fopen(filename,'w');
+
+fprintf(fileID,'Variable that was predicted: %s\n\n',predict_label);
+
+
+%Calculate RMSEP (root mean square error of prediction) and q^2
+%First, calculate TSS (total sum of squares) and
+%  PRESS (sum of squares of prediction errors)
+%Get rid of 'NA' data for predicted data.
+actual_values = [];
+predictions_removeNA = [];
+for i=1:ntestcases
+   if !strcmp(data_test(i,predict_node),'NA')
+        actual_values = [actual_values, cell2num(data_test(i,predict_node))]
+	predictions_removeNA = [predictions_removeNA,predictions(i,1)]
+   end
+end
+
+size(actual_values)
+size(predictions_removeNA)
+
+average = mean(actual_values);
+average = average*stdevs{predict_node}+means{predict_node};
+tss = 0;
+press = 0;
+for i=1:length(actual_values)
+	actual_values(i) = actual_values(i)*stdevs{predict_node}+means{predict_node};
+	tss = (actual_values(i)-average)^2 + tss;
+	press = (predictions_removeNA(i)-actual_values(i))^2 + press;
+end
+rmsep = sqrt(press/length(actual_values));
+q_squared = 1 - press/tss;
+
+%% Print rmseq and q^2
+fprintf(fileID,'RMS error of predictions: %6.4f\n',rmsep);
+fprintf(fileID,'Q^2 of predictions: %6.4f\n\n',q_squared);
+
+
+%%Print the predictions
+fprintf(fileID,'Predicted mean and standard deviation for each case:\n');
+fprintf(fileID,'CaseRow\tActualValue\tPredictionMean\tPredictionStDev\n');
+for i = 1:ntestcases
+     if strcmp(data_test{i,predict_node},"NA")
+	fprintf(fileID,'%i\t%s\t',i,data_test{i,predict_node});
+     else
+        temp = data_test{i,predict_node}*stdevs{predict_node}+means{predict_node};
+	fprintf(fileID,'%i\t%6.4f\t',i,temp);
+     end
+     fprintf(fileID,'%6.4f\t%6.4f\n',predictions(i,:));
+end
+
+
+end
+
+function ts_discrete(pre,bnet,nnodes,predict_label,predict_node,data_test,pred_levels,predict_cases)
+
+ntestcases = size(data_test,1);
+
+predictions=zeros(ntestcases,predict_cases);
+
+for i = 1:ntestcases
+   evidence = data_test(i,:);
+   evidence{predict_node} = {};
+   for j=1:nnodes
+      if strcmp(evidence{j},"NA")
+          evidence{j} = {};
+      end
+   end
+   engine = jtree_inf_engine(bnet);
+   [engine,loglik] = enter_evidence(engine,evidence);
+   predict = marginal_nodes(engine,predict_node);
+   for j = 1:predict_cases
+         predictions(i,j) = predict.T(j);
+   end
+end
+
+
+pred_states = [];
+for i=1:ntestcases
+   if !strcmp(data_test(i,predict_node),'NA')
+       max_state = 1;
+       for j = 2:predict_cases
+          if predictions(i,j) > predictions(i,max_state)
+             max_state = j;
+          end
+       end
+       pred_states = [pred_states,max_state];
+    end
+end
+
+
+correct = 0;
+j = 0;
+for i=1:ntestcases
+   if !strcmp(data_test(i,predict_node),'NA')
+	j = j + 1;
+	if pred_states(j) == cell2mat(data_test(i,predict_node))
+            correct = correct + 1;
+        end
+   end
+end
+
+accuracy = correct/length(pred_states);
+
+
+%Open output file.
+filename = strcat(pre,'ts_output.txt');
+fileID = fopen(filename,'w');
+
+fprintf(fileID,'Variable that was predicted: %s\n\n',predict_label);
+
+%%Print the accuracy
+fprintf(fileID,'Fraction of accurate predictions: %6.4f\n\n',accuracy);
+
+%%Print the predictions
+fprintf(fileID,'Predicted likelihood of each state for each case:\n');
+fprintf(fileID,'%s\t%s\t','CaseRow','ActualState');
+fprintf(fileID,'%s\t',pred_levels{1:end-1});
+fprintf(fileID,'%s\n',pred_levels{end});
+for i = 1:ntestcases
+     fprintf(fileID,'%i\t',i);
+     if strcmp(data_test{i,predict_node},"NA")
+	fprintf(fileID,'%s\t',data_test{i,predict_node});
+     else
+	case_level = pred_levels{data_test{i,predict_node}};
+	fprintf(fileID,'%s\t',case_level);
+     end
+     fprintf(fileID,'%6.4f\t',predictions(i,1:end-1));
+     fprintf(fileID,'%6.4f\n',predictions(i,end));
+end
+
+
+
+
+
+end
+