74 lines
2.3 KiB
Matlab
74 lines
2.3 KiB
Matlab
function [r2 rmse] = rsquare(y,f,varargin)
|
|
% Compute coefficient of determination of data fit model and RMSE
|
|
%
|
|
% [r2 rmse] = rsquare(y,f)
|
|
% [r2 rmse] = rsquare(y,f,c)
|
|
%
|
|
% RSQUARE computes the coefficient of determination (R-square) value from
|
|
% actual data Y and model data F. The code uses a general version of
|
|
% R-square, based on comparing the variability of the estimation errors
|
|
% with the variability of the original values. RSQUARE also outputs the
|
|
% root mean squared error (RMSE) for the user's convenience.
|
|
%
|
|
% Note: RSQUARE ignores comparisons involving NaN values.
|
|
%
|
|
% INPUTS
|
|
% Y : Actual data
|
|
% F : Model fit
|
|
%
|
|
% OPTION
|
|
% C : Constant term in model
|
|
% R-square may be a questionable measure of fit when no
|
|
% constant term is included in the model.
|
|
% [DEFAULT] TRUE : Use traditional R-square computation
|
|
% FALSE : Uses alternate R-square computation for model
|
|
% without constant term [R2 = 1 - NORM(Y-F)/NORM(Y)]
|
|
%
|
|
% OUTPUT
|
|
% R2 : Coefficient of determination
|
|
% RMSE : Root mean squared error
|
|
%
|
|
% EXAMPLE
|
|
% x = 0:0.1:10;
|
|
% y = 2.*x + 1 + randn(size(x));
|
|
% p = polyfit(x,y,1);
|
|
% f = polyval(p,x);
|
|
% [r2 rmse] = rsquare(y,f);
|
|
% figure; plot(x,y,'b-');
|
|
% hold on; plot(x,f,'r-');
|
|
% title(strcat(['R2 = ' num2str(r2) '; RMSE = ' num2str(rmse)]))
|
|
%
|
|
% Jered R Wells
|
|
% 11/17/11
|
|
% jered [dot] wells [at] duke [dot] edu
|
|
%
|
|
% v1.2 (02/14/2012)
|
|
%
|
|
% Thanks to John D'Errico for useful comments and insight which has helped
|
|
% to improve this code. His code POLYFITN was consulted in the inclusion of
|
|
% the C-option (REF. File ID: #34765).
|
|
|
|
if isempty(varargin); c = true;
|
|
elseif length(varargin)>1; error 'Too many input arguments';
|
|
elseif ~islogical(varargin{1}); error 'C must be logical (TRUE||FALSE)'
|
|
else c = varargin{1};
|
|
end
|
|
|
|
% Compare inputs
|
|
if ~all(size(y)==size(f)); error 'Y and F must be the same size'; end
|
|
|
|
% Check for NaN
|
|
tmp = ~or(isnan(y),isnan(f));
|
|
y = y(tmp);
|
|
f = f(tmp);
|
|
|
|
if c; r2 = max(0,1 - sum((y(:)-f(:)).^2)/sum((y(:)-mean(y(:))).^2));
|
|
else r2 = 1 - sum((y(:)-f(:)).^2)/sum((y(:)).^2);
|
|
if r2<0
|
|
% http://web.maths.unsw.edu.au/~adelle/Garvan/Assays/GoodnessOfFit.html
|
|
warning('Consider adding a constant term to your model') %#ok<WNTAG>
|
|
r2 = 0;
|
|
end
|
|
end
|
|
|
|
rmse = sqrt(mean((y(:) - f(:)).^2)); |