逐步回归
关于变量选择
在有多个自变量的情况下,基于自变量的不同组合可以得到许多回归方程,这些回归方程的效果有好有坏
要得到最优的回归方程
- 回归效果最佳
- 自变量个数尽量少
变量选择常用方法 - 所有子集回归
- 逐步引入
- 逐步剔除
- 逐步回归
逐步回归的基本思想
基本原则
- 按照自变量对因变量影响的显著程度,从大到小逐个引入回归方程
- 每一个变量引入以后,判断先前引入的变量是否由于新变量的引入而变得不显著,若是,则将其剔除
- 引入一个自变量或剔除一个自变量,为逐步回归的一步
- 每一步都要进行检验,即,要进行引入变量是否显著以及剔除变量是否不显著的检验分析,一般地: 显著性水平 α 进 = 0.05 , α 出 = 0.1 显著性水平\alpha_{进}=0.05,\alpha_{出}=0.1 显著性水平α进=0.05,α出=0.1
- 这个过程反复进行,直至既无变量需要引入,也无变量需要剔除,得到一个最佳的变量组合为止
逐步回归的MATLAB实现
stepwise(x, y, inmodel, alpha)
x,自变量数据,nxm阶矩阵
y,因变量数据,nx1阶矩阵
inmodel,初始模型中包含的自变量子集(缺省时默认为空集)
alpha(缺省时默认为0.05)
逐步回归实例
Matlab程序实现
-
数据输入
x1=[7 1 11 11 7 11 3 1 2 21 1 11 10]';
x2=[26 29 56 31 52 55 71 31 54 47 40 66 68]';
x3=[6 15 8 8 6 9 17 22 18 4 23 9 8]';
x4=[60 52 20 47 33 22 6 44 22 26 34 12 12]';
y=[78.5 74.3 104.3 87.6 95.9 109.2 102.7 72.5 93.1 115.9 83.8 113.3 109.4]';
x=[x1 x2 x3 x4]; -
逐步回归
stepwise(x, y)
第一个窗口,表示自变量 x 1 , x 2 , x 3 , x 4 x_{1},x_{2},x_{3},x_{4} x1,x2,x3,x4的显著性程度的窗口
-
置信线都是红色的,表示这个变量当前不在模型里面,否则是蓝色,说明当前的模型中没有任何一个自变量,都是常数项
-
p-val表示自变量的显著性,p值越小越显著,即 x 4 x_{4} x4对因变量的影响最显著
-
看p值是不是小于 α 进 = 0.05 \alpha_{进}=0.05 α进=0.05,小于可以引入
中间的窗口,表示一些模型的参数和统计量的取值
-
截距,表示常数项
最后一个窗口,表示逐步回归模型,在历次调试中的RMSE的值,即均方根误差
-
可以直接点击置信线引入
-
或者点击下一步引入
再次根据p值判断,引入 x 1 x_{1} x1
没有需要剔除的变量
没有需要引入的变量
-
对变量y与 x 1 , x 4 x_{1},x_{4} x1,x4作线性回归
X=[ones(13,1) x1 x4];
[b, bint, r, rint, stats]=regress(y, X)
得
b = 103.0974
1.4400
-0.6140
最终模型为
y = 103.0974 + 1.4400 x 1 − 0.614 x 4 y=103.0974+1.4400x_{1}-0.614x_{4} y=103.0974+1.4400x1−0.614x4
可线性化的非线性回归
示例
y = β 0 + β 1 e b z + ε y=\beta_{0}+\beta_{1}e^{bz}+\varepsilon y=β0+β1ebz+ε
令 x ′ = e b x x'=e^{bx} x′=ebx
y = β 0 + β 1 x ′ + ε y=\beta_{0}+\beta_{1}x'+\varepsilon y=β0+β1x′+ε
y = β 0 + β 1 x + β 2 x 2 + ⋯ + β m x m + ε y=\beta_{0}+\beta_{1}x+\beta_{2}x^{2}+\dots+\beta_{m}x^{m}+\varepsilon y=β0+β1x+β2x2+⋯+βmxm+ε
令 x 1 = x , x 2 = x 2 , ... , x m = x m x_{1}=x,x_{2}=x^{2},\dots,x_{m}=x^{m} x1=x,x2=x2,...,xm=xm
y = β 0 + β 1 x 1 + β 2 x 2 + ⋯ + β m x m + ε y=\beta_{0}+\beta_{1}x_{1}+\beta_{2}x_{2}+\dots+\beta_{m}x^{m}+\varepsilon y=β0+β1x1+β2x2+⋯+βmxm+ε
y = a e b x e ε y=ae^{bx}e^{\varepsilon} y=aebxeε
等式两边取对数
ln y = ln a + b x + ε \ln y=\ln a+bx+\varepsilon lny=lna+bx+ε
能够线性化的非线性回归模型,称为本质线性回归模型
可线性化的非线性回归模型
钢包问题
制作散点图
可以看出是非线性回归或曲线回归问题
可以基于配曲线的思想进行求解
- 根据散点图确定须配曲线的类型
- 估计其中的未知参数
常用备选曲线
-
双曲线 1 y = a + b x \frac{1}{y}=a+ \frac{b}{x} y1=a+xb
-
幂函数曲线 y = a x b y=ax^{b} y=axb其中 x > 0 , a > 0 x>0,a>0 x>0,a>0
-
指数曲线 y = a e b x y=ae^{bx} y=aebx,其中 a > 0 a>0 a>0
-
倒指数曲线 y = a e b / x y=ae^{b/x} y=aeb/x其中 a > 0 a>0 a>0
-
对数曲线 y = a + b ln x , x > 0 y=a+b\ln x,x>0 y=a+blnx,x>0
-
S型曲线 y = 1 a + b e − x y=\frac{1}{a+be^{-x}} y=a+be−x1
求解
结合散点图变化趋势,选配倒指数曲线
y = a e b / x y=ae^{b/x} y=aeb/x
同时取对数,线性化
ln y = ln a + b 1 x \ln y=\ln a+b \frac{1}{x} lny=lna+bx1
y ′ = A + b x ′ y'=A+bx' y′=A+bx′
用线性回归方法求解
得
A ^ = 2.4587 , b ^ = − 1.1107 \hat{A}=2.4587,\quad \hat{b}=-1.1107 A^=2.4587,b^=−1.1107
由此
a ^ = e A ^ = 11.6789 \hat{a}=e^{\hat{A}}=11.6789 a^=eA^=11.6789
最终非线性回归结果为
y = 11.6789 e − 1.1107 / x y=11.6789e^{-1.1107/x} y=11.6789e−1.1107/x
当常用的备选曲线都配不上对,如何解决
- 多项式回归
- 神经网络
- 支持向量机
多项式回归
一元多项式回归
基本概念
变量y关于x的m阶多项式回归模型为
y = a 1 x m + a 2 x m − 1 + ⋯ + a m x 1 + a m + 1 + ε y=a_{1}x^{m}+a_{2}x^{m-1}+\dots+a_{m}x^{1}+a_{m+1}+\varepsilon y=a1xm+a2xm−1+⋯+amx1+am+1+ε
其中,m是已知的阶数, a i ( i = 1 , 2 , ... , m ) a_{i}(i=1,2,\dots,m) ai(i=1,2,...,m)是回归参数, ε ∼ N ( 0 , σ 2 ) \varepsilon \sim N(0,\sigma^{2}) ε∼N(0,σ2)称为随机误差
一元多项式回归的Matlab实现
-
参数估计
[p, S]=polyfit(x, y, m)
x = ( x 1 , x 2 , ... , x n ) x=(x_{1},x_{2},\dots,x_{n}) x=(x1,x2,...,xn)为自变量取值向量
y = ( y 1 , y 2 , ... , y n ) y=(y_{1},y_{2},\dots,y_{n}) y=(y1,y2,...,yn)为因变量取值向量
m m m表示多项式回归模型的阶数
p = ( a 1 , a 2 , ... , a m + 1 ) p=(a_{1},a_{2},\dots,a_{m+1}) p=(a1,a2,...,am+1)为多项式系数向量
S S S为一个结构数据,用来估计预测误差
-
点预测和区间预测
y = polyval (p, x)
求回归多项式在x处的预测值y
[y, delta] = polyconf(p, x, S, alpha)
求回归多项式在x处的预测值y及预测值的显著性为 1 − a l p h a 1-alpha 1−alpha的置信区间: y ± d e l t a y \pm delta y±delta,alpha缺省时为0.05
示例
求解
t = 1/30:1/30:14/30;
s=[11.86 15.67 20.60 26.69 33.71 41.93 51.13 61.49 72.90 85.44 99.08 ... 113.77 129.54 146.48];
[p, S] = polyfit(t, s, 2)
结果
p = 489.2946 65.8896 9.1329
S = struct:
R:[3 x 3 double]
df:11
normr:0.1157
得回归模型
s ^ = 489.2946 t 2 + 64.8896 t + 9.1329 \hat{s}=489.2946t^{2}+64.8896t+9.1329 s^=489.2946t2+64.8896t+9.1329
预测及作图
[y_hat, delta] = polyconf(p, t, S)
plot(t, s, 'k+', t, y_hat, 'r')
hold on
plot(t, y_hat-delta, ':b', t, y_hat+delta, ':b')
legend('观测值','预测值','95%置信区间范围')
另解
化为线性回归模型
t = 1/30:1/30:14/30;
s=[11.86 15.67 20.60 26.69 33.71 41.93 51.13 61.49 72.90 85.44 99.08 ... 113.77 129.54 146.48];
T=[ones(14,1) t'(t.^2)'];
[b, bint, r, rint, stats] = regress(s', T);
多元二项式回归
rstool (x, y, 'model', alpha)
x,nxm矩阵
y,n维列向量
alpha显著性水平(缺省时默认为0.05)
model
示例
x1=[1000 600 1200 500 300 400 1300 1100 1300 300];
x2=[5 7 6 6 8 7 5 4 3 9];
y=[100 75 80 70 50 65 90 100 110 60]';
x=[x1' x2'];
rstool(x, y, 'purequadratic');
输入1000和6
点导出可以得到细节
或输入
beta, rmse
结果
beta = 110.5313
0.1464
-26.5709
-0.0001
1.8475
rmse =
4.5362
故,纯二次多项式回归模型为
y = 110.5313 + 0.1464 x 1 − 26.5709 x 2 − 0.0001 x 1 2 + 1.8495 x 2 2 y=110.5313+0.1464x_{1}-26.5709x_{2}-0.0001x_{1}^{2}+1.8495x_{2}^{2} y=110.5313+0.1464x1−26.5709x2−0.0001x12+1.8495x22
一般非线性回归
基本概念
非线性回归模型的一般形式
y = f ( x ; θ ) + ε y=f(x;\theta)+\varepsilon y=f(x;θ)+ε
y是因变量
x = ( x 1 , x 2 , ... , x m ) x=(x_{1},x_{2},\dots,x_{m}) x=(x1,x2,...,xm)是自变量向量
θ = ( θ 1 , θ 2 , ... , θ p \theta=(\theta_{1},\theta_{2},\dots,\theta_{p} θ=(θ1,θ2,...,θp是未知参数向量
ε \varepsilon ε是随机误差项
非线性回归的参数估计
使得残差平方和
Q ( θ ) = ∑ i = 1 n ( y i − f ( x i , θ ) ) 2 Q(\theta)=\sum_{i=1}^{n}(y_{i}-f(x_{i},\theta))^{2} Q(θ)=i=1∑n(yi−f(xi,θ))2
达到最小参数 θ \theta θ,称为 θ \theta θ的非线性最小二乘估计
非线性回归的MATLAB实现
-
回归命令
[beta, r, J]=nlinfit(x, y, 'model', beta0)
x为nxm矩阵
y为n维列向量
model表示用m文件定义的非线性函数
beta0表示回归系数初值
beta表示回归系数的估计值
r表示残差
J表示Jacobian矩阵
-
点预测和置信区间预测
[Y, DELTA] = nlpredci('model', x, beta, r, J)
- 点预测,nlinfit所得的回归函数在x处的预测值Y
- 区间预测,95%置信水平下的置信区间估计: Y ± D E L T A Y \pm DELTA Y±DELTA
示例
选配倒指数模型
y = a e b / x y = ae^{b/x} y=aeb/x
求解
-
编写m文件,实现非线性回归函数 y = a e b / x y = ae^{b/x} y=aeb/x
function yhat = volum(beta, x)
yhat = beta(1) * exp(beta(2) ./ x); -
输入数据
x = 2:16;
y = [6.42 8.20 9.58 9.5 9.7 10 9.93 9.99 10.49 10.59 10.60 10.80 10.60 10.90 10.76];
beta0 = [8 2]'; -
求回归系数
[beta, r, J] = nlinfit(x', y', 'volum', beta0)
beta
得
beta =
11.6036
-1.0641
-
预测及作图
[yhat, delta] = nlpredci('volum', x', beta, r, J);
plot(x, y, 'k+', x, yhat, 'r')
hold on
plot(x', yhat-delta, ':b', x', yhat+delta, ':b')