# How do I Regression Fit a SinWave to a dataset?

227 views (last 30 days)

Show older comments

Clifford Shelton
on 30 Apr 2012

Commented: Devon Cogan
on 18 Jul 2016

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!

##### 1 Comment

Arjun Jaitli
on 20 Nov 2014

### Accepted Answer

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.

##### 2 Comments

Devon Cogan
on 18 Jul 2016

### More Answers (1)

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])

##### 0 Comments

### See Also

### Categories

### Community Treasure Hunt

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

Start Hunting!