ECG-Kit 1.0

File: <base>/common/LIBRA/extractmcdregres.m (4,222 bytes)
function [Bk,intk,sigmayykmaxrew_k,sigmattkmaxrew_k,Hopt] = extractmcdregres(resMcd,T,y,kmax,n,q,k,h,cutoffWeights)

%EXTRACTMCDREGRES is an auxiliary function for cross-validation with RPCR and RSIMPLS. 
% It extracts mcd-regression coefficients for a certain k based on 
% the raw estimate of the slope and intercept of the regression with kmax coefficients. 

% Input arguments: 
%  resMCD : the results of the mcdregression on the data minus observation i for kmax components. 
%    kmax : the maximal number of components
%       T : the k scores from ROBPCA
%       k : the number of components. 
%
% Output : 
%    Bk : the slope for k components.
%  intk : the intercept for k components.
%  Hopt : remark that only for k < kmax a hopt is provided. For kmax Hopt needs to be calculated outside this function. 
%  sigmayykmaxrew_k and sigmattkmaxrew_k : estimates of covariance matrices that are needed in other functions. 
%
% This function is part of LIBRA: the Matlab Library for Robust Analysis,
% available at: 
%              http://wis.kuleuven.be/stat/robust.html
%
% Written by Sanne Engelen 
% Last Update: 08/10/2004


geg = [T,y];
j = k;

mutkmaxraw_k = resMcd.Mu(1:j);
muykmaxraw_k = resMcd.Mu((kmax+1):(kmax + q));
sigmattkmaxraw_k = resMcd.Sigma(1:j,1:j);
sigmaytkmaxraw_k = resMcd.Sigma((kmax+1):(kmax + q),1:j);
sigmatykmaxraw_k = resMcd.Sigma(1:j,(kmax + 1):(kmax + q));
sigmayykmaxraw_k = resMcd.Sigma((kmax + 1):(kmax + q),(kmax + 1):(kmax + q));

% perform csteps:
Sigmaraw_k = [sigmattkmaxraw_k, sigmatykmaxraw_k ; sigmaytkmaxraw_k, sigmayykmaxraw_k];
Muraw_k = [mutkmaxraw_k;muykmaxraw_k]';

prevdet = 0;
if j ~= kmax
    geg_k = [T(:,1:j),y];
    for noCsteps = 1:10
        [sortMD,indsm] = sort(libra_mahalanobis(geg_k,Muraw_k,'cov',Sigmaraw_k));
        Sigmaraw_k = cov(geg_k(indsm(1:h),:));
        Muraw_k = mean(geg_k(indsm(1:h),:));
        obj = det(Sigmaraw_k);
        if noCsteps >= 20 |abs(obj - prevdet) < 10^(-4)
            if noCsteps >= 20
                disp('no convergence in csteps')
            end
            break
        end
        prevdet = obj;
    end
    Hopt = indsm(1:h);
end

mukmax_k =  Muraw_k;
mutkmax_k = Muraw_k(1:j)';
muykmax_k = Muraw_k((j+1):(j + q))';
sigmakmax_k = Sigmaraw_k;
sigmattkmax_k = Sigmaraw_k(1:j,1:j);
sigmaytkmax_k = Sigmaraw_k((j+1):(j + q),1:j);
sigmatykmax_k = Sigmaraw_k(1:j,(j + 1):(j + q));
sigmayykmax_k = Sigmaraw_k((j + 1):(j + q),(j + 1):(j + q));

sigmattinvkmax_k = inv(sigmattkmax_k);
Braw_k = sigmattinvkmax_k*sigmatykmax_k;
intraw_k = (muykmax_k - (sigmaytkmax_k*sigmattinvkmax_k*mutkmax_k))';

% reweighting:
rewweights=zeros(n,1);
rewfitted=T(:,1:j)*Braw_k + repmat(intraw_k,n,1);
rewresid=y-rewfitted; 
rewE=sigmayykmax_k-Braw_k'*sigmattkmax_k*Braw_k;
for noObs=1:n
    if (sqrt(rewresid(noObs,1:q)*inv(rewE)*rewresid(noObs,1:q)')) <= cutoffWeights
        rewweights(noObs)=1;
    end
end

rewclasscov=cov(geg(rewweights==1,:));
rewclasscenter=mean(geg(rewweights==1,:));

mukmaxrew_k =  rewclasscenter;
mutkmaxrew_k = rewclasscenter(1:j)';
muykmaxrew_k = rewclasscenter((j+1):(j + q))';
sigmakmaxrew_k = rewclasscov;
sigmattkmaxrew_k = rewclasscov(1:j,1:j);
sigmaytkmaxrew_k = rewclasscov((j+1):(j + q),1:j);
sigmatykmaxrew_k = rewclasscov(1:j,(j + 1):(j + q));
sigmayykmaxrew_k = rewclasscov((j + 1):(j + q),(j + 1):(j + q));

sigmattinvkmaxrew_k = inv(sigmattkmaxrew_k);
Bk = sigmattinvkmaxrew_k*sigmatykmaxrew_k;
intk = (muykmaxrew_k - (sigmaytkmaxrew_k*sigmattinvkmaxrew_k*mutkmaxrew_k))';% 
rewclasscov=cov(geg(rewweights==1,:));
rewclasscenter=mean(geg(rewweights==1,:));

mukmaxrew_k =  rewclasscenter;
mutkmaxrew_k = rewclasscenter(1:j)';
muykmaxrew_k = rewclasscenter((j+1):(j + q))';
sigmakmaxrew_k = rewclasscov;
sigmattkmaxrew_k = rewclasscov(1:j,1:j);
sigmaytkmaxrew_k = rewclasscov((j+1):(j + q),1:j);
sigmatykmaxrew_k = rewclasscov(1:j,(j + 1):(j + q));
sigmayykmaxrew_k = rewclasscov((j + 1):(j + q),(j + 1):(j + q));

sigmattinvkmaxrew_k = inv(sigmattkmaxrew_k);
Bk = sigmattinvkmaxrew_k*sigmatykmaxrew_k;
intk = (muykmaxrew_k - (sigmaytkmaxrew_k*sigmattinvkmaxrew_k*mutkmaxrew_k))';