主要内容

非线性回归

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

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

yfXβ) +ε

在哪里

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

  • f的函数是X而且β的每一行求值X和矢量一起β的对应行的预测y

  • X是一个n——- - - - - -p预测因子矩阵,每一行代表一个观察结果,每一列代表一个预测因子。

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

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

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

fitnlm试图查找参数的值β使观察到的反应之间的均方差异最小化y以及模型的预测fXβ).为此,它需要一个起始值beta0在迭代修改向量之前β一个均方误差最小的向量。

准备数据

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

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

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

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

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

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

输入和响应数据集数组

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

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

从工作空间变量创建一个数据集数组:

负载carsmallds =数据集(重量、Model_Year MPG);

输入和响应数据表

从Excel电子表格中创建表格:

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

用工作空间变量创建一个表:

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

输入数据为数值矩阵,响应数据为数值向量

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

负载carsmallX =[重量马力汽缸型号_年];y = MPG;

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

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

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

表示非线性模型

有几种方法来表示非线性模型。用哪个最方便就用哪个。

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

fitnlm假设响应函数fXβ)的参数是平滑的β.如果你的函数不平滑,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的预测值,作为%参数、BETA和数据矩阵的向量的函数,X的% BETA必须有5个元素,X必须有3个%列。% %模型形式为:% y = (b1*x2 - x3/b5)./(1+b2*x1+b3*x2+b4*x3) % %参考资料:贝茨,道格拉斯,和瓦茨,唐纳德,“非线性%回归分析及其应用”,Wiley % 1988年p. 272 -272。版权所有The MathWorks, Inc. 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) * (:, 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. 将数据放入数据集数组中,其中每个变量都有给定的名称xnyn

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

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

    modelfun =['反应速率~ (b1* n_戊烷-异戊烷/b5) /'…'(1 +氢*b2 + n -戊烷*b3 +异戊烷*b4)'] modelfun =反应速率~ (b1*n -戊烷-异戊烷/b5) /…(1 +氢*b2 + n -戊烷*b3 +异戊烷*b4)

选择初始向量beta0

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

在选择商品方面很难给出建议beta0.如果您认为向量的某些分量应该是正的或负的,请设置您的beta0来拥有这些特征。如果您知道其他组件的近似值,请将它们包含在内beta0.但是,如果您不知道好的值,可以尝试一个随机的向量,例如

beta0 = randn(据nvar, 1);%或beta0 = 10*rand(nVars,1);

拟合非线性模型与数据

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

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

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

mdl = fitnlm (X, y, modelfun beta0)

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

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

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

有诊断图来帮助您检查模型的质量。plotDiagnostics (mdl)给出了多种图,包括杠杆和库克距离图。plotResiduals (mdl)给出了拟合模型与数据之间的差异。

也有属性mdl这与模型质量有关。mdl。RMSE给出了数据与拟合模型之间的均方根误差。mdl.Residuals.Raw得到原始残差。mdl。诊断包含几个字段,例如利用而且CooksDistance,这可以帮助你发现特别有趣的观察结果。

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

加载样例数据。

负载反应

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

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

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

plotDiagnostics (mdl)

图中包含一个axes对象。带有标题Case order plot的axis对象包含两个类型为line的对象。这些对象代表杠杆,参考线。

有一个点的杠杆率很高。确定点的位置。

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

检验残差图。

plotResiduals (mdl“安装”

图中包含一个axes对象。标题为Plot of残差与拟合值的axis对象包含两个类型为line的对象。

没有什么是特别突出的。

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

plotSlice (mdl)

{

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

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

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

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

rng (“默认”) X =兰特(100,1);X = tan(*X - /2);

根据模型生成响应Y = b1*(/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 -平方:0.92,调整后的r -平方0.918 F-statistic与零模型:6.45e+03, p-value = 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,“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
Baidu
map