wolffd@0: % Do the example in Cooper and Yoo, "Causal discovery from a mixture of experimental and wolffd@0: % observational data", UAI 99, p120 wolffd@0: wolffd@0: N = 2; wolffd@0: dag = zeros(N); wolffd@0: A = 1; B = 2; wolffd@0: dag(A,B) = 1; wolffd@0: ns = 2*ones(1,N); wolffd@0: wolffd@0: bnet0 = mk_bnet(dag, ns); wolffd@0: %bnet0.CPD{A} = tabular_CPD(bnet0, A, 'unif', 1); wolffd@0: bnet0.CPD{A} = tabular_CPD(bnet0, A, 'CPT', 'unif', 'prior_type', 'dirichlet'); wolffd@0: bnet0.CPD{B} = tabular_CPD(bnet0, B, 'CPT', 'unif', 'prior_type', 'dirichlet'); wolffd@0: wolffd@0: samples = [2 2; wolffd@0: 2 1; wolffd@0: 2 2; wolffd@0: 1 1; wolffd@0: 1 2; wolffd@0: 2 2; wolffd@0: 1 1; wolffd@0: 2 2; wolffd@0: 1 2; wolffd@0: 2 1; wolffd@0: 1 1]; wolffd@0: wolffd@0: clamped = [0 0; wolffd@0: 0 0; wolffd@0: 0 0; wolffd@0: 0 0; wolffd@0: 0 0; wolffd@0: 1 0; wolffd@0: 1 0; wolffd@0: 0 1; wolffd@0: 0 1; wolffd@0: 0 1; wolffd@0: 0 1]; wolffd@0: wolffd@0: nsamples = size(samples, 1); wolffd@0: wolffd@0: % sequential version wolffd@0: LL = 0; wolffd@0: bnet = bnet0; wolffd@0: for l=1:nsamples wolffd@0: ev = num2cell(samples(l,:)'); wolffd@0: manip = find(clamped(l,:)'); wolffd@0: LL = LL + log_marg_lik_complete(bnet, ev, manip); wolffd@0: bnet = bayes_update_params(bnet, ev, manip); wolffd@0: end wolffd@0: assert(approxeq(exp(LL), 5.97e-7)) % compare with result from UAI paper wolffd@0: wolffd@0: wolffd@0: % batch version wolffd@0: cases = num2cell(samples'); wolffd@0: LL2 = log_marg_lik_complete(bnet0, cases, clamped'); wolffd@0: bnet2 = bayes_update_params(bnet0, cases, clamped'); wolffd@0: wolffd@0: assert(approxeq(LL, LL2)) wolffd@0: wolffd@0: for j=1:N wolffd@0: s1 = struct(bnet.CPD{j}); % violate object privacy wolffd@0: s2 = struct(bnet2.CPD{j}); wolffd@0: assert(approxeq(s1.CPT, s2.CPT)) wolffd@0: end wolffd@0: