Re: Fitting multiple data
- To: mathgroup at smc.vnet.net
- Subject: [mg50992] Re: [mg50966] Fitting multiple data
- From: "Maxim A. Dubinnyi" <maxim at nmr.ru>
- Date: Fri, 1 Oct 2004 04:48:07 -0400 (EDT)
- References: <200409300852.EAA26475@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Andriy Krasowsky wrote:
>Hallo!
>
>I have a problem with fitting of one function on several different
>data sets. The same step function describe two curves from experiments
>of different arts and has to be fitted simultaneous. Is there is any
>option in Mathematica for that?
>
>Thanks a lot!
>
>Andriy Krasowsky
>
>
>
Hi Andriy,
There is no build-in solution for this problem,
but it is easy to implement it yourself.
I am using the following strategy:
1. Introduce one additional independent variable MDL
for switching between models and data sets;
2. Construct model function of the form:
Which[MDL==1, Model1, MDL==2, Model2, ...];
3. Construct unified data set:
{{x1i, 1, y1i}, ..., {x2i, 2, y2i},...}
where the second element in each entry
is an index of original data set and appropriate
model function;
4. Peform ordinary fitting for new model function
and new unified data set.
The following is one simplest example:
<< Graphics`MultipleListPlot`
<< Graphics`Colors`
<< Statistics`NonlinearFit`
(* FIRST MODEL FUNCTION *)
Model1 = a Cos[b1 x];
(* SECOND MODEL FUNCTION, ONE COMMON PARAMETER 'a' *)
Model2 = a Cos[b2 x];
(* TRUE PARAMETER VALUES *)
TrueParams = {a->10, b1->1, b2->0.5};
(* NOISY DATA SETS FOR BOTH MODELS *)
SeedRandom[111];
Data1 = Table[{x, (Model1/.TrueParams)+
Random[Real,{-1, 1}]}, {x, 0, 10}];
Data2 = Table[{x, (Model2/.TrueParams)+
Random[Real,{-1, 1}]}, {x, 0, 15}];
(* DATA PLOT *)
gr1 = MultipleListPlot[Data1, Data2,
PlotJoined -> True,
PlotStyle -> {{Red}, {Blue}},
SymbolStyle -> {Red, Blue}];
(* COMBINED MODEL FUNCTION *)
CombinedModel :=
Which[MDL == 1, Evaluate@Model1,
MDL == 2, Evaluate@Model2,
True, 0];
(* COMBINED DATA SET *)
CombiledData = Join[Insert[#,1,2]&/@Data1, Insert[#,2,2]&/@Data2];
CombiledData//TableForm
(OUT[]=)
0 1 10.8067
1 1 4.67018
2 1 -4.99169
3 1 -9.27291
4 1 -5.76031
5 1 3.74943
6 1 9.01693
7 1 7.48695
8 1 -0.858472
9 1 -9.63991
10 1 -8.85283
0 2 9.51028
1 2 8.75934
2 2 4.57503
3 2 -0.0651154
4 2 -4.92631
5 2 -7.942
6 2 -9.61091
7 2 -8.65899
8 2 -7.04512
9 2 -2.66896
10 2 3.437
11 2 7.18905
12 2 10.131
13 2 9.39819
14 2 7.87224
15 2 3.39892
(* REGRESSION OF MULTIPLE DATA SETS *)
regreport = NonlinearRegress[
CombiledData,
CombinedModel,
{x, MDL},
{{a, 12}, {b1, 1}, {b2, 0.4}},
RegressionReport -> {BestFit, BestFitParameters}]
(OUT[]=)
{BestFit ->
Which[MDL==1, 9.96995 Cos[1.00147 x],
MDL==2, 9.96995 Cos[0.501091 x],
True, 0],
BestFitParameters -> {a->9.96995, b1->1.00147, b2->0.501091}}
(* PLOT OF THE DATA AND BEST FIT FUNCTIONS *)
gr2 = Plot[
Evaluate[(BestFit/.regreport)/.{{MDL->1},{MDL->2}}],
{x, 0, 15},
PlotStyle->{Red,Blue},
DisplayFunction->Identity];
Show[gr1, gr2];
Regards,
Maxim A. Dubinnyi.