# What are the practical differences between Fit, NonlinearModelFit, and FindFit

What are the practical differences between: FindFit,NonlinearModelFit,and Fit. Do they call different fitting algorithms and routines? How can one tell which is best to use in a certain situation. How is it best to use them once you've chosen?

• Fit does not contain without support for diagnostic of the defined model. NonlinearModelFit contain, for instance, results of ANOVA, confidence intervals for parameters of model, information criteria as a BIC, AIC .... – Slepecky Mamut Nov 2 '18 at 10:11

Fit is limited to using a series of basis functions. It finds the parameters multiplied by the basis functions that fits the data in a least squares sense.

FindFitis capable of using very general functions that don't work with the Fit model. It will also find parameters that fits the data in a least squares sense.

LinearModelFit is the same as Fit with the additional ability of outputting a great deal of diagnostic information. The output can conveniently be used directly as a function.

Similarly NonlinearModelFit is the same as FindFit with the ability of outputting diagnostic information. The output can be used directly as a function.

Example:

data = Table[Prime[x], {x, 20}]
(* {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, \
59, 61, 67, 71} *)


## Fit

Fit[data, {1, x, x^2}, x]
(* -1.92368 + 2.2055 x + 0.0746753 x^2 *)


Plotting the result requires either copy and pasting the function or using Evaluate within Plot.

Show[
Plot[Evaluate[Fit[data, {1, x, x^2}, x]],  {x, 1, 20}],
ListPlot[data, PlotStyle -> Red]
]


## LinearModelFit

lm = LinearModelFit[data, {1, x, x^2}, x]


lm["BestFitParameters"]
(* {-1.92368, 2.2055, 0.0746753} *)


Some diagnostic information

lm["CorrelationMatrix"]
(* {{1., -0.888805, 0.781116}, {-0.888805,
1., -0.971348}, {0.781116, -0.971348, 1.}} *)


Easier to plot. Can use lm directly as a function.

Show[
Plot[lm[x],  {x, 1, 20}],
ListPlot[data, PlotStyle -> Red]
]


## FindFit

Can use general functions.

FindFit[data, a x Log[b + c x], {a, b, c}, x]
(* {a -> 1.42076, b -> 1.65558, c -> 0.534645} *)


Same problem with plotting.

Show[
Plot[Evaluate[
a x Log[b + c x] /.
FindFit[data, a x Log[b + c x], {a, b, c}, x]],  {x, 1, 20}],
ListPlot[data, PlotStyle -> Red]
]


## NonlinearModelFit

nlm = NonlinearModelFit[data, a x Log[b + c x], {a, b, c}, x]


nlm["BestFitParameters"]
(* {a -> 1.42076, b -> 1.65558, c -> 0.534645} *)


Some diagnostic information

nlm["CorrelationMatrix"]
(* {{1., 0.844101, -0.998155}, {0.844101,
1., -0.872743}, {-0.998155, -0.872743, 1.}} *)


As with LinearModelFit can use the output directly as a function.

Show[
Plot[nlm[x],  {x, 1, 20}],
ListPlot[data, PlotStyle -> Red]
]


• Beautifully detailed and explained answer. Thank you! – Q.P. Nov 6 '18 at 18:58