diff options
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.m | 103 |
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 |
