张瑞
中国科学技术大学数学科学学院
rui@ustc.edu.cn |
例 1. 某地区的实际投资额与国民生产总值(GNP)及物价指数连续20年的统计数据如下,试建立一个投资额的模型,根据对未来GNP及物价指数的估计,预测未来的实际投资额。
年份序号 | 1 | 2 | 3 | … | 20 |
---|---|---|---|---|---|
投资额 | 90.9 | 97.4 | 113.5 | … | 424.5 |
GNP | 596.7 | 637.7 | 691.1 | … | 3073.0 |
物价指数 | 0.7167 | 0.7277 | 0.7436 | … | 2.0688 |
“投资额:GNP”和“投资额:物价指数”图
简单地看“投资额:GNP”和“投资额:物价指数”图,它们呈现较强的线性关系。
做简单的线性回归
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const 322.7250 46.633 6.921 0.000 224.339 421.111
x1 0.6185 0.067 9.242 0.000 0.477 0.760
x2 -859.4790 124.180 -6.921 0.000 -1121.476 -597.482
==============================================================================
R-squared: 0.991 F-statistic: 919.9
使用时间序列分析
# linear regression
import statsmodels.api as sm
#
X=np.array([x1, x2]).T
model = sm.OLS(y, sm.add_constant(X)).fit()
print(model.summary())
OLS Regression Results
==============================================================================
Dep. Variable: y R-squared: 0.991
Model: OLS Adj. R-squared: 0.990
Method: Least Squares F-statistic: 919.9
Date: Mon, 22 Apr 2019 Prob (F-statistic): 4.73e-18
Time: 21:34:54 Log-Likelihood: -77.611
No. Observations: 20 AIC: 161.2
Df Residuals: 17 BIC: 164.2
Df Model: 2
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const 322.7250 46.633 6.921 0.000 224.339 421.111
x1 0.6185 0.067 9.242 0.000 0.477 0.760
x2 -859.4790 124.180 -6.921 0.000 -1121.476 -597.482
==============================================================================
Omnibus: 1.151 Durbin-Watson: 0.802
Prob(Omnibus): 0.563 Jarque-Bera (JB): 0.867
Skew: -0.192 Prob(JB): 0.648
Kurtosis: 2.056 Cond. No. 7.81e+04
==============================================================================
顾名思义,时间序列是时间间隔不变的情况下收集的时间点集合。这些集合被分析用来了解长期发展趋势,为了预测未来或者表现分析的其他形式。
残差可以作为随机误差的估计值(下标表示是时间序列)。画出残差的自相关系数图,投资额的自相关系数图
from statsmodels.graphics.tsaplots import plot_acf #自相关图
#
y_hat=model.predict(sm.add_constant(X))
et=y-y_hat
# 画出e_t的自相关系数图
plot_acf(et)
plt.show()
画出的散点图
|
自相关性做直观的判断:
|
y_hat=model.predict(sm.add_constant(X))
et=y-y_hat
plt.clf()
plt.plot(et[0:-1],et[1:],'+')
ax = plt.gca()
ax.spines['bottom'].set_position(('data', 0))
ax.spines['left'].set_position(('data', 0))
plt.show()
考虑如下的模型
其中是自相关系数,,相互独立且服务均值为0的正态分布,
如何估计?用Durbin-Watson统计量
如何消除自相关性?用广义差分法
自回归性的定量诊断: Durbin-Watson检验
durbin_watson检测结果: 0.8024793257864277
则
import statsmodels.api as sm
resids = model.resid #残差,与前面的et是一样的
#残差独立性检测,durbin_watson 在2附近说明满足残差独立性
print('durbin_watson检测结果:',sm.stats.durbin_watson(resids))
则比较大时,近似地有
而自相关系数的估计值是
即有
由,则Durbin-Watson值(DW值)在。
要由DW值确定是否存在自相关性,需要在给定的检验水平(显著性水平)下,依照样本容量(n)和回归变量(k,包括常数项),查D-W分布表,得到临界值和,
DW值 | |||||
---|---|---|---|---|---|
相关性 | 正自相关 | 不能确定 | 无自相关性 | 不能确定 | 负自相关性 |
确定有自相关性后,可以估算出。作广义差分变换
将原模型化为
是普通的回归模型。
对于问题,有,查到显著性水平,, 时的值, ,因此是正相关
Critical Values for the Durbin-Watson Test
https://web.stanford.edu/~clint/bench/dwcrit.htm
19. 2. 1.18037 1.40118
19. 3. 1.07430 1.53553
20. 2. 1.20149 1.41073
20. 3. 1.10040 1.53668
20. 4. 0.99755 1.67634
估算
用和, 做线性回归,得到
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const 164.0233 21.328 7.690 0.000 118.810 209.237
x1 0.6420 0.064 9.957 0.000 0.505 0.779
x2 -1044.7264 135.146 -7.730 0.000 -1331.224 -758.229
==============================================================================
R-squared: 0.964
F-statistic: 212.9
对新模型的殘差做Durbin-Watson检验
新模型的durbin_watson检测结果: 1.41196
查到, ,的与为
19. 3. 1.07430 1.53553
属于不能确定相关性,靠近无自相关性。
OLS Regression Results
==============================================================================
Dep. Variable: y R-squared: 0.964
Model: OLS Adj. R-squared: 0.959
Method: Least Squares F-statistic: 212.9
Date: Mon, 22 Apr 2019 Prob (F-statistic): 2.96e-12
Time: 21:54:07 Log-Likelihood: -71.960
No. Observations: 19 AIC: 149.9
Df Residuals: 16 BIC: 152.8
Df Model: 2
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const 164.0233 21.328 7.690 0.000 118.810 209.237
x1 0.6420 0.064 9.957 0.000 0.505 0.779
x2 -1044.7264 135.146 -7.730 0.000 -1331.224 -758.229
==============================================================================
Omnibus: 2.598 Durbin-Watson: 1.412
Prob(Omnibus): 0.273 Jarque-Bera (JB): 0.926
Skew: -0.341 Prob(JB): 0.629
Kurtosis: 3.840 Cond. No. 3.97e+04
==============================================================================
最终的模型
o-真值,+线性回归,*自相关模型
做自相关分析后,得到的模型与线性回归模型相比,没有优势。原因可能是:因变量也是时间序列
例 2. 生物学家根据两种蠓虫Af和Apf的触角长和翅长对它们进行了分类。利用数据来建立区分两种蠓虫的模型,并判断给出的3待判样本。
Apf | 触角长 | 1.14 | 1.18 | 1.20 | 1.26 | 1.28 | 1.30 | |||
蠓虫 | 翅长 | 1.78 | 1.96 | 1.86 | 2.00 | 2.00 | 1.96 | |||
Af | 触角长 | 1.24 | 1.36 | 1.38 | 1.38 | 1.38 | 1.40 | 1.48 | 1.54 | 1.56 |
蠓虫 | 翅长 | 1.72 | 1.74 | 1.64 | 1.82 | 1.90 | 1.70 | 1.82 | 1.82 | 2.08 |
待判 | 触角长 | 1.24 | 1.29 | 1.43 | ||||||
蠓虫 | 翅长 | 1.80 | 1.81 | 2.03 | ||||||
利用已有的样本数据建立判别模型,用来对未知类别的样本进行分类的问题属于判别分析
判别分析(discriminant analysis)是根据所研究的个体的观测指标来推断该个体所属类型的一种统计方法。
在自然科学和社会科学的研究中经常会碰到这种统计问题。
该方法起源于 1921 年 Pearson 的种族相似系数法,1936 年 Fisher 提出线性判别函数,并形成把一个样本归类到两个总体之一的判别法。
判别问题用统计的语言来表达,就是: 已有 个总体 , , , ,它们的分布函数分别为 , , , ,每个 都是 维函数。对于给定的样本 ,要判断它来自哪一个总体? 当然,应该要求判别准则在某种意义下是最优的,例如错判的概率最小或错判的损失最小等。
距离判别: 距离判别模型的基本思路是,
设总体期望值向量为,协方差矩阵为,取为总体的中心。样本到总体的马氏距离(Mahalanobis)定义为
则,对于总体与,样本的判别准则为
其中,称为距离判别函数
实际使用中,总体的期望值向量与协方差矩阵需要用训练样本数据来估计。
当时,用混合协方差矩阵
代替上式的,其中是样本的协方差矩阵。
# % 原始数据
Apf=np.array([[1.14,1.78],[1.18,1.96],[1.20,1.86],[1.26,2.00],[1.28,2.00],[1.30,1.96]]) # %Apf蠓虫数据
Af=np.array([[1.24,1.72],[1.36, 1.74],[1.38,1.64],[1.38, 1.90],[ 1.40, 1.70],[1.48, 1.82], [1.38,1.82], [1.54,1.82], [1.56, 2.08]]) # %Af蠓虫数据
x=np.array([[1.24,1.80],[1.29,1.81],[1.43,2.03]]) # %待判蠓虫数据
sigma_1=np.cov(Apf.T) #%计算协方差矩阵
sigma_2=np.cov(Af.T)
n1=float(len(Apf)) # %Apf蠓虫样本容量
n2=float(len(Af)) # %Af蠓虫样本容量
c=(2.0*p**2+3*p-1)/(6.0*(p+1))*(1.0/(n1-1.0)+1.0/(n2-1)-1.0/(n1+n2-2))
s=((n1-1)*sigma_1+(n2-1)*sigma_2)/(n1+n2-2.0) # %混合协方差矩阵
当和服从正态分布,则
其中
假设检验: ,
给定水平,若概率,则拒绝,此时,不能使用线性检验函数。
结果
p-value of Box M: 0.435942364107064
可以使用线性检验函数
c=(2.0*p**2+3*p-1)/(6.0*(p+1))*(1.0/(n1-1.0)+1.0/(n2-1)-1.0/(n1+n2-2))
s=((n1-1)*sigma_1+(n2-1)*sigma_2)/(n1+n2-2.0) # %混合协方差矩阵
#print("混合协方差矩阵: ",s)
M=(n1+n2-2)*np.log(np.linalg.det(s))-(n1-1)*np.log(np.linalg.det(sigma_1))-(n2-1)*np.log(np.linalg.det(sigma_2))
M0=(1-c)*M
f=p*(p+1)/2 #%统计量自由度
from scipy.stats import chi2
#print(n1,n2,c,f,M0)
p0=1-chi2.cdf(M0,f) # 卡方分布概率(p值)
print("p-value of Box M(样本的协方差矩阵是否一致?): ",p0)
print(">0.05表示可以用线性判别函数进行分类")
线性判别函数:
判别系数: [-58.23643793 38.05867025] ,常数项: 5.871534358110438
样本判别结果
[1.24 1.8 ] 2.163957763037814 Apf
[1.29 1.81] -0.36727743121362266 Af
[1.43 2.03] -0.14747128781500862 Af
sigma1=np.cov(Apf.T) #%计算协方差矩阵
sigma2=np.cov(Af.T)
m1=np.mean(Apf,axis=0)
m2=np.mean(Af,axis=0)
s=((n1-1)*sigma1+(n2-1)*sigma2)/(n1+n2-2.0) # %混合协方差矩阵
#
a=np.dot(m1-m2, np.linalg.inv(s)) # %计算判别函数的系数
wc=-np.dot(0.5*(m1+m2),a) # %计算判别函数的常数项
print("判别系数: ",a," ,常数项: ",wc)
计算样本判别结果
for xx in x:
wx=wc+np.dot(a,xx)
if wx>=0.0:
wstr='Apf'
else:
wstr="Af"
print(xx,wx,wstr)
import matplotlib.pyplot as plt
plt.plot(Apf[:,0],Apf[:,1],'*')
plt.plot(Af[:,0],Af[:,1],'+')
plt.plot(x[:,0],x[:,1],'o')
x1=1.1
y1=(-wc-a[0]*x1)/a[1]
x2=1.6
y2=(-wc-a[0]*x2)/a[1]
print(x1,y1,x2,y2)
plt.plot((x1,x2),(y1,y2),'-')
plt.show()
模型检验
可以得到,回代误判率的估计值为0, 交叉验证误判率的估计值为。
Bayes判别: 在模型中引入总体的先验概率和误判造成的损失函数。
Bayes后验概率: 样本来自总体的先验概率分别是,(),并且两总体的概率密度函数分别是和,则样本属于的概率为
用表示样本按某种规则判入,表示将来自的样本误判入的损失,而误判的概率为
平均误判损失为期望
一个合理的判别准则是,最小化
这样,可以得到Bayes判别准则
特别地,当, ,且时,有
其中
当不考虑先验概率(即),也不考虑误差损失时,就是前面介绍的线性距离判别。
不同值,对应的判别结果
[1.24 1.8 ] alpha= 1.5 Apf alpha= 2.0 Apf alpha= 2.5 Apf
[1.29 1.81] alpha= 1.5 Af alpha= 2.0 Af alpha= 2.5 Apf
[1.43 2.03] alpha= 1.5 Af alpha= 2.0 Apf alpha= 2.5 Apf
可以看到,考虑误差损失的Bayes判别法比距离判别法更切合实际
Fisher判别:是一种降维的方法。
设, 是2个2维总体,期望值向量分别是, ,且,协方差矩阵为, 。对任意样本,考虑投影变换。最合适的投影向量应该满足约束优化问题:
其中为类间离散度矩阵, 为类内离散度矩阵。用Lagrange乘数法可以得到
若,则有更简单的结果
此时,称为Fisher线性判别函数。
可以得到如下的Fisher判别准则,
其中阈值。
称直线为Fisher线性判别的决策直线。