forked from mwgeurts/libra
-
Notifications
You must be signed in to change notification settings - Fork 0
/
ols.m
executable file
·143 lines (136 loc) · 4.98 KB
/
ols.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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