非线性回归

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

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

ÿ=FXβ)+ε

哪里

  • ÿ是一个ñ×1响应变量的观测向量。

  • F是的任何功能Xβ计算结果中的每一行X随着矢量β来计算预测的相应的行ÿ

  • X是一个ñ-通过-p矩阵预测的,与每一行对应一个观察,并为每个预测器一列。

  • βp×1待估计未知参数的向量。

  • ε是一个ñ×1向量独立的,同分布的随机干扰。

相比之下,非参数模型不试图定性预测和响应与模型参数之间的关系。描述是经常的图形,如在的情况下决策树

fitnlm试图找到这些参数的值β可以最大限度地减少观察到的反应之间的平均平方差ÿ和模型的预测FXβ)。要做到这一点,它需要一个初始值beta0前迭代地修改所述矢量β以最小均方误差向量。

准备数据

要开始拟合回归,把你的数据转换成一种形式,拟合函数中的期望。所有回归技术的输入数据开始以阵列X在单独的载体和响应数据ÿ在一个表或数据集阵列,或输入数据TBL和响应数据作为在一列TBL。输入数据的每行代表一个观察。每一列代表一个预测值(变量)。

对于表或数据集阵列TBL,指示与响应变量'ResponseVar'名称 - 值对:

MDL = fitlm(TBL, 'ResponseVar', '血压');

应变量是默认的最后一列。

您不能使用明确的预测的非线性回归。甲分类预测是一种从一组固定的可能性取值。

表示丢失数据为NaN用于输入数据和响应数据。

数据集阵输入和响应数据

例如,为了创建从Excel数据集阵列®电子表格:

DS =数据集('XLSFile''hospital.xls'...'ReadObsNames',真正);

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

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

表输入和响应数据

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

TBL = readtable('hospital.xls'...'ReadRowNames',真正);

要创建工作区从变量表:

加载carsmallTBL =表(重量,Model_Year,MPG);

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

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

加载carsmallX = [重量马力缸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 1 + b 2 X 1 + b 3 X 2 + b 4 X 3

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

功能yhat = hougen(测试版,X)%HOUGEN Hougen沃森模型的反应动力学。%YHAT = HOUGEN(BETA,X)给出%反应速率,YHAT的预测值,作为参数%,BETA的载体的功能,和数据的矩阵,X.%BETA必须有5种元素和X必须有三个%列。%%该模型的形式是:%Y =(B1 * X2  -  X3 / B5)./(1个+ B2 * X1 + B3 * X2 + B4 * X3)%%参考:%[1]贝茨,道格拉斯,和Watts唐纳德,“非线性%回归分析及其应用”,威利%1988年页。271-272。%版权所有1993-2004 MathWorks公司的学士%琼斯95年1月6日。B1 =β(1);B2 =β(2);B3 =β(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和响应在载体中ÿ

  • 使用代表该式'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,:)},... {速率,炔});
  3. 检查数据集阵列的第一行。

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

    modelfun = [ 'ReactionRate〜(B1 * n_Pentane  - 异戊烷/ B5)/' ... '(1个+氢* B2 + n_Pentane * B3 +异戊烷* B4)'] modelfun = ReactionRate〜(B1 * n_Pentane  - 异戊烷/ B5)/(1 +氢* B2 + n_Pentane * B3 +异戊烷* B4)

选择初始向量beta0

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

这是很难的选择一个好的给出建议beta0。如果您认为向量的某些成分应该是正的或负的,请将您的beta0有这些特点。如果你知道其他组件的近似值,包括他们在beta0。但是,如果你不知道良好的价值观,尝试随机向量,如

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

适合非线性模型数据

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

MDL = fitnlm(TBL,modelfun,beta0)

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

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

用于表示输入参数的信息,请参见准备数据代表的非线性模型选择初始向量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 =兰特(100,1);X = TAN(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 p值________ _______ ______ __________ 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.45e03,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

置信区间反映在片情节。

feval

feval方法预测的平均响应。feval往往是更方便的使用比当你从一个数据集数组结构模型预测。

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

DS =数据集({X,'X'},{Y,'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