非线性回归

什么是参数化非线性回归模型?

参数化非线性模型表示形式中连续响应变量与一个或多个连续预测变量之间的关系

y=f(X,β)+ε,

在哪里

  • y是一个n响应变量的-乘-1观测向量。

  • f任何函数Xβ的每一行求值X沿着矢量β来计算预测的相应的行y

  • X是一个n-通过-p预测因子矩阵,每个观测值对应一行,每个预测值对应一列。

  • βp未知参数的-乘-1向量的估计。

  • ε是一个n独立同分布随机扰动的-1乘1向量。

相比之下,非参数模型并不试图用模型参数来描述预测器和响应之间的关系。描述通常是图形化的,例如决策树

fitnlm试图找到这些参数的值β使观测到的响应之间的平均平方差异最小化y以及模型的预测f(X,β)。为此,它需要一个初始值beta0在迭代修改向量之前β对于一个具有最小均方误差的向量。

准备数据

要开始拟合回归,将数据放入拟合函数期望的形式。所有的回归技术都是从数组中的输入数据开始的X和响应数据在单独的向量中y在一个表或数据集阵列,或输入数据TBL和响应数据作为列TBL。输入数据的每一行表示一个观察值。每一列表示一个预测器(变量)。

用于表或数据集数组TBL表示响应变量“ResponseVar”名称 - 值对:

mdl = fitlm(资源描述,“ResponseVar”,“血压”);

默认情况下,响应变量是最后一列。

你不能使用明确的非线性回归的预测因子。分类预测器是指从一组固定的可能性中获取值的预测器。

将丢失的数据表示为对于输入数据和响应数据。

用于输入和响应数据的数据集数组

例如,从Excel创建数据集数组®电子表格:

ds =数据集('XLSFile',“hospital.xls”,'ReadObsNames',真正的);

要从工作区变量创建数据集数组:

负载carsmallDS =数据集(重量,Model_Year,MPG);

输入和响应数据表

要从Excel电子表格创建一个表:

台= readtable (“hospital.xls”,'ReadRowNames',真正的);

要从工作区变量创建一个表:

负载carsmall台=表(重量、Model_Year MPG);

输入数据的数字矩阵和响应的数字向量

例如,为了创建一个从工作区的变量数值数组:

负载carsmallX =[型号_year];y = MPG;

从Excel电子表格创建数字数组:

[X,Xnames] = xlsread(“hospital.xls”);y = X (:, 4);%反应y为收缩压X (:, 4) = [];从X矩阵%y移除

请注意,非数字条目,如,不要出现在X

表示非线性模型

有几种方法来表示非线性模型。使用最方便的方法。

非线性模型是一个必要的输入fitnlm,在modelfun输入。

fitnlm假定响应函数f(X,β)在参数上是平滑的β。如果你的功能不顺畅,fitnlm可能无法提供最优的参数估计。

匿名函数或函数文件的函数句柄

函数句柄@modelfunb (x)接受一个向量b和矩阵,表格或数据集阵列x。函数句柄应该返回一个向量f与的行数相同x。例如,函数文件hougen.m单位计算

hougen ( b , x ) = b ( 1 ) x ( 2 ) x ( 3. ) / b ( 5 ) 1 + b ( 2 ) x ( 1 ) + b ( 3. ) x ( 2 ) + b ( 4 ) x ( 3. )

通过输入检查函数类型hougen在MATLAB®命令行。

函数yhat = hougen(beta,x) % hougen hougen - watson反应动力学模型。% YHAT = HOUGEN(BETA,X)给出了%反应速率的预测值,YHAT是%参数向量和数据矩阵的函数,X % BETA必须有5个元素,X必须有3个列。[1 +b2*x1+b3*x2+b4*x3] % %参考文献:贝茨,道格拉斯,瓦茨,唐纳德,"非线性%回归分析及其应用",Wiley % 1988 p. 271-272。%版权所有1993-2004数学工程公司%琼斯1-06-95。b1 =β(1);b2 =β(2);b3 =β(3);b4 =β(4);b5 =β(5);x1 = x (: 1); x2 = x(:,2); x3 = x(:,3); yhat = (b1*x2 - x3/b5)./(1+b2*x1+b3*x2+b4*x3);

您可以编写执行计算作为同一个匿名函数hougen.m

modelfun = @ (b, x) (b) (1) * (:, 2) - x (:, 3) / b (5)) /…(1 + b(2)*x(:,1) + b(3)*x(:,2) + b(4)*x(:,3));

公式的文本表示

一种用于在数据矩阵X向量的响应y:

  • 'X1'如在第一预测器(列)X,'X2'作为第二个预测器,等等。

  • 表示要优化的参数向量“b1”,“b2”等。

  • 写公式为'y ~(数学表达式)'

例如,表示对反应数据的响应:

modelfun = ' y ~ (b1 * x2 - x3 / b5) / (1 + b2 * x1 + b3 * x2 + b4 * x3)”;

对于表或数据集数组中的数据,可以使用表示为表或数据集数组中的变量名的公式。将响应变量名放在公式的左边,后面跟着a~,后跟表示响应公式的字符向量。

此示例说明如何创建字符向量来表示对的响应反应数据集中的数据。

  1. 加载反应数据。

    负载反应
  2. 把数据放到数据集数组,其中每个变量具有在给定的名称XNYN

    ds =数据集({反应物,xn (1:), xn (2:), xn (3:)},…{率,yn});
  3. 检查数据集数组的第一行。

    DS(1,:) ANS =氢n_Pentane异戊烷ReactionRate 470 300 10 8.55
  4. hougen在数据集数组中使用名称的公式。

    modelfun = ['ReactionRate ~ (b1*n_Pentane - Isopentane/b5) /'…“(1 +氢*b2 + n_戊烷*b3 +异戊烷*b4)”]modelfun = ReactionRate ~ (b1* n_戊烷-异戊烷/b5) /…(1 +氢*b2 + n -戊烷*b3 +异戊烷*b4)

选择初始向量

拟合迭代的初始向量,beta0,可以极大地影响得到的拟合模型的质量。beta0给出问题的维数,这意味着它需要正确的长度。很好的选择beta0导致一个快速,可靠的模型,而一个糟糕的选择会导致很长的计算,或者不充分的模型。

在选择商品上很难给出建议beta0。如果您认为向量的某些成分应该是正的或负的,请将您的beta0有这些特点。如果你知道其他组件的近似值,包括他们在beta0。但是,如果您不知道正确的值,可以尝试使用随机向量,例如

beta0 = randn(nVars,1);%或beta0 = 10 *兰特(nVars,1);

将非线性模型与数据进行拟合

用于使用表或数据集阵列拟合非线性回归模型的语法TBL

mdl = fitnlm(资源描述、modelfun beta0)

使用数值数组拟合非线性回归模型的语法X和数字响应向量y

MDL = fitnlm(X,Y,modelfun,beta0)

有关表示输入参数的信息,请参阅准备数据,表示非线性模型,选择初始向量

fitnlm假定响应变量在表或数据集数组中TBL是最后一列。要更改此设置,请使用ResponseVar名称 - 值对以命名响应柱。

检验质量并调整拟合的非线性模型

还有,以帮助您检查模型的质量诊断图。plotDiagnostics(MDL)给出了各种阴谋,包括杠杆率和Cook距离地块。plotResiduals (mdl)给人的拟合模型和数据之间的差异。

还有的性质mdl这与模型质量有关。mdl.RMSE给出了数据与拟合模型之间的均方根误差。mdl.Residuals.Raw给出了原始残差。mdl.Diagnostics包含多个字段,如杠杆和CooksDistance,可以帮助你找出特别有趣的观察。

这个例子展示了如何使用诊断图、残差图和切片图来检验一个拟合的非线性模型。

加载示例数据。

负载反应

建立一个非线性的速率模型反应物使用hougen.m函数。

beta0 =酮(5,1);MDL = fitnlm(反应物,率、@hougen beta0);

创建数据和模型的杠杆图。

plotDiagnostics(MDL)

有一点具有很高的杠杆作用。确定点的位置。

[~,maxl] = max (mdl.Diagnostics.Leverage)
maxl = 6

检查残差图。

plotResiduals (mdl“装”)

没有站出来作为一个局外人。

使用片的情节展现在模型上每个预测变量的作用。

plotSlice(MDL)

您可以拖动垂直蓝色虚线看到对响应一个预测变化的影响。例如,拖动X2线到右侧,并注意的X3线的斜率改变。

使用非线性模型预测或模拟响应

这个例子展示了如何使用这些方法预测,feval,随机预测和模拟到新的数据响应。

从柯西分布中随机产生一个样本。

RNG('默认'X = rand(100,1);X = tan(pi*X - /2);

根据模型生成响应y = b1*(pi /2 + atan((x - b2) / b3))并在响应中添加噪声。

modelfun = @(b,x) b(1) *(pi/2 + atan((x - b(2))/b(3)));y = modelfun([12 5 10],X) + randn(100,1);

从任意参数开始拟合模型b= (1 1 1)。

beta0 = [1 1 1];%任意猜测MDL = fitnlm(X,Y,modelfun,beta0)
mdl =非线性回归模型:y ~ b1 *(π/ 2 + ((x - b2) / b3)每股)估计系数:估计SE tStat pValue ________ ________ _____ b1 12.082 0.80028 15.097 3.3151 e-27 b2 e-06 b3 9.64 0.46499 20.732 9.5063 5.0603 1.0825 4.6747 2.0382 e-37观测数量:100年,错误自由度:97根均方误差:1.02平方:0.92,调整平方0.918 f统计量与零模型:6.45 e + 03,假定值= 1.72 e - 111

拟合值在参数的几个百分点之内[12,5,10]。

检查健康。

plotSlice(MDL)

预测

预测方法预测平均响应,如果请求,给出置信界限。找到关于响应at的预测响应值和预测置信区间X值(-15;5。12)。

Xnew = (-15; 5。12);[ynew, ynewci] =预测(mdl Xnew)
ynew =3×15.4122 18.9022 26.5161
ynewci =3×24.8233 6.0010 18.4555 19.3490 25.0170 28.0151

置信区间反映在切片图中。

feval

feval方法预测的平均响应。feval在从数据集数组构造模型时,使用通常比预测更方便。

创建来自数据集阵列非线性模型。

DS =数据集({X,“X”},{y,“y”});MDL2 = fitnlm(DS,modelfun,beta0);

找到预测模型响应(CDF)X值(-15;5。12)。

Xnew = (-15; 5。12);ynew =函数宏指令(mdl2 Xnew)
ynew =3×15.4122 18.9022 26.5161

随机

随机方法模拟新的随机响应值,等于平均预测加上与训练数据方差相同的随机扰动。

Xnew = (-15; 5。12);Xnew ysim =随机(mdl)
ysim =3×16.0505 19.0893 25.4647

重新运行随机方法。结果发生变化。

Xnew ysim =随机(mdl)
ysim =3×16.3813 19.2157 26.6541