about summary refs log tree commit diff
path: root/sourcecodes/bnt-master/SLP/misc/gener_data_from_bnet_miss.m
diff options
context:
space:
mode:
Diffstat (limited to 'sourcecodes/bnt-master/SLP/misc/gener_data_from_bnet_miss.m')
-rw-r--r--sourcecodes/bnt-master/SLP/misc/gener_data_from_bnet_miss.m103
1 files changed, 103 insertions, 0 deletions
diff --git a/sourcecodes/bnt-master/SLP/misc/gener_data_from_bnet_miss.m b/sourcecodes/bnt-master/SLP/misc/gener_data_from_bnet_miss.m
new file mode 100644
index 00000000..3508daa0
--- /dev/null
+++ b/sourcecodes/bnt-master/SLP/misc/gener_data_from_bnet_miss.m
@@ -0,0 +1,103 @@
+function [data, comp_data, bnet_miss, taux, bnet_orig, notok, d] = gener_data_from_bnet_miss(bnet_miss, m, base_proba ,v, testdata)
+% [data, comp_data, bnet_miss, taux, bnet_orig, notok] = gener_data_from_bnet_miss(bnet_miss, m, base_proba ,v, aretestdata)
+%
+%   bnet_miss : see gener_[MCAR or MAR]_net function
+%   m : the length of the dataset
+%   if base_proba==0 or does not exist the x2_test will be passed
+%   v==1 to enter the verbose mode
+%   aretestdata==1 to always build the same dataset <-- rand('state',0)
+%
+% Francois.Olivier.C.H@gmail.com
+
+% Initialisation
+
+if nargin<5, testdata = 0; end
+if nargin<4, v = 0; end
+
+N2 = length(bnet_miss.dag); 
+if mod(N2,3)~=0, error('The number of nodes must be even in bnet_miss'); end
+N = length(bnet_miss.dag)/3;
+
+if nargin<3, base_proba=0; end
+if nargin<2, error('Not enougth parameters'); end
+
+% CHOOSE THE TEST POWER (only affect 'notok' value)
+                    chi2_0_1_1fd  =  2.705 ;
+                   chi2_0_05_1fd  =  3.841 ;
+                   chi2_0_01_1fd  =  6.635 ;
+                   chi2_0_001_1fd = 10.827 ;
+                  chi2_0_0001_1fd = 15.137 ;
+                                            choice = chi2_0_001_1fd;
+notok=0;
+clear chi2_0_1_1fd chi2_0_05_1fd chi2_0_01_1fd chi2_0_001_1fd chi2_0_0001_1fd
+
+% Recovering bnet_orig
+
+dag = bnet_miss.dag(1:N,1:N);
+bnet_orig = mk_bnet(dag, bnet_miss.node_sizes(1:N));
+CPT = CPT_from_bnet(bnet_miss, 0);
+for i=1:N, bnet_orig.CPD{i} = tabular_CPD(bnet_orig, i, CPT{i}); end
+
+% Generation of complete data
+
+if testdata, rand('state',0); randn('state',0); end
+
+data = cell(N,m);
+for l = 1:m, data(:,l) = sample_bnet(bnet_orig); end
+fprintf('Complete data have been created.');
+
+% Generation of missing array
+
+miss_array = cell(3*N,m);
+vide = cell(1,2*N); l= 1;
+while l <= m, 
+  ev(1:N) = data(:,l); ev(N+1:3*N) = vide;
+  miss_array(:,l) = sample_bnet(bnet_miss, 'evidence', ev); 
+  % apply simple rule of missingness
+  ev2 = cell2mat(miss_array(N+1:2*N, l));
+  % verification that we have not a completly missing sample
+  ev2 = 3-ev2; 
+  if prod(ev2)==1, 
+    if v, fprintf(' - %d, one completly missing sample removed', l);end
+  else l=l+1;
+  end 
+  if v, if mod(l,250)==0, fprintf('\n - %d',l); end,  end
+end
+fprintf('\n');
+
+% Generation of incomplete dataset
+
+       %%   TO REPLACE THE CELL ARRAY FOR ouput data
+       %%   WITH A MATRIX WITH A SPECIAL CASE (size+1)
+       %%   FOR MISSING DATA, SIMPLY REPLACE 1 by 0
+if 1,  %%   HERE
+  miss_array = bnt_to_mat(miss_array(N+1:2*N, :)); 
+  miss_array = 2-miss_array; 
+  data = bnt_to_mat(data);
+  comp_data = data; 
+  data = data.*miss_array; 
+  data = mat_to_bnt(data, 0); 
+else
+  comp_data = bnt_to_mat(miss_array(1:N,:),0);
+  data = bnt_to_mat(miss_array(2*N+1:3*N,:),0);
+  miss_array = bnt_to_mat(miss_array(N+1:2*N, :)); 
+  miss_array = 2-miss_array; 
+end
+fprintf('Incomplete dataset have been created.\n');
+
+% Verification of the Rate of missing data
+
+if base_proba,
+    [XX, YY]=find(miss_array==0);
+    nbr_miss = length(YY);
+    taux = nbr_miss/N/m;
+    if v, fprintf('There is %2.2f percent of missing data\n', round(taux*10000)/100); end
+
+    % Khi2 test between taux and base_proba for m*N
+    toto = m*N;
+    d = ((nbr_miss-base_proba*toto)^2)/(base_proba*toto) + (((toto-nbr_miss)-(1-base_proba)*toto)^2)/((1-base_proba)*toto);
+    if d>choice, 
+    fprintf('THE DATASET DO NOT RESPECT %2.1f%% OF MISSING DATA (%2.1f%%, Khi2 : %2.1f > %2.1f)\n', round(base_proba*10000)/100, round(taux*10000)/100, d, choice); 
+    notok = 1;
+    end
+end