MathGroup Archive 2010

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

Search the Archive

Re: FittedModel object type

  • To: mathgroup at
  • Subject: [mg110883] Re: FittedModel object type
  • From: Vincent <sheeplane at>
  • Date: Sat, 10 Jul 2010 03:59:59 -0400 (EDT)
  • References: <i15qph$ksm$>

On Jul 9, 2:33 am, Darren Glosemeyer <darr... at> wrote:
> Vincent wrote:
> > Is there an easy way to get Mathematica to interpret custom code when
> > a FittedModel is called with a custom argument, for example if I have
> > modelfit = NonlinearModelFit[...]
> > modelfit ["EstimatedPower"]
> > which would then call my own code using the modelfit object to compute
> > something?
> > I know that it's trivial to achieve the same functionality just
> > calling the function on the variable, but I rather like the object
> > orientet like syntax of adding my own figures to the FittedModel
> > object.
> There currently isn't a mechanism in place for this. A possibility if
> you really want an object oriented approach could be to define a new
> operator that will get properties via FittedModel if possible and from
> other definitions when added.
> In[1]:= nlm = NonlinearModelFit[Range[10]^2, b*Exp[a*x], {a, b}, x];
> (* get property from built-in code for defined properties *)
> In[2]:= myModelProperties[model : FittedModel[{"Nonlinear", __},
> __]][prop_] :=
>           model[prop] /; MemberQ[model["Properties"], prop]
> (* give the definition for a new property *)
> In[3]:= myModelProperties[model : FittedModel[{"Nonlinear", __}, __]][
>           "SinVariance"] := Sin[model["EstimatedVariance"]]
> (* define a construct for lists of properties *)
> In[4]:= myModelProperties[model : FittedModel[{"Nonlinear", __}, __]][
>           vals : {_String ...}] := Map[myModelProperties[mode=
l], vals]
> (* this is our new object *)
> In[5]:= op = myModelProperties[nlm];
> (* get single newly defined and pre-existing properties and get both in
> a list at once *)
> In[6]:= op["SinVariance"]
> Out[6]= 0.618074
> In[7]:= op["BestFit"]
>                  0.288603 x
> Out[7]= 5.86625 E
> In[8]:= op[{"SinVariance", "BestFit"}]
>                             0.288603 x
> Out[8]= {0.618074, 5.86625 E          }
> For lists of properties, the code above may be slower than the built-in
> FittedModel property code because the FittedModel code re-uses shared
> intermediate results while the code above does not.
> Darren Glosemeyer
> Wolfram Research

Thank you very much for your reply, I found it very helpful, and the
idea of making new classes when you want to extend the properties of a
current class seems very much in line with object oriented thinking.
While trying to solve the problem on my own i came by a different
method, which however did not allow list of properties. By
unprotecting string and making a definition for it, you get something
like what I wanted


Now I'm thinking that this is very bad, since Mathematica now makes an
additional check everytime a sting is input to a function, is this
correct? I was thinking you could get by this simply considering
EstimatedPower a symbol, which allows  you to just call the
FittedModels with syntax like mld[EstimatedPower], which is almost the
same except for the quotes. This would only be checked specifically
when the EstimatedPower property is requested right?


I'm going to go with a solution like what you posted, however if you
or anyone else would care to comment on these two examples I would be
very happy to see if my understanding of up/downvalues is way off.

  • Prev by Date: Re: replacement x->y except in Exp[x]
  • Next by Date: Re: replacement x->y except in Exp[x]
  • Previous by thread: Re: FittedModel object type
  • Next by thread: First nonzero in list