How to fit a general curve on different datasets ?

14 vues (au cours des 30 derniers jours)
yj
yj le 11 Sep 2019
Modifié(e) : Jon le 23 Sep 2019
Hi,
I have different datasets that I would like to fit together in order to create a general equation.
Yet I have fitted each dataset independently as : y_i=a_i + b_i * log10(x)
%% Example of one dataset
x= [1 10 100]';
y= [165 145 124]';
fo = fitoptions('Method','NonlinearLeastSquares',...
'Lower',[1],...
'Upper',[200],...
'StartPoint',[180 180]);
ft = fittype('a + b*log10(x)','dependent',{'y'},'independent',{'x'},'coefficients',{'a','b'},'options',fo);
myfit=fit(x(:),y(:),ft);
plot(x,y, 'ko', 'LineWidth',1.5, 'MarkerSize',7)
hold on
plot(myfit, 'k--')
But now I would like to test this thing : y_i = a_i + b * log10(x) with a general b for all the dataset. So I need to fit this new model into my whole dataset to get an estimation of b that match with every dataset.
Does anyone as an idea on how to do this in matlab ?
Thank you very much for your help.

Réponse acceptée

Jeff Miller
Jeff Miller le 13 Sep 2019
You need to set up separate independent variables for each dataset, something like this:
%% Example of two datasets (3 scores each)
i1= [1 1 1 0 0 0]; % 1 indicates member of 1st data set
i2= [0 0 0 1 1 1]; % 1 indicates member of 2nd data set
x= [1 10 100 1 10 100]'; % concatenated x's for both data sets
y= [165 145 124 155 135 114]'; % concatenated y's for both data sets
% Then fit a model like this
'a1*i1 + a2*i2 + b*log10(x)'
But I don't think the 'fit' function will do that--at least not for more than 2 datasets. You could do it with regress, at least if you make a new independent variable:
log10x = log10(x);
% Then fit
'a1*i1 + a2*i2 + b*log10x'
MATLAB probably has some other nonlinear fitting routines that would also work, using the same basic indicator variable trick.
  6 commentaires
Jeff Miller
Jeff Miller le 20 Sep 2019
A small simulation shows that John is exactly right:
% Simulation with equal x's in all groups, but random y's
i1= [1 1 1 0 0 0]'; % 1 indicates member of 1st data set
i2= [0 0 0 1 1 1]'; % 1 indicates member of 2nd data set
x = [1 10 100 1 10 100]'; % concatenated x's for both data sets
log10x = log10(x);
NTries = 10;
for i=1:NTries
y1 = randn(3,1);
a1 = regress(y1,[i1(1:3) log10x(1:3)]);
y2 = randn(3,1);
a2 = regress(y2,[i2(4:6) log10x(4:6)]);
y = [y1; y2];
a = regress(y,[i1 i2 log10x]);
dif = abs(a(3) - (a1(2) + a2(2))/2)
end
% The resulting difs are all miniscule, so in this case the slope of the
% combined data set matches the average of the individual slopes.
% Simulation with different x's in all groups, but random y's
for i=1:NTries
x = randn(6,1).^2;
log10x = log10(x);
y1 = randn(3,1);
a1 = regress(y1,[i1(1:3) log10x(1:3)]);
y2 = randn(3,1);
a2 = regress(y2,[i2(4:6) log10x(4:6)]);
y = [y1; y2];
a = regress(y,[i1 i2 log10x]);
dif2 = abs(a(3) - (a1(2) + a2(2))/2)
end
% The resulting dif2s are much larger, so in this case the slope of the
% combined data set need not match the average of the individual slopes.
yj
yj le 20 Sep 2019
Yes thank you very much for your answers !!

Connectez-vous pour commenter.

Plus de réponses (1)

Jon
Jon le 11 Sep 2019
If I am understanding what you are trying to do correctly, it seems like you should be able to concatenate all of your individual x values into one overall x vector, and similarly concatenate all of your y values into one overall y vector and then perform the curve fit on the combined set.
  9 commentaires
John D'Errico
John D'Errico le 20 Sep 2019
Actually, this is the incorrect answer, since it will also use a common value for a.
Jon
Jon le 23 Sep 2019
Modifié(e) : Jon le 23 Sep 2019
I don't think that the approach I outlined will result in a common value of a, but I'm glad that you found a solution. (The approach I outlined may be buried under the older comments, you may not have seen it.)

Connectez-vous pour commenter.

Catégories

En savoir plus sur Fit Postprocessing dans Help Center et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by