Code covered by the BSD License  

Highlights from
MGraph

from MGraph by junbai wang
Probabilistic graphical models for reconstruction of genetic regulatory networks using DNA microarra

[old_parcorrf,delet_edge,record_edges]=MGraph_GaussModel_forward(old_var,N,q,cutoff)
function [old_parcorrf,delet_edge,record_edges]=MGraph_GaussModel_forward(old_var,N,q,cutoff)
global graph_form
%P/181, Graphical models in  applied multivariate statistics
%old_var=[ 302.29 125.78 100.43 105.07 116.07; ...
%        125.78 170.88 84.19 93.6 97.89;...
%        100.43 84.19 111.6 110.84 120.49; ...
%        105.07 93.6 110.84 217.88 153.77; ...
%   116.07 97.89 120.49 153.77 294.37]
%N=88 % number of observations
%q=5 % number of variables
%cutoff=0.05;
%old_corrf=old_var./sqrt(diag(old_var)*diag(old_var)');
%inv_old_var=pinv(old_var); %bug at here sometime the inverse of variance equal inf Dec 22. 2002
%old_parcorrf=-inv_old_var./sqrt(abs(diag(inv_old_var)*diag(inv_old_var)'));
%devs=-N*log(1-old_parcorrf.^2) %device of the pair of edges
t0=clock;
%For forward algorithm
%inital model a+b+c+d...
initial_model=eye(q,q);
k_sets=1:q;
full_model=triu(ones(q,q));
[set_a1,set_a2]=find(initial_model);
set_a=[set_a1,set_a2];
ln_set_a=size(set_a,1);

%rest of edges
[set_b1,set_b2]=find(full_model);
set_b=[set_b1,set_b2];
ln_set_b=size(set_b,1);
need_test_sets=setdiff(set_b,set_a,'rows');

%compement set of set a
for i=1:ln_set_a
    comp_set_a{i}=setdiff(k_sets,set_a(i,:)); %complement of set a
end

%make the full model
%oldModel=MGraph_num2string((1:q)');
%temp_newModel=oldModel;


idx=1; %index for recorded edges
temp_G=zeros(q,q);
new_G=temp_G;

while 1
    %need update set_a, comp_set_a, need_test_sets in each loop
    
    fit_var=MGraph_GaussEstimate_variance(old_var,set_a,comp_set_a);
    %initial model device
    det_old=det(old_var);
    det_fit=det(fit_var);
    total_devs=abs(N*(log(det_old)-log(det_fit)));
    df=size(need_test_sets,1);
    total_p=Chisq(total_devs,df);
    

    %computer all pair of edges device
    new_model_set=set_a;
    index=1:df;
    devs=[];
    chtest_p=[];
    
    for i=1:df
        new_model_set(ln_set_a+1,:)=need_test_sets(i,:);
        for j=1:size(new_model_set,1)
            new_comp_set{j}=setdiff(k_sets,new_model_set(j,:));
        end
        new_fit_var=MGraph_GaussEstimate_variance(old_var,new_model_set,new_comp_set);
        det_old=det(fit_var);
        det_fit=det(new_fit_var);
        devs(i)=abs(N*(log(det_old)-log(det_fit)));
        chtest_p(i)=Chisq(devs(i),1) ;   
    end 
    %devs
    chtest_p(find(chtest_p<cutoff))
    %find maximu device and add this edge to initial model
    %[sortDev idx_sortDev]=sort(devs);
    %%flip from top to down
    %flip_sortDev=fliplr(sortDev);
    %flip_idx_sortDev=fliplr(idx_sortDev);
    %idx_maxDev=flip_idx_sortDev(1);
     %[maxDev idx_maxDev]=max(devs);
    %add sep.2003 for check decomposable modle
    %make new subgroup
    %if graph_form==1
    %    for ii=1:length(devs)
    %        idx_maxDev=flip_idx_sortDev(ii);
    %        delet_edge_location=need_test_sets(idx_maxDev,:);
    %   	    delet_edge_string=MGraph_num2string(delet_edge_location);
    %   	    new_model=MGraph_makeSubGraph(temp_newModel,delet_edge_string);
    %   	    clear numberVector
    %   	    for new_idx=1:length(new_model)
    %      		numberVector{new_idx}=num2str(MGraph_string2num(new_model(new_idx)));
    %   	    end
    %    	    input_k_cliques=(numberVector)';
    %        is_SDordering=MGraph_isSDordering(input_k_cliques)
    %        pause
    %        if is_SDordering
    %            break;
    %        end
    %     end
    %else
   %     idx_maxDev=flip_idx_sortDev(1);
   % end       
    %end add    
    
    %add test decomposable 
    sortedDev=[];
    sorted_need_test_sets=[];
    sorted_chtest_p=[];
    
    [sortedDev idx_sortDev]=sort(devs);   
    sorted_need_test_sets=need_test_sets(idx_sortDev,:);
    sorted_chtest_p=chtest_p(idx_sortDev);
    len_of_dev=length(sortedDev);
    for i=1:len_of_dev
         temp_G=new_G;
         temp_add_edge=sorted_need_test_sets(end-i+1,:);
         temp_G(temp_add_edge(1),temp_add_edge(2))=1;
         temp_G(temp_add_edge(2),temp_add_edge(1))=1;
         if graph_form==1
             cond1=(isDecomposableG(temp_G) & sorted_chtest_p(end-i+1)<cutoff);
         else
             cond1=sorted_chtest_p(end-i+1)<cutoff;
         end
         if cond1
             break;
         end
     end
     %end add
    
    if cond1
        %add it to the model
        %add_edge=need_test_sets(idx_maxDev,:);
        add_edge=temp_add_edge;
        new_G(temp_add_edge(1),temp_add_edge(2))=1;
        new_G(temp_add_edge(2),temp_add_edge(1))=1;
        temp_G=new_G;
        %end add in
        
        set_a(end+1,:)=add_edge;
        comp_set_a{end+1}=setdiff(k_sets,set_a(end,:));
        old_need_test_sets=need_test_sets;
        need_test_sets=setdiff(old_need_test_sets,add_edge,'rows');
        ln_set_a=size(set_a,1);
        record_old_var=fit_var;
        delet_edge= size(need_test_sets,1)+1;
        record_edges{idx}=num2str(add_edge);
        record_edges'
        idx=idx+1;
        %temp_newModel=new_model  ;
    else
        record_old_var=fit_var;
        delet_edge= size(need_test_sets,1);

        break;
    end
end %end while

old_corrf=record_old_var./sqrt(diag(record_old_var)*diag(record_old_var)');
inv_old_var=pinv(record_old_var); %bug at here sometime the inverse of variance equal inf Dec 22. 2002
old_parcorrf=-inv_old_var./sqrt(abs(diag(inv_old_var)*diag(inv_old_var)'));
etime(clock,t0)

Contact us at files@mathworks.com