teg_scree
The function returns the element in a vector of (low-to-high sorted) eigenvalues where the derivative of the normalized values passes through 1 (i.e. the scree criterion or knik criterium), using a polynomial estimation of the curve.
The code:
function knik = teg_scree(vec)
% function knik = teg_scree(EV)
%
% EV is a vector of eigenvalues, e.g. diag(EV) where EV is from eig.
plotit = 0;
x = ((1:length(vec)) - 1) / (length(vec) - 1);
x = x(:);
vec = vec ./ max(vec);
if plotit,
figure;
plot(x, vec, 'k-');
hold on;
end;
err0 = var(vec);
Pred = ones(size(x));
p = 0;
while 1,
b = inv(Pred'*Pred)*Pred'*vec;
mod0 = Pred*b;
if plotit,
plot(x, mod0);
end;
err1 = var(mod0 - vec);
disp(err1 / err0);
if err1 / err0 < 0.05,
break;
end;
p = p + 1;
Pred0 = x .^ p;
Pred = [Pred Pred0];
end;
deriv = zeros(size(x));
for m = 2:size(Pred, 2),
n = m - 1;
deriv = deriv + b(m) * n * x .^ (n - 1);
end;
kniks = find(deriv >= 1);
knik = kniks(1);