非线性回归

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

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

y=FXβ)+ε

哪里

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

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

  • X是一个N.——- - - - - -P.预测器矩阵,每个观察的一行,以及每个预测器的一列。

  • β是一个P.-1-1估计未知参数的向量。

  • ε是一个N.- 1个独立的向量,相同地分布随机干扰。

相反,非参数模型不尝试表征预测器之间的关系和模型参数的响应。描述通常是图形的,如在决策树

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

准备数据

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

对于表或数据集数组资源描述,表示响应变量'responsevar'名称-值对:

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

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

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

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

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

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

ds = dataset(“XLSFile”'hospital.xls'......“ReadObsNames”,真正);

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

加载Carsmall.ds =数据集(重量、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.计算

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(β,X)给出了%反应速率的预测值,Yhat,作为%参数,β和数据矩阵的载体的函数,x。%beta必须有5个元素和x必须有三个%的列。模型形式的%%是:%y =(b1 * x2  -  x3 / b5)./(1 + b2 * x1 + b3 * x2 + b4 * x3)%%参考:%[1]贝茨,道格拉斯和瓦特,唐纳德,“非线性%回归分析及其应用”,Wiley%1988 p。271-272。%版权所有1993-2004 MathWorks,Inc.%B.A.琼斯1-06-95。b1 = beta(1);b2 = beta(2);b3 = beta(3); b4 = beta(4); b5 = beta(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 = dataSet({反应物,xn(1,:),xn(2,s),xn(3,:)},... {rate,yn});
  3. 检查数据集数组的第一行。

    ds(1,:) ans =氢n_戊烷异戊烷反应速率470 300 10 8.55
  4. hougen使用DataSet数组中的名称的公式。

    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.。但是,如果您不知道好的值,请尝试随机向量,例如

beta0 = randn(据nvar, 1);% or beta0 = 10*rand(nars,1);

适合数据的非线性模型

使用表或数据集数组拟合非线性回归模型的语法资源描述

mdl = fitnlm(tbl,modelfun,beta0)

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

mdl = fitnlm (X, y, modelfun beta0)

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

fitnlm.假设表或数据集数组中的响应变量资源描述是最后一列。要改变这个,请使用响应官员名称-值对来命名响应列。

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

有一些诊断图可以帮助您检查模型的质量。plotDiagnostics (mdl)给出了各种情节,包括杠杆和库克的距离情节。plotresids(MDL)给出拟合模型与实际数据之间的差异。

还有一些性质MDL.这与模型质量有关。mdl.rmse.在数据和拟合模型之间给出均方根误差。mdl.residuals.raw.给出原始残留量。mdl.Diagnostics包含几个字段,如Leverage和CooksDistance,它们可以帮助您识别特别有趣的观察结果。

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

加载样本数据。

加载反应

创建作为函数的非线性速率模型反应物使用Hougen.M.功能。

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

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

plotDiagnostics (mdl)

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

[〜,maxl] = max(mdl.diagnostics.leverage)
maxl = 6.

检查残留的情节。

plotresids(MDL,“安装”

没有什么是与众不同的。

使用切片图来显示每个预测器对模型的影响。

plotSlice (mdl)

您可以拖动垂直的蓝色虚线,以查看一个预测器中的更改对响应的影响。例如,将X2线向右拖动,注意到X3线的斜率发生了变化。

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

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

从Cauchy分布中随机生成样本。

rng (“默认”)x = rand(100,1);x =棕褐色(pi * x  -  pi / 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 *(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断层:0.92,调整R线0.918 F统计与零型号:6.45e+03,p值= 1.72e-111

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

检查合身。

plotSlice (mdl)

预测

预测方法预测平均响应,如果请求,则给出置信界限。找到预测的响应值,并预测关于响应的置信区间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

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

函数宏指令

函数宏指令方法预测平均响应。函数宏指令当您从数据集数组构造模型时,通常比预测更方便。

从数据集数组创建非线性模型。

ds =数据集({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];ysim =随机(mdl,xnew)
ysim =3×16.0505 19.0893 25.4647

重新运行随机方法。改变的结果。

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