ECG-Kit 1.0
(3,488 bytes)
function result=mscalelogist(x,varargin)
%MSCALELOGIST is an M-estimator of scale with psi-function equal to
% (exp(x)-1)/(exp(x)+1) and with auxiliary location estimate.
% It is iteratively computed. It can resist 50% outliers.
% If x is a matrix, the scale estimate is computed on the columns of x. The
% result is then a row vector. If x is a row or a column vector,
% the output is a scalar.
%
% The estimator is introduced in:
% Rousseeuw, P.J. and Verboven, S. (2002),
% "Robust estimation in very small samples",
% Computational Statistics and Data Analysis, 40, 741-758.
%
% Required input argument:
% x: either a data matrix with n observations in rows, p variables in columns
% or a vector of length n.
%
% Optional input arguments:
% k: number of iteration steps (default value = 50)
% sca: a starting value for the scale estimate
% default value = 'madc'
% other possibilities: 'qn'/'adm'/...
% loc: an auxiliary location estimate
% default value = 'median'
% other possibilities: 'hl'/'mlochuber'/...
%
% I/O: result=mscalelogist(x,'k',50,'sca','madc','loc','median')
%
% Example: result=mscalelogist(x,'sca','qn','k',10,'loc','hl')
% result=mscalelogist(x,'loc','hl')
%
% This function is part of LIBRA: the Matlab Library for Robust Analysis,
% available at:
% http://wis.kuleuven.be/stat/robust.html
%
%
%Written by S.Verboven
%Revisions by Nele Smets
%Last update: 31/08/03
[n,p]=size(x);
%
% initialization with defaults
%
counter=1;
sca='madc';
loc='median';
default=struct('k',50,'sca',sca,'loc',loc);
list=fieldnames(default);
options=default;
IN=length(list);
i=1;
%
if nargin>1
%
% placing inputfields in array of strings
%
for j=1:nargin-1
if rem(j,2)~=0
chklist{i}=varargin{j};
i=i+1;
end
end
%
% Checking which default parameters have to be changed
% and keep them in the structure 'options'.
%
while counter<=IN
index=strmatch(list(counter,:),chklist,'exact');
if ~isempty(index) % in case of similarity
for j=1:nargin-1 % searching the index of the accompanying field
if rem(j,2)~=0 % fieldnames are placed on odd index
if strcmp(chklist{index},varargin{j})
I=j;
end
end
end
options=setfield(options,chklist{index},varargin{I+1});
index=[];
end
counter=counter+1;
end
options.k=options.k;
options.sca=options.sca;
options.loc=options.loc;
end
if n==1 & p==1
out=0; %when X is a one by one matrix, all scale estimators must equal to 0
return
elseif n==1
x=x'; %we only want to work with column vectors
n=p;
p=1;
end
b=0.3739;
beta=0.5; %0.500038854875226 %quadl('(tanh(x./(2*b)).^2).*normpdf(x,0,1)',-5,5,1.e-15) ; denumenator of the scale estimator = constant
for i=1:p
X=x(:,i);
j=1;
s_0=feval(options.sca,X);
t_0=feval(options.loc,X);
step=s_0;
if s_0==0
out(i)=0;
else
while j<=options.k
u=(X-t_0)/step;
uu=tanh(u/(2*b)).^2;
step=step*sqrt(sum(uu)/(n*beta));
j=j+1;
end
out(i)=step;
u=[];
end
end
result = out;