Main Content

本页的翻译已过时。点击此处可查看最新英文版本。

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 指定的最大迭代次数。

名称-值对组参数

指定可选的、以逗号分隔的 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 使用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.

在 R2006a 之前推出