线性回归—投资额(python、OLS最小二乘、残差图、DW检验)

线性回归—投资额(python、OLS最小二乘、残差图、DW检验)


一、问题描述
    建立投资额模型,研究某地区实际投资额与国民生产值(GNP)及物价指数(PI)的关系,根据对未来GNP及PI的估计,预测未来投资额。以下是该地区连续20年的统计数据。

年份序号 投资额 国民生产总值 物价指数
1 90.9 596.7 0.7167
2 97.4 637.7 0.7277
3 113.5 691.1 0.7436
4 125.7 756 0.7676
5 122.8 799 0.7906
6 133.3 873.4 0.8254
7 149.3 944 0.8679
8 144.2 992.7 0.9145
9 166.4 1077.6 0.9601
10 195 1185.9 1.0000
11 229.8 1326.4 1.0575
12 228.7 1434.2 1.1508
13 206.1 1594.2 1.2579
14 257.9 1718 1.3234
15 324.1 1918.3 1.4005
16 386.6 2163.9 1.5042
17 423 2417.8 1.6342
18 401.9 2631.7 1.7842
19 474.9 2954.7 1.9514
20 424.5 3073 2.0688

二、问题分析

    以时间为序的数据称为时间序列。时间序列中同一变量的顺序观测值之间存在自相关,若采用普通回归模型直接处理,将会出现不良后果。因此,需要诊断并消除数据的自相关性,建立新的模型。另外许多经济数据在时间上有一定的滞后性,也会影响模型效果。
    本文按照正常建模流程来处理数据,分析每个模型的优缺点并进行比较。
三、基本模型
变量描述:
     t t t~年份序号
     y t y_{t} yt~投资额
     x 1 t x_{1t} x1t~GNP
     x 2 t x_{2t} x2t~物价指数
画散点图:
    拿到数据的第一步,画散点图,观察投资额与GNP和物价指数的基本关系。


图1 投资额与GNP散点图

图2 投资额与物价指数散点图

可以看到,投资额与GNP及物价指数间均有很强的线性关系。所以,构建基本回归模型:

y t = β 0 + β 1 x 1 t + β 2 x 2 t + ϵ t y_{t} = \beta_{0}+\beta_{1}x_{1t}+\beta_{2}x_{2t}+\epsilon_{t} yt=β0+β1x1t+β2x2t+ϵt

四、模型求解和代码展示
    第一步,导入相关库,并解决画图中文问题。

#导入库
import cmath
import numpy as np 
import pandas as pd
import statsmodels.api as sm
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
#matplotlib画图中中文显示会有问题,需要这两行设置默认字体

    第二步,导入数据,变量描述。

#导入数据
touzi = pd.read_csv("touzi.csv")
touzi = pd.DataFrame(touzi)

#变量描述
t = touzi['年份序号']
yt = touzi['投资额']
x1t = touzi['国民生产总值']
x2t = touzi['物价指数']

    第三步,分析 y t y_{t} yt(投资额) 和 x 1 t x_{1t} x1t(GNP)及 x 2 t x_{2t} x2t(物价指数) 之间的关系,通过散点图得以直观表达。分别是图1、图2。

    第四步(最重要一步),求解模型回归系数: β 0 、 β 1 、 β 2 \beta_{0}、\beta_{1}、\beta_{2} β0β1β2.
    本文用OLS普通最小二乘法求解,在下列代码 (‘yt ~ x1t + x2t’, data = touzi)中,yt表示因变量。自变量则在yt~后边表示成变量相加的格式,模型会自动求解出变量前的回归系数。

#yt = b0 + b1x1t + b2x2t + e
model_1 = sm.formula.ols('yt ~ x1t + x2t', data = touzi).fit()  #OLS普通最小二乘法
model_1.summary()

图3 拟合参数

    下面是模型结果中部分参数的解释。

左边:
Dep.Variable:    输出变量的名称
Model:         模型名称
Method:        方法,其中 Least Squares 表示最小二乘法
Date:         日期
Time:         时间
No.Observations: 样本数目
Df Residuals:    残差自由度
Df Model:        模型参数个数,相当于输入的X的元素个数
右边:
R- squared:        可决系数,用来判断估计的准确性,范围在[0,1]越接近1,说明对y的解释能力越强,拟合越好
Adj-R- squared:    通过样本数量与模型数量对R-squared进行修正,奥卡姆剃刀原理,避免描述冗杂
F-statistic:       衡量拟合的显著性,重要程度
Prob(F-statistic): 当prob(F-statistic)<α时,表示拒绝原假设,即认为模型是显著的
Log likelihood:    对数似然比LLR
AIC:               衡量拟合优良性
BIC:               贝叶斯信息准则

    主要看此处的结果。Intercept表示 β 0 \beta_{0} β0 的数值, x 1 t 、 x 2 t x_{1t}、x_{2t} x1tx2t分别表示求得自身系数 β 1 、 β 2 \beta_{1}、\beta_{2} β1β2 的数值。

coef:     系数
std err:  系数估计的基本标准误差
t:        t统计值,衡量系数统计显著程度的指标
P>|t|:    P[0.025,0.975]:   95%置信区间的下限和上限值

五、基本回归模型结果分析

equation_yt = 'yt方程为:' + '\tyt' + '  =  ' + '363.7029' + '  +  ' + '0.6792' + '*x1t  ' + '-  ' + '972.7857' + '*x2t'
print(equation_yt)
pre_yt = 363.7029 + 0.6792*x1t - 972.7857*x2t
pre_yt = list(pre_yt)
MSE = cmath.sqrt(sum((yt - pre_yt)**2/(20)))
print('剩余标准差:\ts   = ',MSE)
print('R2 = ',0.990,',拟合度高')

    模型优点: R 2 = 0.990 R^2 = 0.990 R2=0.990,拟合度高
    模型缺点:没有考虑时间序列数据的滞后性影响,可能忽视了随机误差存在自相关,如果存在自相关,用此模型会有不良后果。

六、自相关的定性诊断
1、残差诊断法
    模型残差 e t = y t − y ^ t e_{t} = y_{t} -\widehat{y}_{t} et=yty t
     e t e_{t} et为随机误差 ϵ t \epsilon_{t} ϵt的估计值。
    作残差 e t e_{t} et~ e t − 1 e_{t-1} e

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>