# nlinfit

## 语法

``beta = nlinfit(X,Y,modelfun,beta0)``
``beta = nlinfit(X,Y,modelfun,beta0,options)``
``beta = nlinfit(___,Name,Value)``
``[beta,R,J,CovB,MSE,ErrorModelInfo] = nlinfit(___)``

## 说明

``beta = nlinfit(X,Y,modelfun,beta0)` 使用 `modelfun` 指定的模型，返回一个向量，其中包含 `Y` 中的响应对 `X` 中的预测变量的非线性回归的估计系数。它使用迭代最小二乘估计来估计系数，初始值由 `beta0` 指定。`

``beta = nlinfit(X,Y,modelfun,beta0,options)` 使用结构体 `options` 中的算法控制参数来拟合非线性回归。您可以返回上述语法中的任何输出参数。`

``beta = nlinfit(___,Name,Value)` 使用由一个或多个名称-值对组参数指定的附加选项。例如，您可以指定观测值权重或非常量误差模型。您可以使用上述语法中的任何输入参数。`

``[beta,R,J,CovB,MSE,ErrorModelInfo] = nlinfit(___)` 还返回残差 `R`、`modelfun` 的雅可比矩阵 `J`、估计系数的估计方差-协方差矩阵 `CovB`、误差项的方差估计 `MSE` 以及包含误差模型细节的结构体 `ErrorModelInfo`。`

## 示例

```S = load('reaction'); X = S.reactants; y = S.rate; beta0 = S.beta;```

`beta = nlinfit(X,y,@hougen,beta0)`
```beta = 5×1 1.2526 0.0628 0.0400 0.1124 1.1914 ```

```modelfun = @(b,x)(b(1)+b(2)*exp(-b(3)*x)); rng('default') % for reproducibility b = [1;3;2]; x = exprnd(2,100,1); y = modelfun(b,x) + normrnd(0,0.1,100,1);```

```opts = statset('nlinfit'); opts.RobustWgtFun = 'bisquare';```

```beta0 = [2;2;2]; beta = nlinfit(x,y,modelfun,beta0,opts)```
```beta = 3×1 1.0041 3.0997 2.1483 ```

```S = load('reaction'); X = S.reactants; y = S.rate; beta0 = S.beta;```

`W = [8 2 1 6 12 9 12 10 10 12 2 10 8]';`

```[beta,R,J,CovB] = nlinfit(X,y,@hougen,beta0,'Weights',W); beta```
```beta = 5×1 2.2068 0.1077 0.0766 0.1818 0.6516 ```

`sqrt(diag(CovB))`
```ans = 5×1 2.5721 0.1251 0.0950 0.2043 0.7735 ```

```S = load('reaction'); X = S.reactants; y = S.rate; beta0 = S.beta;```

``` a = 1; b = 1; weights = @(yhat) 1./((a + b*abs(yhat)).^2);```

```[beta,R,J,CovB] = nlinfit(X,y,@hougen,beta0,'Weights',weights); beta```
```beta = 5×1 0.8308 0.0409 0.0251 0.0801 1.8261 ```

`sqrt(diag(CovB))`
```ans = 5×1 0.5822 0.0297 0.0197 0.0578 1.2810 ```

```S = load('reaction'); X = S.reactants; y = S.rate; beta0 = S.beta;```

```[beta,R,J,CovB,MSE,ErrorModelInfo] = nlinfit(X,y,@hougen,beta0,'ErrorModel','combined'); beta```
```beta = 5×1 1.2526 0.0628 0.0400 0.1124 1.1914 ```

`ErrorModelInfo`
```ErrorModelInfo = struct with fields: ErrorModel: 'combined' ErrorParameters: [0.1517 5.6783e-08] ErrorVariance: @(x)mse*(errorparam(1)+errorparam(2)*abs(model(beta,x))).^2 MSE: 1.6245 ScheffeSimPred: 6 WeightFunction: 0 FixedWeights: 0 RobustWeightFunction: 0 ```

## 输入参数

`''`（默认值） 没有稳健拟合
`'andrews'`

`$w=I\left[|r|<\pi \right]×\mathrm{sin}\left(r\right)/r$`

1.339
`'bisquare'`

`$w=I\left[|r|<1\right]×{\left(1-{r}^{2}\right)}^{2}$`

4.685
`'cauchy'`

`$w=1}{\left(1+{r}^{2}\right)}$`

2.385
`'fair'`

`$w=1}{\left(1+|r|\right)}$`

1.400
`'huber'`

`$w=1}{\mathrm{max}\left(1,|r|\right)}$`

1.345
`'logistic'`

`$w=\mathrm{tanh}\left(r\right)}{r}$`

1.205
`'talwar'`

`$w=I\left[|r|<1\right]$`

2.795
`'welsch'`

`$w=\mathrm{exp}\left\{-{r}^{2}\right\}$`

2.985

### 名称-值参数

 `'constant'`（默认值） $y=f+ae$ `'proportional'` $y=f+bfe$ `'combined'` $y=f+\left(a+b|f|\right)e$

`'constant'` a`1`
`'proportional'`b`1`
`'combined'`a, b`[1,1]`

• 如果 `W` 是向量，则它的大小必须与 `Y` 相同。

• 如果 `W` 是函数句柄，则它必须接受预测响应值向量作为输入，并返回正实数权重向量作为输出。

## 输出参数

$f\left({X}_{i},b\right)$ 表示 `modelfun` 指定的非线性函数，其中 ${x}_{i}$ 是观测值 i 的预测变量，i = 1,...,N，$b$ 是回归系数。`beta` 中返回的系数向量将以下加权最小二乘方程最小化：

`${\sum }_{i=1}^{N}{w}_{i}\left[{y}_{i}-f\left({x}_{i},b\right)\right]\text{\hspace{0.17em}}{\text{\hspace{0.17em}}}^{2}.$`

• 如果使用名称-值对组参数 `Weights` 指定观测值权重，则 `R` 包含加权残差

• 如果使用名称-值对组参数 `ErrorModel` 指定 `'constant'` 以外的误差模型，则不能再将 `R` 解释为模型拟合残差。

 `ErrorModel` 所选误差模型 `ErrorParameters` 估计误差参数 `ErrorVariance` 函数句柄，它接受 N×p 矩阵 `X` 并使用估计误差模型返回 N×1 误差方差向量 `MSE` 均方误差 `ScheffeSimPred` 使用估计误差模型时用于联合预测区间的 Scheffé 参数 `WeightFunction` 如果您以前在 `nlinfit` 中使用过自定义权重函数，则逻辑值为 `true` `FixedWeights` 如果您以前在 `nlinfit` 中使用过固定权重，则逻辑值为 `true` `RobustWeightFunction` 如果您以前在 `nlinfit` 中使用过稳健拟合，则逻辑值为 `true`

## 详细信息

### 加权残差

`${r}_{i}={y}_{i}-f\left({x}_{i},b\right),$`

`${r}_{i}^{*}=\sqrt{{w}_{i}}\left({y}_{i}-f\left({x}_{i},b\right)\right).$`

### 加权模型函数雅可比矩阵

`${J}_{ij}=\frac{\partial f\left({x}_{i},b\right)}{\partial {b}_{j}},$`

`${J}^{*}={W}^{1/2}J.$`

## 提示

• 要基于预测生成误差估计，请使用可选输出参数 `R``J``CovB``MSE` 作为 `nlpredci` 的输入。

• 要基于估计系数 `beta` 生成误差估计，请使用可选输出参数 `R``J``CovB``MSE` 作为 `nlparci` 的输入。

• 如果您使用稳健拟合选项 `RobustWgtFun`，则必须使用 `CovB`（可能还需要 `MSE`）作为 `nlpredci``nlparci` 的输入，以确保在计算置信区间时考虑稳健拟合。

## 算法

• `nlinfit``Y``modelfun(beta0,X)` 中的 `NaN` 值视为缺失数据，并忽略对应的观测值。

• 对于非稳健估计，`nlinfit` 使用 Levenberg-Marquardt 非线性最小二乘算法 [1]

• 对于稳健估计，`nlinfit` 使用Iteratively Reweighted Least Squares的算法（[2][3]）。在每次迭代中，基于前一次迭代中每个观测值的残差重新计算稳健权重。这些权重会对离群值进行降权，从而降低它们对拟合的影响。迭代一直持续到权重收敛为止。

• 为观测值权重指定函数句柄时，权重取决于拟合模型。在这种情况下，`nlinfit` 使用迭代广义最小二乘算法来拟合非线性回归模型。

## 参考

[1] Seber, G. A. F., and C. J. Wild. Nonlinear Regression. Hoboken, NJ: Wiley-Interscience, 2003.

[2] DuMouchel, W. H., and F. L. O'Brien. “Integrating a Robust Option into a Multiple Regression Computing Environment.” Computer Science and Statistics: Proceedings of the 21st Symposium on the Interface. Alexandria, VA: American Statistical Association, 1989.

[3] Holland, P. W., and R. E. Welsch. “Robust Regression Using Iteratively Reweighted Least-Squares.” Communications in Statistics: Theory and Methods, A6, 1977, pp. 813–827.