Hello,
I am using Mathematica to fit a nonlinear function of several variables to a large set of experimental data (strain as a function of stress and time under load, if it helps to know that). I have been using the NonlinearModelFit function with limited success. Here is my primary question: is there a way to track the progress of the fitting algorithm as it proceeds through the allowed number of iterations? For instance, I would like to watch how the RSquared value of the model changes as the fit progresses.
I have tried putting the fit inside a FOR loop, but I do not think this is a viable option. When I run NonlinearModelFit by itself for 10 iterations, I end up with different values for the model parameters than if I run the FOR loop 10 times with NonlinearModelFit iterating once inside the FOR loop each time, even though both cases technically have the same number of total fitting iterations. I suspect this is because of how the minimization algorithm works during successive iterations, but I have not found this explained anywhere in the Mathematica documentation.
Any suggestions are greatly appreciated!
The EvaluationMonitor option might be helpful.
You would have to write a little code to calculate RSquared from the data and the fit so far.
In[2]:= data = {{0, 1}, {1, 0}, {3, 2}, {5, 4}, {6, 4}, {7, 5}};
In[3]:= nlm = NonlinearModelFit[data, Log[a + b x^2], {a, b}, x,
EvaluationMonitor :> Print["a=", a, ". b=", b] ]
a=1.. b=1.
a=1.4247. b=1.34938
a=1.50416. b=1.42418
a=1.50629. b=1.42634
...
Bruce,
Thank you for the reply. I am currently using Step Monitor in a way similar to what you suggested with Evaluation Monitor; I output the parameter values as the end of each increment within NonlinearModelFit and store them in an Excel file so I can plot the trend vs. the number of iterations.
I am curious about your suggestion to compute the RSquared value on my own, though. After NonlinearModelFit runs to full number of iterations I allow it to, the AdjustedRSquared parameter is available as a function of the final fitted model. Is there a way for me to access that information ‘inside’ the fitting algorithm? Presumable, the algorithm uses it, or something similar, to determine whether the fit has converged and/or which parameters to modify in order to move closer to convergence.
Thanks.
StepMonitor or EvaluationMonitor can be used to print the results of calculations.
Simple example: sum of squares of the residuals, using the values of a and b from the most recent step:
In[1]:= data = {{0, 1}, {1, 0}, {3, 2}, {5, 4}, {6, 4}, {7, 5}};
In[2]:= nlm = NonlinearModelFit[data, Log[a + b*x^2], {a, b}, x,
StepMonitor :> Print[
Total[(data[[All,2]] - (Log[a + b*x^2] /. {x -> data[[All,1]]}))^2]]]
2.64897
2.63049
2.63047
2.63047
...
Unadjusted R^2,
In[4]:= nlm = NonlinearModelFit[data, Log[a + b*x^2], {a, b}, x,
StepMonitor :> Print["R^2 = ", 1 -
Total[(data[[All, 2]] - (Log[a + b*x^2] /. {x -> data[[All, 1]]}))^2]/
Total[(data[[All, 2]] - Mean[data[[All, 2]]])^2]
]]
R^2 = 0.862984
R^2 = 0.86394
R^2 = 0.863941
R^2 = 0.863941
...
Data and fitted curve.
In[5]:= Show[ListPlot[data, PlotStyle -> {Red, PointSize[Large]}],
Plot[nlm[x], {x, 0, 7}]]
ref: http://en.wikipedia.org/wiki/Coefficient_of_determination (The formulas are in many places.)
