310 views (last 30 days)

Show older comments

I have a dataset and I want to best fit a sinewave to the plotted data set. This process I think is called a regression...but all the info I come across is about linear regressions only.

Any help would be most appreciated!

Arjun Jaitli
on 20 Nov 2014

Wayne King
on 30 Apr 2012

You need to know what periods you want to fit. You had another post where you talked about fitting city population for a period of 50 years. You did not say how often the data are sampled, I'll assume yearly. Just substitute your data for y (as a column vector)

t = (1:50)';

X = ones(50,3);

X(:,2) = cos((2*pi)/50*t);

X(:,3) = sin((2*pi)/50*t);

y = 2*cos((2*pi)/50*t-pi/4)+randn(size(t));

y = y(:);

beta = X\y;

yhat = beta(1)+beta(2)*cos((2*pi)/50*t)+beta(3)*sin((2*pi)/50*t);

plot(t,y,'b');

hold on

plot(t,yhat,'r','linewidth',2);

If you have the Statistics Toolbox, you can do the same thing with regress()

If you don't know the periods, it is best to use Fourier analysis.

Devon Cogan
on 18 Jul 2016

Richard Willey
on 1 May 2012

Here's some simple code that illustrates how to perform nonlinear regression using the 12a release of Statistics Toolbox.

Note: NonLinearModel.fit requires that you provide starting conditions for the various parameters. (Providing good starting conditions helps to ensure that the optimization solvers converge on a global solution rather than a local solution)

%%Generate some data

X = 2* pi*rand(100,1);

X = sortrows(X);

Y = 9 + 7*sin(2*X + 4*pi) + randn(100,1);

scatter(X,Y)

Generate a fit

% Note that we need to pass three sets of input arguments to NonLinearModel

% # The X and Y data

% # A string describing our model

% # Starting conditions for the optimization solvers

% Generate some good starting conditions for the solvers

scatter(X, Y)

hold on

B0 = mean(Y); % Vertical shift

B1 = (max(Y) - min(Y))/2; % Amplitude

B2 = 2; % Phase (Number of peaks)

B3 = 0; % Phase shift (eyeball the Curve)

myFit = NonLinearModel.fit(X,Y, 'y ~ b0 + b1*sin(b2*x1 + b3)', [B0, B1, B2, B3])

% Note that all the coefficient estimates are very good except for b3 where

% any even integer is equally valid

%%look at the complete set of methods

methods(myFit)

%%Generate a plot

hold on

plot(X, myFit.Fitted)

hold off

%%Generate a fit using an alternative syntax

myFit2 = NonLinearModel.fit(X,Y, @(b,x)(b(1) + b(2)*sin(b(3)*x + b(4))), [B0, B1, B2, B3])

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!