⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hullt3.m

📁 这是一个三面阵列的数学工具软件
💻 M
字号:
function hullt3(X,I,J,K,P,Q,R);
% hullt3(X,I,J,K,P,Q,R);
%  Selecting among three-mode principal components models of different types and complexity: a numerical convex hull based method
%  Eva Ceulemans and Henk A. L. Kiers. British journal of mathematical and statistical psychology, 2006, 59, 133-150.
%
% INPUT
% 
%  X   (frontal slices next to each other)
%  I,J,K : order of array
%
%  P,Q,R : maximum number of dimensions 
%
% uses ed.m ssq.m LineCon.m cpfunc.m
%
% Written by Urbano Lorenzo-Seva, Rovira i Virgili University (Last update: November 22, 2007)

%MAXIMUM DIMENSIONS
maxP   = P; %T1, T2, T3
maxQ   = Q; %T1, T2, T3
maxR   = R; %T1, T2, T3
maxPQR = max([maxP maxQ maxR]'); %CP

%Kiers and der Kinderen's quick method for obtaining approximete T3 and T2 goodness-of-fit values

%Xa
Xa = X;

%Xb
Xb =[];
for j=1:J,
    xi=[];
    for k=0:K-1,
        xi = [xi X(:,J*k+j)'];
    end;
    Xb=[Xb; xi];
end;

%Xc
Xc=[];
for k=0:K-1,
    xi=[];
    for j=1:J,
        xi = [xi X(:,J*k+j)'];
    end;
    Xc=[Xc; xi];
end;

[Ka,La]=ed(Xa*Xa');
[Kb,Lb]=ed(Xb*Xb');
[Kc,Lc]=ed(Xc*Xc');

out=[];


%T3
[Ka,La]=ed(Xa*Xa');
[Kb,Lb]=ed(Xb*Xb');
[Kc,Lc]=ed(Xc*Xc');
Ha = Ka'*Xa*kron(Kc,Kb);

for r1=1:maxP
  for r2=1:maxQ
    for r3=1:maxR
        if r1*r2>=r3 & r1*r3>=r2 & r2*r3>=r1,

            G=[];
            for r=0:r3-1,
                for q=1:r2,
                    G = [G Ha(1:r1,J*r+q)];
                end;
            end;
            f  = ssq(G)/ssq(X);
            Ic=I;if I > J*K, Ic=J*K;end;
            fp = r1 + r2+ r3;
            out=[out;r1 r2 r3 f fp];   
            
        end;
    end;
  end;
end;

%Sorting by number of free parameters
[ss,si]=sort(out(:,5));
out=out(si,:);
%writescr(out,'10.4')
%pause
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Convex hull based model selection procedure
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%Step 2 Retain only the best-fitting solutions
[tmp1,tmp2]=size(out);
fpi=min(out(:,5));
for i=1:tmp1,
    if out(i,5) ~= max(fpi),
        fpi=[fpi; out(i,5)];
    end;
end;

[tmp3,tmp2]=size(fpi);
out_best =zeros (tmp3,5);
for i=1:tmp3,
    for j=1:tmp1,
        if fpi(i) == out(j,5),
            if out_best(i,4) < out(j,4),
               out_best(i,:) = out(j,:); 
            end;
        end;
    end;
end;

%Step 4 Clean for f
out_best_best =out_best(1,:);
for i=2:tmp3,
    if max(out_best_best(:,4))< out_best(i,4),
        out_best_best = [out_best_best; out_best(i,:)];
    end;
end;

%Steps 5 i 6 Testing triplets of adjacent solutions
[tmp4,tmp2]=size(out_best_best);
out_best_best_best=out_best_best(1,:);

i=2;
while i < tmp4-1,
        f1 =out_best_best(i-1,4);
        f2 =out_best_best(i  ,4);
        f3 =out_best_best(i+1,4);
        fp1=out_best_best(i-1,5);
        fp2=out_best_best(i  ,5);
        fp3=out_best_best(i+1,5);
        if LineCon(f1,f2,f3,fp1,fp2,fp3) == 0,
           out_best_best = [out_best_best(1:i-1,:); out_best_best(i+1:tmp4,:)];
           [tmp4,tmp2]=size(out_best_best);
           i=1; 
        end;
        i = i+1;
end;

%Step 7 Compute St
[tmp4,tmp2]=size(out_best_best);
st = zeros(tmp4,1);
for i=2:tmp4-1,
    fi    = out_best_best(i,  4);
    fi_p  = out_best_best(i-1,4);
    fi_n  = out_best_best(i+1,4);
    fpi   = out_best_best(i,  5);
    fpi_p = out_best_best(i-1,5);
    fpi_n = out_best_best(i+1,5);
    st(i) = ((fi - fi_p) / (fpi - fpi_p)) / ((fi_n - fi) / (fpi_n - fpi));
end;

out_st = [out_best_best st];

%Step 8 Select the solution with highest st-value
[st_tmp,imax]= max (out_st(:,6));
st_max = out_st(imax,:);

%Step 9 Look for equivalent solutions
sol_equi=[];e=0;
for i=1:tmp1,
    if st_max(5) == out(i,5) & st_max(4) ~= out(i,4),
        sol_equi = [sol_equi; out(i,:)];
        e=e+1;
    end;
end;

%REPORT FOR THE OUTPUT

%Table 
clc;
disp(' ');
disp('Table. Goodness-of-fit values f, total number of components Sc, and scree test');
disp('       values st of the solutions on the higher boundary of the convex hull');
disp(' ');
disp('     Model  Complexity    f         Sc      st');
disp(' ');
for i=1:tmp4,
    if out_st(i,1) == -1,
       buff  =sprintf('     CP        %2.0f',out_st(i,3));
       if i == 1,
           buff2 =sprintf('       %5.4f %7d      -',out_st(i,4), out_st(i,5));
       elseif i == tmp4,
           buff2 =sprintf('       %5.4f %7d      -',out_st(i,4), out_st(i,5));
       else
           buff2 =sprintf('       %5.4f %7d    %5.2f',out_st(i,4), out_st(i,5), out_st(i,6));
       end;
       if i == imax, buff3 = sprintf('The  hull neuristic indicates the selection of the CP model of complexity (%2.0f).',out_st(i,3));;end;
    end;
    if out_st(i,1) == 2 & out_st(i,3) == 0,
       buff  =sprintf('     T1A       %2.0f',out_st(i,1));
       if i == 1,
           buff2 =sprintf('       %5.4f %7d      -',out_st(i,4), out_st(i,5));
       elseif i == tmp4,
           buff2 =sprintf('       %5.4f %7d      -',out_st(i,4), out_st(i,5));
       else
           buff2 =sprintf('       %5.4f %7d    %5.2f',out_st(i,4), out_st(i,5), out_st(i,6));
       end;
       if i == imax, buff3 = sprintf('The hull neuristic indicates the selection of the T1A model of complexity (%2.0f).',out_st(i,1));;end;
    end;
    if out_st(i,1) == 0 & out_st(i,3) == 0,
       buff  =sprintf('     T1B       %2.0f',out_st(i,2));
       if i == 1,
           buff2 =sprintf('       %5.4f %7d      -',out_st(i,4), out_st(i,5));
       elseif i == tmp4,
           buff2 =sprintf('       %5.4f %7d      -',out_st(i,4), out_st(i,5));
       else
           buff2 =sprintf('       %5.4f %7d    %5.2f',out_st(i,4), out_st(i,5), out_st(i,6));
       end;
       if i == imax, buff3 = sprintf('The hull heuristic indicates the selection of the T1B model of complexity (%2.0f).',out_st(i,2));;end;
    end;
    if out_st(i,1) == 0 & out_st(i,2) == 0,
       buff  =sprintf('     T1C       %2.0f',out_st(i,3));
       if i == 1,
           buff2 =sprintf('       %5.4f %7d      -',out_st(i,4), out_st(i,5));
       elseif i == tmp4,
           buff2 =sprintf('       %5.4f %7d      -',out_st(i,4), out_st(i,5));
       else
           buff2 =sprintf('       %5.4f %7d    %5.2f',out_st(i,4), out_st(i,5), out_st(i,6));
       end;
       if i == imax, buff3 = sprintf('The hull heuristic indicates the selection of the T1C model of complexity (%2.0f).',out_st(i,3));;end;
    end;
    if out_st(i,1) ~= 0 & out_st(i,2) ~= 0 & out_st(i,3) == 0,
       buff  =sprintf('     T2AB    (%2.0f,%2.0f)',out_st(i,1),out_st(i,2));
       if i == 1,
           buff2 =sprintf('    %5.4f %7d      -',out_st(i,4), out_st(i,5));
       elseif i == tmp4,
           buff2 =sprintf('    %5.4f %7d      -',out_st(i,4), out_st(i,5));
       else
           buff2 =sprintf('    %5.4f %7d    %5.2f',out_st(i,4), out_st(i,5), out_st(i,6));
       end;
       if i == imax, buff3 = sprintf('The hull heuristic indicates the selection of the T2AB model of complexity (%2.0f,%2.0f).',out_st(i,1),out_st(i,2));;end;
    end;
   if out_st(i,1) ~= 0 & out_st(i,2) == 0 & out_st(i,3) ~= 0,
       buff  =sprintf('     T2AC    (%2.0f,%2.0f)',out_st(i,1),out_st(i,3));
       if i == 1,
           buff2 =sprintf('    %5.4f %7d      -',out_st(i,4), out_st(i,5));
       elseif i == tmp4,
           buff2 =sprintf('    %5.4f %7d      -',out_st(i,4), out_st(i,5));
       else
           buff2 =sprintf('    %5.4f %7d    %5.2f',out_st(i,4), out_st(i,5), out_st(i,6));
       end;
       if i == imax, buff3 = sprintf('The hull heuristic indicates the selection of the T2AC model of complexity (%2.0f,%2.0f).',out_st(i,1),out_st(i,3));;end;
    end;
    if out_st(i,1) == 0 & out_st(i,2) ~= 0 & out_st(i,3) ~= 0,
       buff  =sprintf('     T2BC    (%2.0f,%2.0f)',out_st(i,2),out_st(i,3));
       if i == 1,
           buff2 =sprintf('    %5.4f %7d      -',out_st(i,4), out_st(i,5));
       elseif i == tmp4,
           buff2 =sprintf('    %5.4f %7d      -',out_st(i,4), out_st(i,5));
       else
           buff2 =sprintf('    %5.4f %7d    %5.2f',out_st(i,4), out_st(i,5), out_st(i,6));
       end;
       if i == imax, buff3 = sprintf('The hull heuristic indicates the selection of the T2BC model of complexity (%2.0f,%2.0f).',out_st(i,2),out_st(i,3));;end;
    end;
    if out_st(i,1) > 0 & out_st(i,2) > 0 & out_st(i,3) > 0,
       buff  =sprintf('     T3    (%2.0f,%2.0f,%2.0f)',out_st(i,1),out_st(i,2),out_st(i,3));
       if i == 1,
           buff2 =sprintf('   %5.4f %7d      -',out_st(i,4), out_st(i,5));
       elseif i == tmp4,
           buff2 =sprintf('   %5.4f %7d      -',out_st(i,4), out_st(i,5));
       else
           buff2 =sprintf('   %5.4f %7d    %5.2f',out_st(i,4), out_st(i,5), out_st(i,6));
       end;
       if i == imax, buff3 = sprintf('The hull heuristic indicates the selection of the T3 model of complexity (%2.0f,%2.0f,%2.0f).',out_st(i,1),out_st(i,2),out_st(i,3));;end;
    end;

    disp([buff buff2]);
    
end;
disp(' ');
disp(buff3);
if (e>0),
    disp('Other solutions are equivalent to the solution selected. They could also be');
    disp('selected and reported. The equivalent solutions are the following:');
disp(' ');
disp('     Model  Complexity    f         Sc      ');
disp(' ');
for i=1:e,
    if sol_equi(i,1) == -1,
       buff  =sprintf('     CP        %2.0f',sol_equi(i,3));
       if i == 1,
           buff2 =sprintf('       %5.4f %7d      ',sol_equi(i,4), sol_equi(i,5));
       elseif i == tmp4,
           buff2 =sprintf('       %5.4f %7d      ',sol_equi(i,4), sol_equi(i,5));
       else
           buff2 =sprintf('       %5.4f %7d    ',sol_equi(i,4), sol_equi(i,5));
       end;
    end;
    if sol_equi(i,1) == 2 & sol_equi(i,3) == 0,
       buff  =sprintf('     T1A       %2.0f',sol_equi(i,1));
       if i == 1,
           buff2 =sprintf('       %5.4f %7d     ',sol_equi(i,4), sol_equi(i,5));
       elseif i == tmp4,
           buff2 =sprintf('       %5.4f %7d     ',sol_equi(i,4), sol_equi(i,5));
       else
           buff2 =sprintf('       %5.4f %7d   ',sol_equi(i,4), sol_equi(i,5));
       end;
    end;
    if sol_equi(i,1) == 0 & sol_equi(i,3) == 0,
       buff  =sprintf('     T1B       %2.0f',sol_equi(i,2));
       if i == 1,
           buff2 =sprintf('       %5.4f %7d      ',sol_equi(i,4), sol_equi(i,5));
       elseif i == tmp4,
           buff2 =sprintf('       %5.4f %7d      ',sol_equi(i,4), sol_equi(i,5));
       else
           buff2 =sprintf('       %5.4f %7d    ',sol_equi(i,4), sol_equi(i,5));
       end;
    end;
    if sol_equi(i,1) == 0 & sol_equi(i,2) == 0,
       buff  =sprintf('     T1C       %2.0f',sol_equi(i,3));
       if i == 1,
           buff2 =sprintf('       %5.4f %7d      ',sol_equi(i,4), sol_equi(i,5));
       elseif i == tmp4,
           buff2 =sprintf('       %5.4f %7d      ',sol_equi(i,4), sol_equi(i,5));
       else
           buff2 =sprintf('       %5.4f %7d   ',sol_equi(i,4), sol_equi(i,5));
       end;
    end;
    if sol_equi(i,1) ~= 0 & sol_equi(i,2) ~= 0 & sol_equi(i,3) == 0,
       buff  =sprintf('     T2AB    (%2.0f,%2.0f)',sol_equi(i,1),sol_equi(i,2));
       if i == 1,
           buff2 =sprintf('    %5.4f %7d      ',sol_equi(i,4), sol_equi(i,5));
       elseif i == tmp4,
           buff2 =sprintf('    %5.4f %7d      ',sol_equi(i,4), sol_equi(i,5));
       else
           buff2 =sprintf('    %5.4f %7d    ',sol_equi(i,4), sol_equi(i,5));
       end;
    end;
   if sol_equi(i,1) ~= 0 & sol_equi(i,2) == 0 & sol_equi(i,3) ~= 0,
       buff  =sprintf('     T2AC    (%2.0f,%2.0f)',sol_equi(i,1),sol_equi(i,3));
       if i == 1,
           buff2 =sprintf('    %5.4f %7d      ',sol_equi(i,4), sol_equi(i,5));
       elseif i == tmp4,
           buff2 =sprintf('    %5.4f %7d      ',sol_equi(i,4), sol_equi(i,5));
       else
           buff2 =sprintf('    %5.4f %7d    ',sol_equi(i,4), sol_equi(i,5));
       end;
    end;
    if sol_equi(i,1) == 0 & sol_equi(i,2) ~= 0 & sol_equi(i,3) ~= 0,
       buff  =sprintf('     T2BC    (%2.0f,%2.0f)',sol_equi(i,2),sol_equi(i,3));
       if i == 1,
           buff2 =sprintf('    %5.4f %7d      ',sol_equi(i,4), sol_equi(i,5));
       elseif i == tmp4,
           buff2 =sprintf('    %5.4f %7d      ',sol_equi(i,4), sol_equi(i,5));
       else
           buff2 =sprintf('    %5.4f %7d    ',sol_equi(i,4), sol_equi(i,5));
       end;
    end;
    if sol_equi(i,1) > 0 & sol_equi(i,2) > 0 & sol_equi(i,3) > 0,
       buff  =sprintf('     T3    (%2.0f,%2.0f,%2.0f)',sol_equi(i,1),sol_equi(i,2),sol_equi(i,3));
       if i == 1,
           buff2 =sprintf('   %5.4f %7d      ',sol_equi(i,4), sol_equi(i,5));
       elseif i == tmp4,
           buff2 =sprintf('   %5.4f %7d      ',sol_equi(i,4), sol_equi(i,5));
       else
           buff2 =sprintf('   %5.4f %7d    ',sol_equi(i,4), sol_equi(i,5));
       end;
    end;

    disp([buff buff2]);
    
end;
disp(' ');    
end;    
disp(' ');

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -