计量经济学 pdf_计量经济学笔记——直观理解假设检验(1)

8c5e00b012174294a534f4209b039222.png

传统计量经济学的思想是,我们所看到的样本,是由其背后的数据生成过程产生的(DGP, Data Generating Process),这个数据生成过程也可以称作总体模型(在计量经济学中,这个数据生成过程可以代表真实世界的经济规律,或者是对经济现象的一种理论解释)。这个DGP可以产生一个又一个的样本,我们只能看到其中一个样本,我们希望通过挖掘这个样本的特点,来判断这个样本是否来自这个某个DGP。这一个过程可以称之为假设检验。下面,我们通过统计模拟的方法(用Python编程),来直观认识假设检验到底是什么含义。

1、设定数据生成过程(DGP)

我们假设真实的DGP是:

一会儿我们看,由这个DGP生成的样本能不能很好地估计出截距0和斜率0。

首先导入所有需要的Python库:

import numpy as np
import pandas as pd
import statsmodels.formula.api as smf
from matplotlib import pyplot as plt
import seaborn as sns
sns.set()
import scipy

接着构造x,均匀“铺满”0-100之间:

data = pd.DataFrame(np.random.uniform(0,100,100),columns=["x"])
data.sort_values(by=["x"],ascending = True,inplace = True)
data.reset_index(drop=True, inplace=True)

接着构造一个函数classical,代表上述构造的DGP,将data输入即可得到一个经典DGP生成的样本:

def classical(data):
    for i in range(0,100):
        data = data.copy()
        data.loc[i,"residual"] = np.random.normal(loc = 0, scale= 10 )
        data["y"]  = 0 * data["x"] + data["residual"]
    return data

2、观察经典DGP生成的数据“长”什么样子?

理解统计最好的方法就是将公式和统计图表相结合。我们要对经典GDP产生的数据“长”的样子有一个直观的印象,才更更好地理解后续所学习的随机扰动项异方差和自相关模型。

我们先生成4个样本进行观察:

data_sample_classical = []
for i in range(0,4):
    data_sample_classical.append(classical(data))

fig1 = plt.figure(figsize=(8,5))
plt.subplot(2,2,1)
sns.regplot(x='x', y='y', data=data_sample_classical[0],scatter_kws ={'s':5},color="blue")

plt.subplot(2,2,2)
sns.regplot(x='x', y='y', data=data_sample_classical[1],scatter_kws ={'s':5},color="blue")

plt.subplot(2,2,3)
sns.regplot(x='x', y='y', data=data_sample_classical[2],scatter_kws ={'s':5},color="blue")

plt.subplot(2,2,4)
sns.regplot(x='x', y='y', data=data_sample_classical[3],scatter_kws ={'s':5},color="blue")
plt.show()

d9dba7197f105f88300401dbfb36122d.png
经典DGP生成的样本

图中这四个样本就是我们上述设定DGP

生成,如果我们仅拿到的是图中的一个样本,并从这个样本出发用OLS回归直线去“猜”DGP,好像还挺不错的。至少这四张图都没有离我们的DGP太远。

3、什么是假设检验

如果我们将上述的4换成20000,并且记录每次用OLS法得到的截距值和斜率值,会是什么样子呢?

设定列表用来存数据结果:

classical_intercept = [] 
classical_intercept_t = []
classical_slope = []
classical_slope_t = []

计算20000个值(稍微有点耗时间,读者可根据自己需要使用多进程):

for i in range(20000):
    data_sample = classical(data)
    est = smf.ols('y ~ 1 + x',data = data_sample).fit()
    classical_intercept.append(est.params[0])
    classical_intercept_t.append(est.tvalues[0])
    classical_slope.append(est.params[1])
    classical_slope_t.append(est.tvalues[1])

画出20000次计算,截距和斜率的分布:

fig2 = plt.figure(figsize=(20,6.5))
plt.subplot(1,2,1)
sns.distplot(classical_intercept,color="blue") 

plt.subplot(1,2,2)
sns.distplot(classical_intercept_t,color="blue") 
plt.plot(np.linspace( -6, 6, 1000), scipy.stats.t.pdf(np.linspace( -6, 6, 1000),99),color="black")
plt.show()
#fig.savefig('test2png.png', dpi=400)

3e58a7999f10e227c0cf5bb994063b99.png
左图为截距的分布,右图为斜率的分布

在20000次生成的样本中,大部分样本可以用来估计得到很接近真实截距0和真实斜率0,但是确实有一部分样本是无法代表DGP的,用这些样本进行OLS会得到很大的截距或斜率。比如能估计出5这样的截距数值。

假设检验的含义这时候就比较清晰了,假设DGP是

,在重复生成样本的过程中,总会出现几个样本,不能代表DGP,因此OLS估计量是一个随机变量,是存在分布的。教材上会给出分布的推导(
)。我们认为出现这样极端的样本是很小的,因此,如果出现了,我们就认为这样的样本不是来自
,虽然在这个例子中这个极端样本确实来自这个DGP,因此我们这个判断是存在犯错概率的,这个犯错概率就是显著性水平。

我们可以想一下我们研究中是如何处理数据的,上帝首先给了我们数据,然后我们用方法去猜上帝使用什么DGP生成的数据:

data_sample = classical(data)
sns.regplot(x='x', y='y', data=data_sample,scatter_kws ={'s':5},color="blue")
est = smf.ols('y ~ 1 + x',data = data_sample).fit()
est.summary()

也许我们运气不好,就拿到了上帝产生的极端数据样本,并没有猜出“上帝”的本意对不对?:

d2ee385b053cbc103719acb13e1cea0d.png

efc379557aa503964f75551f70e132d5.png

所以我们在做假设检验时,需要提醒自己,显著性水平就是犯错的概率,显著性水平怎么选,要看我们能不能接受犯错带来的决策失误的后果,这样一个思路下,统计学是科学。这另一方面来说,上面设个回归结果我认为挺好的,这条直线是一条能代表样本数据的直线,如果用一条直线来反映这个数据样本,我会选择这一条直线,我不去管做假设检验会犯哪一类错误,这是机器学习的思路,这个视角下,统计学是技术。具体我们应当采取那一个思路来看统计结果,需要结合自身专业来定。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值