本页对应的英文页面已更新,但尚未翻译。 若要查看最新内容,请点击此处访问英文页面。

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(___) 还返回残差 Rmodelfun 的 Jacobian 矩阵 J、估计系数的估计方差-协方差矩阵 CovB、误差项的方差估计 MSE 以及包含误差模型细节的结构体 ErrorModelInfo

示例

全部折叠

加载样本数据。

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

使用 beta0 中的初始值对速率数据进行 Hougen-Watson 模型拟合。

beta = nlinfit(X,y,@hougen,beta0)
beta = 5×1

    1.2526
    0.0628
    0.0400
    0.1124
    1.1914

从非线性回归模型 y=b1+b2exp{-b3x}+ϵ 生成样本数据,其中 b1b2b3 是系数,误差项呈正态分布,均值为 0,标准差为 0.1。

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]';

使用指定的观测值权重对速率数据进行 Hougen-Watson 模型拟合。

[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);

使用指定的观测值权重函数对速率数据进行 Hougen-Watson 模型拟合。

[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;

使用合并的误差模型对速率数据进行 Hougen-Watson 模型拟合。

[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: [function_handle]
                     MSE: 1.6245
          ScheffeSimPred: 6
          WeightFunction: 0
            FixedWeights: 0
    RobustWeightFunction: 0

输入参数

全部折叠

非线性回归函数的预测变量,指定为矩阵。通常,X 是预测变量(自变量)的设计矩阵,Y 中每个值对应该矩阵中的一个行,每个预测变量对应该矩阵中的一个列。但 X 其实可以是 modelfun 能接受的任何数组。

数据类型: single | double

用于拟合非线性回归函数的响应值(因变量),指定为与 X 行数相同的向量。

数据类型: single | double

非线性回归模型函数,指定为函数句柄。modelfun 必须按顺序接受两个输入参数 - 系数向量和数组 X,并返回由拟合响应值组成的向量。

例如,要指定 hougen 非线性回归函数,请使用函数句柄 @hougen

数据类型: function_handle

最小二乘估计算法的初始系数值,指定为向量。

注意

不理想的起始值可能会导致具有较大残差的解。

数据类型: single | double

估计算法选项,指定为您使用 statset 创建的结构体。以下 statset 参数适用于 nlinfit

有限差分梯度计算的相对差,指定为正标量值,或与 beta 大小相同的向量。使用向量为每个系数指定不同的相对差。

估算期间的输出显示级别,指定为 'off''iter''final' 之一。如果您指定 'iter',每次迭代都会显示输出。如果指定 'final',将在最终迭代后显示输出。

是否检查目标函数中的无效值(如 NaNInf)的指示符,指定为 'on''off'

估计算法的最大迭代次数,指定为正整数。迭代继续进行,直到估计值在收敛容差内,或达到 MaxIter 指定的最大迭代次数。

稳健拟合的权重函数,指定为有效的字符向量、字符串标量或函数句柄。

注意

使用观测值权重 W 时,RobustWgtFun 的值必须为 []

下表说明了可能的字符向量和字符串标量。用 r 表示归一化残差,w 表示稳健权重。如果表达式 x 的计算结果为 true,则指示函数 [x] 等于 1,否则等于 0。

权重函数方程默认调整常量
''(默认值) 没有稳健拟合
'andrews'

w=I[|r|<π]×sin(r)/r

1.339
'bisquare'

w=I[|r|<1]×(1r2)2

4.685
'cauchy'

w=1(1+r2)

2.385
'fair'

w=1(1+|r|)

1.400
'huber'

w=1max(1,|r|)

1.345
'logistic'

w=tanh(r)r

1.205
'talwar'

w=I[|r|<1]

2.795
'welsch'

w=exp{r2}

2.985

您也可以指定函数句柄,该句柄接受归一化残差向量作为输入,并返回稳健权重向量作为输出。如果使用函数句柄,必须提供 Tune 常量。

稳健拟合的调整常量,指定为正标量值。调整常量用于在应用稳健权重函数之前归一化残差。默认调整常量取决于 RobustWgtFun 指定的函数。

如果使用函数句柄指定 RobustWgtFun,则必须为 Tune 指定值。

残差平方和的终止容差,指定为正标量值。迭代继续进行,直到估计值在收敛容差内,或达到 MaxIter 指定的最大迭代次数。

基于估计系数 beta 的终止容差,指定为正标量值。迭代继续进行,直到估计值在收敛容差内,或达到 MaxIter 指定的最大迭代次数。

稳健拟合的指示符,指定为 'off''on'

注意

Robust 将在以后的软件版本中删除。请使用 RobustWgtFun 进行稳健拟合。

稳健拟合的权重函数,指定为字符向量或字符串标量,表示权重函数或函数句柄。WgtFun 仅在 Robust 的值为 'on' 时有效。

注意

WgtFun 将在以后的软件版本中删除。请改用 RobustWgtFun

名称-值对组参数

指定可选的、以逗号分隔的 Name,Value 对组参数。Name 为参数名称,Value 为对应的值。Name 必须放在引号内。您可采用任意顺序指定多个名称-值对组参数,如 Name1,Value1,...,NameN,ValueN 所示。

示例: 'ErrorModel','proportional','ErrorParameters',0.5 指定比例误差模型,误差参数估计的初始值为 0.5

误差项的形式,指定为以逗号分隔的对组,其中包含 'ErrorModel',以及指示误差模型的 'constant''proportional''combined'。每个模型在定义误差时,都用到了一个标准的零均值单位方差变量 e,以及下列独立部分:函数值 f,还有 a 和 b 这两个参数中的一个或两个。

'constant'(默认值)y=f+ae
'proportional'y=f+bfe
'combined'y=f+(a+b|f|)e

使用 Weights 时,唯一允许的误差模型是 'constant'

注意

使用 'constant' 以外的误差模型时,options.RobustWgtFun 的值必须为 []

所选 ErrorModel 中误差模型参数的初始估计值,指定为以逗号分隔的对组,其中包含 'ErrorParameters' 和一个标量值或一个二元素向量。

误差模型参数默认值
'constant' a1
'proportional'b1
'combined'a, b[1,1]

例如,如果 'ErrorModel' 的值为 'combined',您可以为 a 指定起始值 1,为 b 指定起始值 2,如下所示。

示例: 'ErrorParameters',[1,2]

使用 Weights 时,您只能使用 'constant' 误差模型。

注意

使用 'constant' 以外的误差模型时,options.RobustWgtFun 的值必须为 []

数据类型: double | single

观测值权重,指定为以逗号分隔的对组,其中包含 'Weights' 和一个正实数权重向量或一个函数句柄。如果您希望减少某些观测值对拟合模型的影响,则可使用观测值权重来降低其权重。

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

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

注意

当您使用观测值权重时,options.RobustWgtFun 的值必须为 []

数据类型: double | single | function_handle

输出参数

全部折叠

估计的回归系数,以向量形式返回。beta 中的元素数等于 beta0 中的元素数。

f(Xi,b) 表示 modelfun 指定的非线性函数,其中 xi 是观测值 i 的预测变量,i = 1,...,N,b 是回归系数。beta 中返回的系数向量将以下加权最小二乘方程最小化:

i=1Nwi[yif(xi,b)]2.

对于未加权的非线性回归,所有权重项都等于 1。

拟合模型的残差,以向量形式返回。

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

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

非线性回归模型 modelfun 的 Jacobian 矩阵,以 N×p 矩阵形式返回,其中 N 是观测值数目,p 是估计系数的数目。

  • 如果使用名称-值对组参数 Weights 指定观测值权重,则 J加权模型函数 Jacobian 矩阵

  • 如果使用名称-值对组参数 ErrorModel 指定 'constant' 以外的误差模型,则不能再将 J 解释为模型函数 Jacobian 矩阵。

在拟合系数 beta 的基础上估计的方差-协方差矩阵,以 p×p 矩阵形式返回,其中 p 是估计系数的数目。如果模型 Jacobian 矩阵 J 具有满列秩,则 CovB = inv(J'*J)*MSE,其中 MSE 是均方误差。

拟合模型的均方误差 (MSE),以标量值形式返回。MSE 是误差项的方差的估计值。如果模型 Jacobian 矩阵 J 具有满列秩,则 MSE = (R'*R)/(N-p),其中 N 是观测值数目,p 是估计系数的数目。

关于误差模型拟合的信息,以具有以下字段的结构体形式返回:

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

详细信息

全部折叠

加权残差

加权残差是残差与对应观测值权重的平方根相乘的结果。

给定估计回归系数 b, 时,观测值 i 的残差是

ri=yif(xi,b),

其中 yi 是观测到的响应,f(xi,b) 是预测变量 xi. 处的拟合响应

当您用权重 wi(i = 1、...、N)拟合加权非线性回归时,nlinfit 返回加权残差,

ri*=wi(yif(xi,b)).

加权模型函数 Jacobian 矩阵

加权模型函数 Jacobian 矩阵是非线性模型 Jacobian 矩阵与观测值权重矩阵的平方根相乘的结果。

给定估计回归系数 b,,非线性函数 f(xi,b) 的估计模型 Jacobian 矩阵 J, 具有元素

Jij=f(xi,b)bj,

其中 bjb. 的第 j 个元素

当您用对角权重矩阵 W,nlinfit 拟合加权非线性回归时, 返回加权 Jacobian 矩阵,

J*=W1/2J.

提示

  • 要基于预测生成误差估计,请使用可选输出参数 RJCovBMSE 作为 nlpredci 的输入。

  • 要基于估计系数 beta 生成误差估计,请使用可选输出参数 RJCovBMSE 作为 nlparci 的输入。

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

算法

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

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

  • 对于稳健估计,nlinfit 使用迭代重加权最小二乘算法([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.

在 R2006a 之前推出