对于多元线性回归模型,方程的总体线性关系是显著的,并不能说明每个解释变量对被解释变量的影响是显著的,因此,必须对每个解释变量进行显著性检验,以决定是否作为解释变量被保留在模型中。如果某个变量对被解释变量的影响并不显著,应该将其剔除,以建立更简单的模型。变量显著性检验应用最为普遍的是t检验。
假设检验(hypothesis test)是利用样本信息判断假设是否成立的过程,它是先对总体参数提出某种假设,然后利用样本信息判断假设是否成立。
原假设:研究者想收集证据予以反对的假设,也称零假设,用 H 0 H_0 H0表示。
备择假设:研究者想收集证据予以支持的假设,也称研究假设,用 H 1 H_1 H1表示。
如果备择假设具有特定方向,并含有“>” 或 “<” 的假设,称为单侧检验或单边检验。
(1)单边右侧检验:拒绝域在分布的右侧尾部
单侧检验: H 0 : μ ≤ μ 0 , H 1 : μ > μ 0 H_0:\mu \leq \mu_0,H_1:\mu> \mu_0 H0:μ≤μ0,H1:μ>μ0,或者: H 0 : μ = μ 0 , H 1 : μ > μ 0 H_0:\mu = \mu_0,H_1:\mu> \mu_0 H0:μ=μ0,H1:μ>μ0
给定一个显著性水平 α \alpha α,得到临界值 t α ( n − k − 1 ) t_{\alpha}(n-k-1) tα(n−k−1),若 t > t α ( n − k − 1 ) t>t_{\alpha}(n-k-1) t>tα(n−k−1),则拒绝原假设。
(2)单边左侧检验:拒绝域在分布的左侧尾部
单侧检验: H 0 : μ ≥ μ 0 , H 1 : μ < μ 0 H_0:\mu \geq \mu_0,H_1:\mu< \mu_0 H0:μ≥μ0,H1:μ<μ0,或者: H 0 : μ = μ 0 , H 1 : μ < μ 0 H_0:\mu = \mu_0,H_1:\mu< \mu_0 H0:μ=μ0,H1:μ<μ0
给定一个显著性水平 α \alpha α,得到临界值 t α ( n − k − 1 ) t_{\alpha}(n-k-1) tα(n−k−1),若 t < − t α ( n − k − 1 ) t<-t_{\alpha}(n-k-1) t<−tα(n−k−1),则拒绝原假设。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k5KlHGEb-1659423356285)(https://files.mdnice.com/user/29206/8669d2fe-530f-45ae-b9fe-004e33499e0a.png)]
如果备择假设没有特定的方向,只含有“≠”的假设,称为双侧检验或双边检验。
双侧检验: H 0 : μ = μ 0 , H 1 : μ ≠ μ 0 H_0:\mu = \mu_0,H_1:\mu \neq \mu_0 H0:μ=μ0,H1:μ=μ0
给定一个显著性水平 α \alpha α,得到临界值 t α 2 ( n − k − 1 ) t_{\frac{\alpha}{2}}(n-k-1) t2α(n−k−1),若 ∣ t ∣ > t α 2 ( n − k − 1 ) |t|>t_{\frac{\alpha}{2}}(n-k-1) ∣t∣>t2α(n−k−1),则拒绝原假设。
一家研究机构估计,某城市中家庭拥有汽车的比率超过30%。为验证这一估计是否正确,该研究机构随机抽取了一个样本进行检验。试陈述和书写用于检验的原假设和备择假设。
分析一下:设该城市中家庭拥有汽车的比率真值是y。显然,研究者想收集证据予以支持的假设是 “ 该城市中家庭拥有汽车的比率超过30% ” ,因此建立的原假设和备择假设可以书写为:
H0:y = 30% (或 y ≤ 30%)
H1:y > 30%
我们以伍德里奇《计量经济学导论:现代方法》的“第4章 多元回归分析:推断”的案例4.1为例,利用WAGE1中526个工人的观测数据,研究其工资和受教育程度、工作经验和任职时长的关系。构建多元线性回归模型如下:
l o g ( w a g e ) = β 0 + β 1 e d u c + β 2 e x p e r + β 3 t e n u r e + u log(wage)=\beta_0+\beta_1educ+\beta_2exper+\beta_3tenure+u log(wage)=β0+β1educ+β2exper+β3tenure+u
构建模型代码如下:
import wooldridge as woo
import statsmodels.formula.api as smf
from scipy import stats
wage1 = woo.dataWoo('wage1')
#建立回归模型:
reg = smf.ols(formula='lwage ~ educ + exper + tenure', data = wage1)
results = reg.fit()
print(results.summary())
模型回归结果如下:
l o g ( w a g e ) ^ = 0.2844 + 0.0920 e d u c + 0.0041 e x p e r + 0.0221 t e n u r e + u \widehat{log(wage)}=0.2844+0.0920educ+0.0041exper+0.0221tenure+u log(wage) =0.2844+0.0920educ+0.0041exper+0.0221tenure+u
工作经历exper的斜率系数为0.0041,本例将进一步检验该系数是否为0。
采用单侧备择建设检验方法,即: H 0 : β e x p e r = 0 , H 1 : β e x p e r > 0 H_0:\beta_{exper} = 0,H_1:\beta_{exper}> 0 H0:βexper=0,H1:βexper>0
代码如下:
#1.计算样本量
n = len(wage1)
#2.计算自由度
df = n-3-1 #n为计算的样本量,3为自变量个数
#3.计算t统计量
t_exper = results.params['exper']/ results.bse['exper'] #params获得系数,bse获得系数标准误
#t_exper = results.tvalues['exper'] #tvalues直接获得t统计量
#4.计算拒绝临界值
a = 0.05 #显著性水平为5%
c = stats.t.ppf(1-a,df)
#5.比较t统计量和临界值大小
if t_exper > c:
print('拒绝原假设,exper的回归系数显著大于0')
else:
print('不能拒绝原假设,exper不显著')
本例中,t统计量计算结果为2.39,拒绝临界值为1.648,t统计量大于拒绝临界值,所以拒绝原假设,exper系数显著大于0。
我们也可以采用p值的方法。
#1.计算样本量
n = len(wage1)
#2.计算自由度
df = n-3-1 #n为计算的样本量,3为自变量个数
#3.计算t统计量
t_exper = results.params['exper']/ results.bse['exper'] #params获得系数,bse获得系数标准误
#t_exper = results.tvalues['exper'] #tvalues直接获得t统计量
#4.计算p值
pval = stats.t.cdf(-abs(t_exper), df)
#pval = 1-stats.t.cdf(abs(t_exper), df)
#5.比较p和显著性水平大小
a = 0.05 #显著性水平为5%
if pval < a:
print('拒绝原假设,exper的回归系数显著大于0')
else:
print('不能拒绝原假设,exper不显著')
p值为0.0086,小于5%的显著性水平,因此拒绝原假设。
我们以伍德里奇《计量经济学导论:现代方法》的“第4章 多元回归分析:推断”的案例4.2为例,利用MEAP93中美国学生数学成绩相关的数据,研究标准化数学成绩的影响因素,包括教师年薪、注册学生人数和配备教师数量。构建多元线性回归模型如下:
m a t h 10 = β 0 + β 1 t o t c o m p + β 2 s t a f f + β 3 e n r o l l + u math10=\beta_0+\beta_1totcomp+\beta_2staff+\beta_3enroll+u math10=β0+β1totcomp+β2staff+β3enroll+u
构建模型代码如下:
import wooldridge as woo
import statsmodels.formula.api as smf
from scipy import stats
meap93 = woo.dataWoo('meap93')
#建立回归模型:
reg = smf.ols(formula='math10 ~ totcomp + staff + enroll', data = meap93)
results = reg.fit()
print(results.summary())
模型回归结果如下:
m a t h 10 ^ = 2.2740 + 0.0005 t o t c o m p + 0.0479 s t a f f − 0.0002 e n r o l l \widehat{math10}=2.2740+0.0005totcomp+0.0479staff-0.0002enroll math10 =2.2740+0.0005totcomp+0.0479staff−0.0002enroll
enroll的回归系数为-0.0002,本例将进一步检验该系数是否为0。
采用单侧备择建设检验方法,即: H 0 : β e n r o l l = 0 , H 1 : β e n r o l l < 0 H_0:\beta_{enroll} = 0,H_1:\beta_{enroll}< 0 H0:βenroll=0,H1:βenroll<0
代码如下:
#1.计算样本量
n = len(meap93)
#2.计算自由度
df = n-3-1 #n为计算的样本量,3为自变量个数
#3.计算t统计量
t_enroll = results.tvalues['enroll'] #tvalues直接获得t统计量
#4.计算拒绝临界值
a = 0.05 #显著性水平为5%
c = stats.t.ppf(a,df)
#4.比较t统计量和临界值大小
if t_enroll < c:
print('拒绝原假设,enroll的回归系数显著小于0')
else:
print('不能拒绝原假设,enroll不显著')
enroll变量的t统计量为-0.91,而在5%显著性水平下的t分布的拒绝临界值是-1.65,t统计量大于临界值,所以不能拒绝原假设,enroll变量在5%的显著性水平下不是显著的。
#1.计算样本量
n = len(meap93)
#2.计算自由度
df = n-3-1 #n为计算的样本量,3为自变量个数
#3.计算t统计量
t_enroll = results.tvalues['enroll'] #tvalues直接获得t统计量
#4.计算p值
pval = stats.t.cdf(-abs(t_enroll), df)
#pval = 1-stats.t.cdf(abs(t_enroll), df)
#5.比较p和显著性水平大小
a = 0.05 #显著性水平为5%
if pval < a:
print('拒绝原假设,enroll的回归系数显著大于0')
else:
print('不能拒绝原假设,enroll不显著')
p值为0.18,大于5%的显著性水平,因此不能拒绝原假设。
我们以伍德里奇《计量经济学导论:现代方法》的“第4章 多元回归分析:推断”的案例4.3为例,利用GPA1数据,研究大学成绩的影响因素,包括高中成绩、每周缺课次数和大学能力测验分数。构建多元线性回归模型如下:
c o l G P A = β 0 + β 1 h s G P A + β 2 A C T + β 3 s k i p p e d + u colGPA=\beta_0+\beta_1hsGPA+\beta_2ACT+\beta_3skipped+u colGPA=β0+β1hsGPA+β2ACT+β3skipped+u
构建模型代码如下:
import wooldridge as woo
import statsmodels.formula.api as smf
from scipy import stats
gpa1 = woo.dataWoo('gpa1')
#建立回归模型:
reg = smf.ols(formula='colGPA ~ hsGPA + ACT + skipped', data = gpa1)
results = reg.fit()
print(results.summary())
模型回归结果如下:
c o l G P A ^ = 1.3896 + 0.4118 h s G P A + 0.0147 A C T − 0.0831 s k i p p e d \widehat{colGPA}=1.3896+0.4118hsGPA+0.0147ACT-0.0831skipped colGPA =1.3896+0.4118hsGPA+0.0147ACT−0.0831skipped
本例检验系数是否等于0。
采用双侧备择建设检验方法,即: H 0 : β i = 0 , H 1 : β i ≠ 0 H_0:\beta_i = 0,H_1:\beta_i\neq 0 H0:βi=0,H1:βi=0
#1.计算样本量
n = len(gpa1)
#2.计算自由度
df = n-3-1 #n为计算的样本量,3为自变量个数
#3.计算t统计量
t_values = results.tvalues #tvalues直接获得t统计量
#4.计算在显著性水平为5%的情况下的t分布双侧检验拒绝临界值
a = 0.05 #显著性水平为5%
c = stats.t.ppf(1-a/2,df) #右侧临界值
#4.比较t统计量和临界值大小
print(f't统计量为:\n{t_values}')
print(f'左侧临界值:{-c},右侧临界值:{c}')
for i in range(len(t_values)-1):
if abs(t_values[i+1]) > c:
print(f'拒绝原假设,{t_values.index[i+1]}的回归系数显著不等于0')
else:
print(f'不能拒绝原假设,{t_values.index[i+1]}不显著')
结果为:
t统计量为:
Intercept 4.191039
hsGPA 4.396260
ACT 1.393319
skipped -3.196840
dtype: float64
左侧临界值:-1.977431212292894,右侧临界值:1.9774312122928936
拒绝原假设,hsGPA的回归系数显著不等于0
不能拒绝原假设,ACT不显著
拒绝原假设,skipped的回归系数显著不等于0
根据计算,hsGPA的t统计量为4.40,远大于右侧临界值1.98,因此是显著的;ACT的t统计量为为1.39,小于右侧临界值1.98,在统计上不显著;skipped的t统计量为-3.2,小于左侧临界值-1.98,或者说其绝对值大于右侧临界值1.98,因此是显著的。
我们也可以采用p值的方法。
#1.计算样本量
n = len(gpa1)
#2.计算自由度
df = n-3-1 #n为计算的样本量,3为自变量个数
#3.计算t统计量
t_values = results.tvalues #tvalues直接获得t统计量
#4.计算p值
pval = 2*stats.t.cdf(-abs(t_values), df) #双侧检验
#pval = 2*(1-stats.t.cdf(abs(t_values), df))
#5.比较p和显著性水平大小
a = 0.05 #显著性水平为5%
for i in range(len(t_values)-1):
if pval[i+1] < a:
print(f'拒绝原假设,{t_values.index[i+1]}的回归系数显著不等于0')
else:
print(f'不能拒绝原假设,{t_values.index[i+1]}不显著')
除了自己手动进行t检验,我们可以调用results.t_test()方法直接进行t检验,该方法只能进行双侧检验。
hypotheses ='hsGPA =0,ACT=0,skipped =0'
t_test = results.t_test(hypotheses)
print(t_test)
结果如下:
Test for Constraints
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
c0 0.4118 0.094 4.396 0.000 0.227 0.597
c1 0.0147 0.011 1.393 0.166 -0.006 0.036
c2 -0.0831 0.026 -3.197 0.002 -0.135 -0.032
==============================================================================
尽管: H 0 : β i = 0 H_0:\beta_i = 0 H0:βi=0是最常见的假设,但有时候我们也想检验$\beta_i $是否等于其他某个给定的常数。比如如果我们研究hsGPA对colGPA的回归系数是否大于0.4,我们的原假设和备择假设为:
H 0 : β h s G P A = 0.4 , H 1 : β h s G P A > 0.4 H_0:\beta_{hsGPA}= 0.4,H_1:\beta_{hsGPA}> 0.4 H0:βhsGPA=0.4,H1:βhsGPA>0.4
results.tvalues返回的是原假设为系数等于0的t统计量,当原假设系数等于其他常数,需要通过公式计算t统计量,公式如下:
t 统计量 = 估计值 − 假设值 标准误 t统计量=\frac{估计值-假设值}{标准误} t统计量=标准误估计值−假设值
代码如下:
#1.计算样本量
n = len(gpa1)
#2.计算自由度
df = n-3-1 #n为计算的样本量,3为自变量个数
#3.计算t统计量
t_hsGPA = (results.params['hsGPA']-0.4)/ results.bse['hsGPA'] #params获得系数,bse获得系数标准误
#4.计算拒绝临界值
a = 0.05 #显著性水平为5%
c = stats.t.ppf(1-a,df)
#4.比较t统计量和临界值大小
if t_hsGPA > c:
print('拒绝原假设,hsGPA的回归系数显著大于0.4')
else:
print('不能拒绝原假设,hsGPA的回归系数大于0.4是不显著的')
结果为:
不能拒绝原假设,hsGPA的回归系数大于0.4是不显著的
我们计算得到t统计量为0.126,而t分布在5%显著性水平下的双侧临界值为1.66,t统计量小于临界值,所以不能拒绝原假设,即hsGPA对colGPA的回归系数大于0.4是不显著的。
代码如下:
#1.计算样本量
n = len(gpa1)
#2.计算自由度
df = n-3-1 #n为计算的样本量,3为自变量个数
#3.计算t统计量
t_hsGPA = (results.params['hsGPA']-0.4)/ results.bse['hsGPA'] #params获得系数,bse获得系数标准误
#4.计算p值
pval = stats.t.cdf(-abs(t_hsGPA), df)
#pval = 1-stats.t.cdf(t_hsGPA), df)
#5.比较p和显著性水平大小
a = 0.05 #显著性水平为5%
if pval < a:
print('拒绝原假设,hsGPA的回归系数显著大于0.4')
else:
print('不能拒绝原假设,hsGPA的回归系数大于0.4是不显著的')