主要内容

非线性回归

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

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

yfXβ)+ε.

在哪里

  • y是一个n- 1-1响应变量的观察矢量。

  • f是任何功能Xβ这会评估每一行X和矢量一起β计算相应行的预测y

  • X是一个n-经过-p预测器矩阵,一行代表每个观测,一列代表每个预测器。

  • β是A.p-1-1估计未知参数的向量。

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

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

fitnlm尝试找到参数的值β这将最小化观察到的反应之间的平均平方差异y和模型的预测fXβ).为此,它需要一个初始值Beta0.在迭代修改向量之前β到具有最小平均方形错误的向量。

准备数据

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

用于表或数据集数组TBL.,表示响应变量'responsevar'名称值对:

mdl = fitlm(tbl,'responsevar','血压');

响应变量默认为最后一列。

你不能使用分类非线性回归的预测变量。分类预测器是从固定的可能性集中获取值的预测器。

代表缺失数据对于输入数据和响应数据。

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

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

ds = dataset('xlsfile''hospital.xls'......'readobsnames',真的);

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

负载Carsmall.DS = DataSet(权重,Model_year,MPG);

输入和响应数据表

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

tbl =可读取的('hospital.xls'......'readrownames',真的);

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

负载Carsmall.tbl =表(重量,model_year,mpg);

数值矩阵用于输入数据和数值向量用于响应

例如,要从工作区变量创建数字数组:

负载Carsmall.x = [重量马力圆柱体model_year];y = mpg;

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

[x,xnames] = xlsread('hospital.xls');y = x(:,4);%反应Y是收缩压X (:, 4) = [];%从x矩阵中删除y

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

代表非线性模型

有几种方法可以代表非线性模型。使用最方便的。

非线性模型是必需的输入fitnlm, 在里面Modelfun.输入。

fitnlm假设响应函数fXβ)在参数中是光滑的β.如果您的功能不顺畅,fitnlm不能提供最佳参数估计。

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

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

侯根 b x b 1 x 2 - x 3. / b 5 1 + b 2 x 1 + b 3. x 2 + b 4 x 3.

通过输入来检查功能h在Matlab.®命令行。

函数yhat = hougen(beta,x) % hougen hougen - watson反应动力学模型。% YHAT = HOUGEN(BETA,X)给出了%反应速率YHAT的预测值,作为%参数向量和数据矩阵的函数,X % BETA必须有5个元素,X必须有3个%列。模型形式为:% y = (b1*x2 - x3/b5)./(1+b2*x1+b3*x2+b4*x3) % %The MathWorks, Inc. % B.A. Jones 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)* x(:,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)';

对于表或数据集数组中的数据,您可以使用表示为从表或数据集数组表示为变量名称的公式。将响应变量名放在公式左侧,然后放置一个,然后是表示响应公式的字符载体。

此示例显示如何创建字符向量以表示对该响应的响应反应数据集数组中的数据。

  1. 加载反应数据。

    负荷反应
  2. 将数据放入数据集数组中,其中每个变量具有给出的名称XN.或者yn.

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

    DS(1,:) ans =氢N_Pentane等戊烷反式470 300 10 8.55
  4. 写道侯根在数据集数组中使用名称的公式。

    modelfun = ['反式〜(b1 * n_pentane  - 异戊烷/ b5)/'...'(1 +氢气* b2 + n_pentane * b3 +等戊烷* b4)modelfun =  - 反式〜(b1 * n_pentane  - 异戊胺/ b5)/ ...(1 +氢* B2 + N_PENTANE * B3 +等孔* B4)

选择初始向量

拟合迭代的初始向量,Beta0.,可以大大影响所得拟合模型的质量。Beta0.给出问题的维度,意味着它需要正确的长度。好的选择Beta0.导致快速,可靠的模型,而选择差的选择可能导致长期计算,或者模型不足。

很难在选择好的建议Beta0..如果您认为矢量的某些组成部分应该是正面的或负面的,请设置您的Beta0.有这些特征。如果您知道其他组件的近似值,请包括它们Beta0..但是,如果您不知道好的值,请尝试随机向量,例如

Beta0 = Randn(NVARS,1);%或beta0 = 10 * rand(nvars,1);

适合数据的非线性模型

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

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

使用数字阵列拟合非线性回归模型的语法X和数字响应矢量y

mdl = fitnlm(x,y,modelfun,beta0)

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

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

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

有诊断图可以帮助您检查模型的质量。Plotdiagnostics(MDL)提供各种情节,包括杠杆和厨师的距离图。plotresids(MDL)提供拟合模型和数据之间的差异。

还有属性MDL.这与模型质量有关。mdl.rmse.在数据和拟合模型之间给出均方根误差。mdl.Residuals.Raw给出了原始残留物。mdl.diagnostics.包含几个字段,例如杠杆作用CooksDistance,这可以帮助您识别特别有趣的观察。

此示例显示了如何使用诊断,剩余和切片图检查拟合的非线性模型。

加载样本数据。

负载反应

创建作为函数的非线性速率模型反应物使用hougen.m函数。

beta0 = in(5,1);mdl = fitnlm(反应物,......率、@hougen beta0);

绘制数据和模型的杠杆图。

Plotdiagnostics(MDL)

图中包含一个轴。带有标题箱命令杠杆的轴包含2个类型的线。这些对象表示杠杆,参考线。

有一点具有高杠杆率。找到点。

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

检查残差图。

plotresids(MDL,'适合'

图中包含一个轴。标题为“残差与拟合值图”的轴包含2个线型对象。

没有什么能脱颖而出。

使用切片图显示每个预测器对模型的效果。

plotslice(mdl)

图预测切片图包含3轴和UIMEnu,UIControl的其他物体。轴1包含5个类型的线。轴2包含5型对象的类型。轴3包含5个类型的型号。

您可以拖动垂直虚线的蓝线,以便在响应上查看一个预测器中的更改的效果。例如,将X2行拖到右侧,并注意X3线的斜率更改。

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

此示例显示了如何使用这些方法预测Feval., 和随机预测和模拟对新数据的响应。

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

RNG('默认')x = rand(100,1);x =棕褐色(pi * x  -  pi / 2);

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

modelfun = @(b,x)b(1)*....../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*(pi/2 + atan((x - b2)/b3))估计系数:估计SE tStat pValue ________ _______ ______ __________ b1 12.082 0.80028 15.097 3.3151e-27 b2 5.0603 1.0825 4.6747 9.5063e-06 b3 9.64 0.46499 20.732 2.0382e-37观测数:100,误差自由度:97均方根误差:1.02 R-Squared: 0.92, Adjusted R-Squared 0.918 F-statistic vs. zero model: 6.45e+03, p-value = 1.72e-111

拟合值在参数的几个百分比范围内[12,5,10]。

检查健康。

plotslice(mdl)

图预测切片图包含UIMENU类型UICONTOL类型的轴和其他对象。轴包含6个类型的线。

预测

预测方法预测平均响应,如果请求,则给出置信界限。找到预测的响应值,并预测关于响应的置信区间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.当您从数据集数组构造模型时,通常比预测更方便。

从DataSet数组创建非线性模型。

ds = dataset({x,'X'}, {y,'是'});mdl2 = fitnlm(ds,modelfun,beta0);

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

Xnew =(-15; 5。12);Ynew = Feval(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