逐步回归
关于变量选择
在有多个自变量的情况下,基于自变量的不同组合可以得到许多回归方程,这些回归方程的效果有好有坏
要得到最优的回归方程
- 回归效果最佳
- 自变量个数尽量少
变量选择常用方法 - 所有子集回归
- 逐步引入
- 逐步剔除
- 逐步回归
逐步回归的基本思想
基本原则
- 按照自变量对因变量影响的显著程度,从大到小逐个引入回归方程
- 每一个变量引入以后,判断先前引入的变量是否由于新变量的引入而变得不显著,若是,则将其剔除
- 引入一个自变量或剔除一个自变量,为逐步回归的一步
- 每一步都要进行检验,即,要进行引入变量是否显著以及剔除变量是否不显著的检验分析,一般地: 显著性水平 α 进 = 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
没有需要剔除的变量
没有需要引入的变量
3. 对变量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
可线性化的非线性回归
示例
1.
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′+ε
2.
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+ε
3.
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为一个结构数据,用来估计预测误差
2. 点预测和区间预测
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矩阵
2. 点预测和置信区间预测
[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')