How to perform nonlinear regression accross multiple datasets
20 views (last 30 days)
Show older comments
Appolgies in advance as I am new to MATLAB.
I am trying to fit a model to mutiple data sets at once using non linear regression. I have found similiar examples but I am unable to modify them to suit my needs.
The model contains 3 unkown paramaters that must be tuned to satsifty (or give best model fit) accross 4 data sets at once.However, the model also contains 1 known paramater which is different for each of the 4 datasets.
Model to fit:
- ΔRon/Ron are the data set y values
- t is the data set x values
- A1, A2, γ are unkown paramaters (common to all data sets) which must be found
- tau is a kown paramaer whcih differs accross all data sets
I have attached an m-file with relevant data and information. If sombody could provide guidance or a commented solution I would be very grateful. Thanks.
8 Comments
Accepted Answer
Deepak Meena
on 24 Feb 2021
Hi Jack,
The following post on MATLAB Answers discusses a similar case:
In that question , there were 2 unknown shared parameters and 1 parameter was different for all the dataset but was also unknown. In this question we have 3 unknown shared parameters and 1 known parameters whose value will be different for each dataset.So I modified that to illustrate that :
function sharedparams
t = (0:10)';
T = [t; t; t;t];
Y = 3 + [exp(-t/2); 2*exp(-t/2); 3*exp(-t/2);4*exp(-t/2)] + randn(44,1)/10;
dsid = [ones(11,1); 2*ones(11,1); 3*ones(11,1);4*ones(11,1)];
gscatter(T,Y,dsid)
X = [T dsid];
A3 = [-5;1;3;4];
b = nlinfit(X,Y,@subfun,ones(1,3))
line(t,b(1)+b(2)+b(3)*t+A3(1),'color','r');
line(t,b(1)+b(2)+b(3)*t+A3(2),'color','g');
line(t,b(1)+b(2)+b(3)*t+A3(3),'color','b');
line(t,b(1)+b(2)+b(3)*t+A3(4),'color','c');
function yfit = subfun(param,X)
T = X(:,1); % time
dsid = X(:,2); % dataset id
A0 = param(1);
A1 = param(2);
A2 = param(3);
A3 = [-5;1;3;4]; %known paramter
yfit = A0 + A1+ A2*T + A3(dsid);
7 Comments
Tom Lane
on 25 Feb 2021
You have:
yfit = A1 * log(1 + T/tau(dsid)) + A2 * log(1 + (T/tau(dsid))*(1/gamma));
You should have:
yfit = A1 * log(1 + T./tau(dsid)) + A2 * log(1 + (T./tau(dsid))*(1/gamma));
You want element-by-element division, not vector division in the sense of a matrix operation.
More Answers (0)
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!