MathGroup Archive 2011

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

Search the Archive

Re: FindFit power law problem

  • To: mathgroup at smc.vnet.net
  • Subject: [mg117105] Re: FindFit power law problem
  • From: Gary Wardall <gwardall at gmail.com>
  • Date: Thu, 10 Mar 2011 06:06:49 -0500 (EST)
  • References: <il50uv$nck$1@smc.vnet.net>

On Mar 8, 4:38 am, Bill Rowe <readn... at sbcglobal.net> wrote:
> On 3/7/11 at 5:48 AM, jgchild... at mailaps.org (Greg Childers) wrote:
>
> >I'm having a problem with FindFit and a power law problem.  Here's
> >the data:
> >data = {{1004, 0.003977}, {9970, 0.006494}, {100000, 0.012921},
> >{1001000, .059795}}
> >I'm wanting to fit it to a function of the form y = a x^b, and
> >determine the best value of b.  When entered into Excel, it returns
> >the exponent b = 0.383.  However, Mathematica gives
> >FindFit[data, a x^b, {a, b}, x] {a->0.0000145749, b->0.601807}
> >A graph of these values overlaid on the original data simply didn't
> >look right.  Another way to find the exponent b is to take the log
> >of both sides and do a linear fit:
> >Fit[Log[10, data], {1, x}, x] -3.64936 + 0.383174 x
> >And sure enough the exponent is 0.383 in agreement with Excel.  Why
> >does FindFit give a different value?
>
> The short answer is FindFit is trying to *correctly* solve the
> following problem,
>
> y = a x^b + error
>
> where the error term is assumed to be normally distributed.
> Excel most definitely is not doing this. Excel does precisely
> what you did by taking the Log of your data then estimating the
> parameters. Note, when you take the Log you have
>
> Log[y] = Log[a] + Log[x^b + error]
>
> not
>
> Log[y] = Log[a] + b Log[x] + error
>
> It is this last problem Excel solves and what FindFit solves
> when you first take the Log of your data array then use FindFit.
>
> An additional problem is seen when you do ListLogLogPlot[data].
> That is, the resulting plot shows curvature indicating y = a x^b
> isn't the underlying model for your data.
>
> The curvature suggests a model like y = a(x+b)^c would better
> fit your data. When I use this model I get
>
> In[6]:= FindFit[data, a*(x + b)^c, {a, b, c}, x]
>
> Out[6]= {a -> 2.14496457174612*^-6, b -> 32107.42765117816,
>     c -> 0.7391222616795872}
>
> and on checking
>
> In[7]:= model = a (x + b)^c /. %
>
> Out[7]= 2.14496*10^-6 (x+32107.4)^0.739122
>
> The plot that results from
>
> LogLogPlot[model, {x, 1000, 1.5 10^6},
>   Epilog -> {PointSize[.01], Point[Log[data]]}]
>
> seems to be in good agreement with the data
>
> Note, I am not claiming this is a correct model for your data.
> It is merely the first model that came to mind after looking a a
> log log plot of your data points. And since you only have 4 data
> points and this model has three free parameters, it is virtually
> guaranteed to show a better fit to your data regardless of
> whether it matches the "true" model or not. I've put true in
> quotes here since if this data is experimental data, the "true"
> model is often unknown.

Greg,

I was wondering if you really meant to transform both the x and y
data?

Fit[Log[10, data], {1, x}, x]

Does just that. Some software transforms just the y data when
estimating the coefficients for the model y = a x^b.

What happens is they transform just the y data and use the linear
model

yy=aa+bb*ln[x]

Finding the coefficients aa and bb and state the results as

y=Exp[aa]*x^bb

Since:

y=Exp[aa+bb*ln[x]]

is equivalent to:

y=Exp[aa]*Exp[bb*ln[x]]

in turn is equivalent to:

y=Exp[aa]*Exp[ln[x^bb]]

which is also equivalent to:

y=Exp[aa]*x^bb

Note then that a=Exp[aa] and b=bb.

I hope my Algebra is correct.

Gary


  • Prev by Date: Re: How to kill slave kernel securely?
  • Next by Date: Re: Algebraic substitution with PolynomialReduce
  • Previous by thread: Re: FindFit power law problem
  • Next by thread: Re: FindFit power law problem