 |
Linear
Regression
This program fits a straight line to a
given set of coordinates using
the method of least
squares ( linear regression ).
|
|
The coefficients of the line,
coefficient
of determination, coefficient
of correlation and standard
error of estimate are calculated. Once the line has been
fitted, you may predict values of y
for given values of x.
We develop the following Matlab code (note that Matlab has its own built-in functions to make linear regression
|
easier for all of us, but we'd like to
show a step-by-step way to do it, to understand the inner concepts):
function [y0, a, b, r2, r, k2] = lin_reg(x, y, x0)
% Number of
known points
n = length(x);
%
Initialization
j = 0; k = 0; l = 0; m = 0; r2 = 0;
% Accumulate
intermediate sums
j = sum(x);
k = sum(y);
l = sum(x.^2);
m = sum(y.^2);
r2 = sum(x.*y);
% Compute
curve coefficients
b = (n*r2 - k*j)/(n*l - j^2);
a = (k - b*j)/n;
% Compute
regression analysis
j = b*(r2 - j*k/n);
m = m - k^2/n;
k = m - j;
% Coefficient
of determination
r2 = j/m;
% Coefficient
of correlation
r = sqrt(r2);
% Std. error
of estimate
k2 = sqrt(k/(n-2));
%
Interpolation value
y0 = a + b*x0;
If we have the following data available (where every yi has its correspondent xi):
x = [71
73 64 65 61
70 65 72 63 67 64];
y = [160
183 154 168 159 180 145 210 132 168 141];
we can call the function above in this manner (to obtain interpolated
values for x = 70 and x = 72):
[y0, a, b, r2, r, k2] = lin_reg(x, y, 70)
[y0] = lin_reg(x, y, 72)
And the Matlab response is:
y0 = 176.5139
a = -106.7917
b = 4.0472
r2 = 0.5563
r = 0.7458
k2 = 15.4135
y0 = 184.6083
We can use the 'polyfit'
and 'polyval'
instructions in Matlab for this purpose, like this:
a = polyfit(x, y, 1)
y0 = polyval(a, 70)
y0 = polyval(a, 72)
Fitting
a straight line through the data means thet we want to find the
polynomial coefficients of a first order polynomial such that a1xi
+ a0
gives the best approximation for yi.
We find the coefficients with 'polyfit'
and evaluate any xi
with 'polyval'.
The Matlab results is
a = 4.0472 -106.7917
y0 = 176.5139
y0 = 184.6083
confirming our previous numbers.
From
'Linear Regression'
to home From
'Linear Regression' to 'Matlab Cookbook'


|
|
|