目录
对函数形式误设问题的一般检验:RESET(regression specification error test)
假设线性回归模型为
RESET检验的基本思路:如果怀疑非线性项被遗漏,那么就把非线性项引入方程,并检验其系数是否显著。
考虑做以下辅助回归:
检验拟合值的高次项系数是否联合等于0,即对:做F检验。
如果拒绝,说明模型中有高次项;反之,则接受,可使用线性模型。RESET检验的缺点是在拒绝的情况下,并不提供具体遗漏哪些高次项的信息,不能为我们该如何做提供一个现实的方向。
我们以伍德里奇《计量经济学导论:现代方法》的”第9章 模型设定和数据问题的深入探讨“的案例9.2为例,讲解如何进行RESET检验。
一、导入数据
import wooldridge as woo
import pandas as pd
import statsmodels.formula.api as smf
hprice1 = woo.dataWoo('hprice1')
二、RESET检验
我们估计住房价格模型如下:
RESET检验进行辅助回归,模型如下:
检验拟合值的高次项系数是否联合等于0,即对:做F检验。
#原OLS方程:
reg = smf.ols(formula='price ~ lotsize + sqrft + bdrms', data=hprice1)
results = reg.fit()
#RESET检验回归方程:
hprice1['fitted_sq'] = results.fittedvalues ** 2
hprice1['fitted_cub'] = results.fittedvalues ** 3
reg_reset = smf.ols(formula='price ~ lotsize + sqrft + bdrms +fitted_sq + fitted_cub', data=hprice1)
results_reset = reg_reset.fit()
#检验拟合值的高次项系数是否联合为0
hypotheses = ['fitted_sq = 0', 'fitted_cub = 0']
ftest_reset = results_reset.f_test(hypotheses)
print(ftest_reset)
'''
<F test: F=4.66820553494783, p=0.012021711442893317, df_denom=82, df_num=2>
'''
结果显示,p值<5%,在5%的显著性水平下,拒绝原假设,即存在模型设定偏误。
除了上述方法,我们还可以借助statsmodels.stats.outliers_influence的reset_ramsey函数直接进行RESET检验。
reset_ramsey(res, degree=5)
res:回归模型
degree:RESET检验回归方程所包含的最高次项,最小为2,默认为5
代码如下:
import statsmodels.stats.outliers_influence as smo
reset_output = smo.reset_ramsey(res=results, degree=3)
print(reset_output)
'''
<F test: F=4.668205534949062, p=0.012021711442880029, df_denom=82, df_num=2>
'''
三、全套代码
#导入相关库
import wooldridge as woo
import pandas as pd
import statsmodels.formula.api as smf
import statsmodels.stats.outliers_influence as smo
#导入数据
hprice1 = woo.dataWoo('hprice1')
#原OLS方程:
reg = smf.ols(formula='price ~ lotsize + sqrft + bdrms', data=hprice1)
results = reg.fit()
#RESET检验回归方程:
hprice1['fitted_sq'] = results.fittedvalues ** 2
hprice1['fitted_cub'] = results.fittedvalues ** 3
reg_reset = smf.ols(formula='price ~ lotsize + sqrft + bdrms +'
' fitted_sq + fitted_cub', data=hprice1)
results_reset = reg_reset.fit()
#检验拟合值的高次项系数是否联合为0
hypotheses = ['fitted_sq = 0', 'fitted_cub = 0']
ftest_man = results_reset.f_test(hypotheses)
print(ftest_man)
#自动进行RESET检验
reset_output = smo.reset_ramsey(res=results, degree=3)
print(reset_output)