nlinfit
statistics: beta = nlinfit (X, y, modelfun, beta0)
statistics: beta = nlinfit (…, options)
statistics: beta = nlinfit (…, Name, Value)
statistics: [beta, R, J, CovB, MSE, ErrorModelInfo] = nlinfit (…)
Fit a nonlinear regression model.
beta = nlinfit (X, y, modelfun, beta0)
estimates the coefficients of the nonlinear regression model
y = modelfun (beta, X) by iteratively
minimizing the (possibly weighted) sum of squared residuals, starting from
the initial coefficient vector beta0. The fit uses the
Levenberg-Marquardt algorithm with a numerically computed Jacobian.
nlinfit does not
interpret the columns of X; the array is passed unchanged as the second
argument of modelfun, so its shape is whatever modelfun expects.
@(b, X)
returning a vector of fitted responses the same size as y.
Additional options are given either as a statset-style options
structure or as Name/Value pairs (or both). The supported
options are:
| Name | Value |
|---|---|
'Weights' | A vector of nonnegative observation weights, or
a function handle @(yhat) returning such a vector. Weighted
least squares is used. |
'ErrorModel' | The form of the error variance:
'constant' (default), 'proportional', or 'combined'. |
'ErrorParameters' | Initial values for the error-model parameters. |
'RobustWgtFun' | The name of a robust weight function
('andrews', 'bisquare', 'cauchy', 'fair',
'huber', 'logistic', 'talwar', or 'welsch'),
enabling robust iteratively reweighted least squares. MATLAB accepts this
name only inside an 'Options' structure; taking it as a
Name/Value pair as well is an Octave extension. |
'Tune' | The tuning constant for the robust weight function. |
'Options' | A statset-style structure whose MaxIter,
TolFun, TolX, and DerivStep fields override the
corresponding defaults, and whose RobustWgtFun, Robust,
WgtFun and Tune fields select a robust fit.
RobustWgtFun names the weight function on its own and takes
precedence over the other two; the older WgtFun is read only when
Robust is 'on'. The structure statset ('nlinfit')
returns carries WgtFun 'bisquare' beside Robust
'off', and so leaves the fit unweighted. |
Source Code: nlinfit
The remaining outputs describe the converged fit: R is the vector of
raw residuals y - modelfun (beta, X), J
is the Jacobian of modelfun with respect to beta at the solution,
CovB is the estimated covariance matrix of the coefficients, MSE
is the mean squared error, and ErrorModelInfo is a structure describing
the fitted error model.
The coefficients are estimated by the Levenberg-Marquardt algorithm using a
numerically computed (forward-difference) Jacobian. For an ordinary or
weighted fit the coefficient covariance is CovB = MSE *
inv (J' * W * J), where W is the diagonal matrix of
observation weights and MSE is the weighted residual sum of squares
divided by the error degrees of freedom (with
coefficients). A non-constant 'ErrorModel' is fitted by generalized
least squares, re-deriving the observation weights from the fitted values
each iteration; the 'proportional' model weights each observation by
the inverse squared fitted value, and MSE then estimates the
proportionality constant of the variance.
For a robust fit ('RobustWgtFun') the coefficients are found by
iteratively reweighted least squares applied to leverage-adjusted residuals
(the leverage is taken from the ordinary fit and held fixed). The robust
coefficient covariance follows the Street-Carroll-Ruppert convention, the
same one used by robustfit: CovB = s^2 * inv (J' *
J) and , where the scale s blends the
ordinary-fit scale ols_s with the robust scale robust_s at the
solution as , taken
to be at least robust_s.
The robust MSE and CovB differ from MATLAB’s by up to a few
tenths of a percent, because the shared robust scale does; robustfit
documents that difference and why it is left in place. The coefficients
themselves agree to about 1e-8.
See also: fitnlm, nlparci, nlpredci, NonLinearModel, robustfit
Source Code: nlinfit
Fit an exponential growth model y = b1 exp (b2 x).
x = [1:10]'; y = [2.1;2.9;4.2;5.3;7.1;9.4;12.8;16.5;22.1;29.8]; modelfun = @(b, x) b(1) .* exp (b(2) .* x); beta = nlinfit (x, y, modelfun, [1; 0.3])
beta = 1.6837 0.2869
Robust fitting downweights a gross outlier (5th point corrupted).
x = [1:10]'; y = [2.1;2.9;4.2;5.3;7.1;9.4;12.8;16.5;22.1;29.8]; y(5) = 30; modelfun = @(b, x) b(1) .* exp (b(2) .* x); beta_ols = nlinfit (x, y, modelfun, [1; 0.3]); beta_rob = nlinfit (x, y, modelfun, [1; 0.3], 'RobustWgtFun', 'bisquare'); [beta_ols, beta_rob]
ans = 3.9711 1.6792 0.1963 0.2872