1function Nstar = map_kpcfit_bic(SA,orders,varargin)
2% function order = map_kpcfit_bic(SA,orders,...) returns the possible order for
3% a trace for the purpose of KPCfitting
5% order = map_kpcfit_bic(SA,orders,...) returns the order of KPCmap as a power of 2,
6% SA
is a sequence of autocorrelations of a trace, ordered from lag-1 to lag-n, and
7% orders
is a range of orders that will be chosen from.
11nlagsend = find(SA < 1e-6); % nlagsend = point of first decay below zero
12ordermax = max(orders);
16 nlagsend = nlagsend(1)-1 + ordermax;
21if (nlagsend > NLAGSMAX)
22 SAlags = unique(round(logspace(log10(1),log10(nlagsend-ordermax),NLAGSMAX)));
24 temp = NLAGSMAX - length(SAlags);
25 step = (nlagsend-ordermax)^(1/NLAGSMAX);
27 while (((SAlags(i) - round(step^i)) < temp) && (i<=len))
31 SAlags = [1:SAlags(i),SAlags(i+1:end)];
33 % if nlagsend-ordermax*2 < 0, suggest something to the user
34 if nlagsend > (ordermax)
35 SAlags = 1:(nlagsend-ordermax);
37 ordermax = nlagsend-2;
38 SAlags = 1:(nlagsend-ordermax);
39 orders = orders(find(orders<=ordermax));
42%SAlags = linspace(ordermax+1,ordermax+1000,500);
44n_samples = length(SAlags);
45SAlags = round(SAlags);
60%SAlags_y = SAlags + ordermax;
66 lags_x = SAlags_y + i;
67 X(:,end+1) = SA(lags_x);
73%X(:,end+1) = ones(size(X,1),1);
76 %[b,bint,r,rint,stats] = regress([Y;Y],[X;X])
79 [b,bint,r,rint,stats] = regress(Y,X);
80 MSEtotal = sum(r.^2)/(n_samples-1);
85for j = 1:length(orders)
89 lags_x = SAlags_y + i;
90 X(:,end+1) = SA(lags_x);
94 %X(:,end+1) = ones(size(X,1),1);
96 [b,bint,r,rint,stats] = regress(Y,X);
97 %predict_error(end+1) = norm(Ypredict - Xpredict(:,1:order)*b);
98 AIC(end+1) = n_samples*log(sum(r.^2)) - n_samples*log(n_samples) + 2*order;
99 SBC(end+1) = n_samples*log(sum(r.^2)) - n_samples*log(n_samples) + log(n_samples)*order;
100 cp(end+1) = sum(r.^2)/MSEtotal - (n_samples-2*order);
101 mean_error(end+1) = mean(r);
102 sse_sacf(end+1) = sum(r.^2)/sum(Y.^2);
104 adjR = 1 - sum(r.^2)/(n_samples-order)/Y_var;
105 adjRarray(end+1) = adjR;
109 parray(end+1) = stats(4);
110 rsarray(end+1) = stats(1);
116%h0 = plot(xaxis,mean_error);
117%h1 = plot(xaxis,rarray);
118%h2 = plot(xaxis,rsarray);
119%h3 = plot(xaxis,adjRarray);
120%h3 = plot(xaxis,parray);
122%h6 = plot(xaxis,AIC);
123%h7 = plot(xaxis,predict_error);
126 h8 = plot(xaxis,SBC,varargin{1});
128%h9 = plot(xaxis,sse_sacf);
130%h2 = plot(xaxis,parray,
'*');
133%legend(h,
'R-norm',
'p-value');
136[v,ind] = sort(SBC,
'ascend');
138Nstar = log2(orders(ind(1)));
143 lags_x = SAlags_y + i;
144 X(:,end+1) = SA(lags_x);
149[b,bint,r,rint,stats] = regress(Y,X);
150rssrho = sum(r.^2)/sum(Y.^2);
153 disp(
'Warning! The residual sum of square indicates that the trace may not be well characterized by a MAP with less than 64 states!');
155 disp(
'##################################### Using another model for fitting is suggested! ########################################');
161% a small example
for the order 16
case