如何在Python中进行Breusch-Pagan测试
异方差是一个统计学术语,它被定义为残差的不平等散布。更具体地说,它指的是测量值的范围,即残差的变化。异方差拥有一个挑战,因为普通最小二乘法(OLS)回归认为从人口中抛出的残差具有同方差,也就是恒定方差。如果回归分析中存在异方差,那么分析的结果就不能轻易相信。
Breusch-Pagan检验是检查回归分析中是否存在异方差的一种方法。Breusch-Pagan检验遵循以下假设。
假设:
- 无效假设(H0)。标志着同方差性的存在。
- 备选假设:(Ha)。标志着同方差性不存在(即异方差性存在)。
安装numNumPypy、pandas和statsmodels库的语法。
pip3 install numpy pandas statsmodels
进行Breusch-Pegan测试
进行Breusch-Pegan测试是一个分步骤的过程。这些都在下面讨论。
第1步:导入库。
第一步是导入我们上面安装的库。
# Importing libraries
import numpy as np
import pandas as pd
import statsmodels.formula.api as smf
第2步:创建一个数据集。
然后我们需要创建一个数据集。
# Create a dataset
dataframe = pd.DataFrame({'rating': [92, 84, 87, 82, 98,
94, 75, 80, 83, 89],
'points': [27, 30, 15, 26, 27,
20, 16, 18, 19, 20],
'runs': [5000, 7000, 5102, 8019,
1200, 7210, 6200, 9214,
4012, 3102],
'wickets': [110, 120, 110, 80, 90,
119, 116, 100, 90, 76]})
步骤3:拟合一个多元线性回归模型。
下一步是拟合一个多元线性回归模型。作为一个例子,我们考虑将评级作为响应变量,将分数、跑数和门票作为解释变量。
# Importing libraries
import numpy as np
import pandas as pd
import statsmodels.formula.api as smf
# Create a dataset
dataframe = pd.DataFrame({'rating': [92, 84, 87, 82,
98, 94, 75, 80,
83, 89],
'points': [27, 30, 15, 26,
27, 20, 16, 18,
19, 20],
'runs': [5000, 7000, 5102,
8019, 1200, 7210,
6200, 9214, 4012,
3102],
'wickets': [110, 120, 110,
80, 90, 119,
116, 100, 90,
76]})
# fit regression model
fit = smf.ols('rating ~ points+runs+wickets', data=dataframe).fit()
print(fit.summary())
输出:
第4步:进行Breusch-Pagan测试。
下一步是进行Breusch-Pagan检验,以确定是否存在异方差性。
# Importing libraries
import numpy as np
import pandas as pd
import statsmodels.formula.api as smf
from statsmodels.compat import lzip
import statsmodels.stats.api as sms
# Creating a dataset
dataframe = pd.DataFrame({'rating': [92, 84, 87, 82,
98, 94, 75, 80,
83, 89],
'points': [27, 30, 15, 26,
27, 20, 16, 18,
19, 20],
'runs': [5000, 7000, 5102,
8019, 1200, 7210,
6200, 9214, 4012,
3102],
'wickets': [110, 120, 110,
80, 90, 119,
116, 100, 90,
76]})
# Fit the regression model
fit = smf.ols('rating ~ points+runs+wickets', data=dataframe).fit()
# Conduct the Breusch-Pagan test
names = ['Lagrange multiplier statistic', 'p-value',
'f-value', 'f p-value']
# Get the test result
test_result = sms.het_breuschpagan(fit.resid, fit.model.exog)
lzip(names, test_result)
输出:
输出 Interpretation:
这里,测试的拉格朗日乘数统计量等于4.364,相应的p值等于0.224。由于p值大于0.05,所以我们不能拒绝无效假设。因此,我们没有足够的证据来证明回归模型中存在异方差性。
如何解决异方差问题:
在上面的例子中,回归模型中不存在异方差现象。但是对于异方差实际存在的情况,那么有三种方法可以解决这个问题。
- 改变因变量。我们可以用一些技术来改变因变量。例如,我们可以取因变量的对数。
- 重新定义因变量。我们可以重新定义因变量。例如,对因变量使用比缺陷值的比率。
- 使用加权回归。最后一种方法是使用加权回归。在这种类型的回归中,根据每个数据点的拟合值的方差为其分配权重。使用适当的权重可以消除异方差的问题。