ECG-Kit 1.0
(5,099 bytes)
function result = ols(x,y,varargin)
%OLS is the classical least squares estimator for multiple
% linear regression. It can handle both one or several predictor variables,
% and one response variable.
% If there are several response variables, the function mlr.m should be used.
%
% Required input arguments:
% x : Data matrix of the explanatory variables
% (n observations in rows, p variables in columns)
% Missing values (NaN's) and infinite values (Inf's) are allowed, since observations (rows)
% with missing or infinite values will automatically be excluded from the computations.
% y : Data vector with the response variable
% Missing values (NaN's) and infinite values (Inf's) are allowed, since observations (rows)
% with missing or infinite values will automatically be excluded from the computations.
%
% Optional input arguments:
% intercept : logical flag: if 1, a model with constant term will be
% fitted; if 0, no constant term will be included. (default: 1)
% plots : if 0, the plots are supressed (default:0)
%
% I/O: result=ols(x,y,'plots',0,'intercept',0)
% The user should only give the input arguments that have to change their default value.
% The name of the input arguments needs to be followed by their value.
% The order of the input arguments is of no importance.
%
% The output is a structure containing:
%
% result.slope : Slope estimate
% result.int : Intercept estimate (if no intercept is included, it equals zero)
% result.fitted : Fitted values
% result.res : Residuals
% result.scale : Scale estimate of the residuals
% result.rsquared : R-squared value
% result.md : Mahalanobis distances in x-space
% result.resd : Residual distances (which are equal to the standardized residuals)
% result.cutoff : Cutoff values for the score distances, and for the standardized residuals
% result.flag : The observations whose absolute standardized residual is larger than result.cutoff.resd
% receive a flag equal to zero. The other observations receive a flag 1.
% result.X : If x is univariate, data matrix without missing or infinite values.
% result.y : If x is univariate, response vector without missing or infinite values.
% result.class : 'LS'
%
% This function is part of LIBRA: the Matlab Library for Robust Analysis,
% available at:
% http://wis.kuleuven.be/stat/robust.html
%
% Written by Nele Smets on 06/12/2003
% Last update on 05/04/2004
if nargin<2
error('there is a missing input argument')
end
default=struct('intercept',1,'plots',1);
list=fieldnames(default);
options=default;
IN=length(list);
i=1;
counter=1;
if nargin > 3
%
% placing inputfields in array of strings
%
for j=1:nargin-2
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-3 % 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
end
intercept=options.intercept;
plots=options.plots;
[n,p]=size(x);
na.x=~isfinite(x*ones(p,1));
na.y=~isfinite(y);
if size(na.x,1)~=size(na.y,1)
error('Number of observations in x and y are not equal.');
end
ok=~(na.x|na.y);
x=x(ok,:);
y=y(ok,:);
n=length(y);
X=x;
if intercept
x=cat(2,x,ones(n,1));
p=p+1;
end
[coeff,bint,res] = regress(y,x);
fitted=x*coeff;
scale=sqrt(1/(n-p)*sum(res.^2));
stdres=res/scale;
md=sqrt(mahalanobis(X,mean(X),'cov',cov(X)))';
SSE=sum((y-fitted).^2);
if intercept
SST=sum((y-mean(y)).^2);
cutoff.md=sqrt(chi2inv(0.975,p-1));
else
SST=sum(y.^2);
cutoff.md=sqrt(chi2inv(0.975,p));
end
cutoff.resd=sqrt(chi2inv(0.975,1));
rsquared=1-SSE/SST;
flags=(abs(stdres)<=cutoff.resd);
result=struct('slope',{coeff(1:p)},'int',{0},'fitted',{fitted},'res',{res},'scale',{scale},'rsquared',{rsquared},...
'md',md,'resd', {stdres},'cutoff',cutoff,'flag',{flags},'class',{'LS'},'X',{X},'y',{y});
if intercept
result=setfield(result,'slope',coeff(1:p-1));
result=setfield(result,'int', coeff(p));
end
if size(X,2)~=1
result=rmfield(result,{'X','y'});
end
try
if plots
makeplot(result)
end
catch %output must be given even if plots are interrupted
%> delete(gcf) to get rid of the menu
end