MathGroup Archive 2002

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Weights syntax in NonlinearRegress/Fit

  • To: mathgroup at smc.vnet.net
  • Subject: [mg34125] Re: Weights syntax in NonlinearRegress/Fit
  • From: adam.smith at hillsdale.edu (Adam Smith)
  • Date: Sat, 4 May 2002 04:29:18 -0400 (EDT)
  • References: <aaols2$een$1@smc.vnet.net>
  • Sender: owner-wri-mathgroup at wolfram.com

See if the following helps.  I tried to do things in the way that is
easiest to visualize.  It probably is not the most elegant or
efficient way.

Adam Smith  

In[18]:=
Needs["Statistics`NonlinearFit`"]

Define a function for the data

In[19]:=
 f[x_] := 1000*E^(-0.25*x)+10

Now create a list of perfect data without any error

In[20]:=
perfectdata=Table[{x, f[x]}, {x, 0,20, 0.5}];

Now create a list of data with a random error that is +/- the square
root of the "perfectdata.  There are more elegant ways in Mathematica
to do this, but this seems the easiest to understand.

In[21]:=
data = Table[{x, f[x]+Sqrt[f[x]]*Random[Real,{-1,1}]}, {x, 0, 20,
0.5}];

Now create a list of weights based on the "noisy" data.  I choose to
weight by the square root of the number (statistical weighting).

In[22]:=
mywts = Table[ data[[i,2]]^.5,{i,1,Length[data]}];

This next one is just a test for all the weights being equal - the
default in NonlinearFit.

In[23]:=
equalwts = Table[ 1,{i,1,Length[data]}];

This is just to visualize the two data sets.

In[24]:=
plot1 = ListPlot[data,PlotStyle->PointSize[0.018]]; 
 ListPlot[perfectdata,PlotStyle->PointSize[0.018]]; 

Define the model that I want to fit

In[26]:=
 fmodel[a_, b_,c_][x_] := b*E^(-a*x)+c;

Try the default with the default weighting
In[27]:=
NonlinearRegress[data, fmodel[a, b,c][x], {x}, {a, b,c},
  RegressionReport ->{BestFitParameters}]
Out[27]=
{BestFitParameters ->{a->0.243643,b->997.273,c->6.67955}}

Now check my equal weighting list.  It should give the same as above. 
Examination shows this is true.  Using
RegressionReport->{BestFitParameters, ParameterCITable} reveals that
the uncertainties in the parameters differ for different weighting
also.  I just left them off because they don't translate well into
asii text.

In[28]:=
NonlinearRegress[data, fmodel[a, b,c][x], {x}, {a, b,c},
  RegressionReport->BestFitParameters},Weights->equalwts]
Out[28]=
{BestFitParameters->{a->0.243643,b->997.273,c->6.67955}}

Now try the weighting function I created above and named "mywts". 
Note the changes from the above non-weighted parameters.

In[29]:=
NonlinearRegress[data, fmodel[a, b,c][x], {x}, {a, b,c},
  RegressionReport->{BestFitParameters},Weights->mywts]

Out[29]=
{BestFitParameters->{a->0.239198,b->997.654,c->2.38525}}

There is another way using a pure function that avoids manually
constructing the list of weights.

In[30]:=
NonlinearRegress[data, fmodel[a, b,c][x], {x}, {a, b,c},
  RegressionReport->{BestFitParameters},Weights->(Sqrt[#]&)]
Out[30]=
{BestFitParameters->{a->0.239198,b->997.654,c->2.38525}}

The following checks the last method by plotting the fit function over
the data.  "plot1" is defined above and is just the "noisy data".
In[31]:=
ffit[x_] = fmodel[a, b,c][x] /. (BestFitParameters /. %) 
plot2 = Plot[ffit[x], {x, 0, 12}];
Show[plot1, plot2]; 


Dion Lewis <dlewis at kerr.phys.utas.edu.au> wrote in message news:<aaols2$een$1 at smc.vnet.net>...
> Hi,
> 
> It seems I have an identical problem to Frederic Fontaine dated 22 Jun
> 1999 that didn't get answered in the threads.
> 
> I'm ALSO having troubles with the syntax of the Weights option in
> NonlinearRegress.  I want to input an equation not simply values.
> I'm not a member of this list so Im not sure if this will get back to me
> either...
> I'd appreciate any help, for ease I have cut and pasted his eloquent
> version...
> 
> 
> NonlinearRegress, Weights, Syntax
> Subject: [mg34125]  NonlinearRegress,Weights, Syntax 
> From: Frederic Fontaine <F.Fontaine at fz-rossendorf.de> 
To: mathgroup at smc.vnet.net
> 
> Hi,
> 
> I've been fighting against the syntax of the option "Weights" in the
> NonlinearRegress command. I want to fit large data sets and I don't want
> to type hundreds of values. I'd rather use a function defining the weight
> of each data points. But how to do it with Mathematica 3 for Unix?
> For instance:
> NonlinearRegress[dataset, fitfunction(x,para),{x},{para},Weights->{???}]
> I would appreciate someone helping me remove the question marks!
> 
> **Edited from F.F.**
> 
> Regards,
> Dion Lewis
> University of Tasmania
> Physics Department


  • Prev by Date: RE: Re: Dynamic referencing AND hyperlinking for numbered equations
  • Next by Date: RE: Re: Dynamic referencing AND hyperlinking for numbered equations
  • Previous by thread: Re: Weights syntax in NonlinearRegress/Fit
  • Next by thread: Re: Inquery(Partial Differentiation)