本文主要是回归模型的BOX-COX变换消除异方差和自相关性的影响以及强影响点的分析
目录
一、BOX-COX变换
1、原理
图一 图二
图一是y值大于0情况下的变换,图二是y小于0情况下的变换。通过这种变换寻找到一个最佳的值,然后通过
值对y值进行变换。
的值计算如下:
通过这个式子去寻找最大的值,一般这个过程Python中有专门的函数库实现。
这个变换可以消除异方差性和自相关性带来的问题,主要是对因变量y值进行的变换,使数据呈现一个近似的正态分布。
2、BOX-COX消除异方差性
原数据如下:
对这些数据进行线性回归建模。
然后分析异方差性,斯皮尔曼相关系数检验,如下:
x2的pvalue的值小于0.05,则认为存在异方差性。
代码如下:
# 异方差性检查
eres = result.resid
abse = abs(eres)
# spearman相关系数检验
cortest1 = scipy.stats.spearmanr(df['x1'], abse)
cortest2 = scipy.stats.spearmanr(df['x2'], abse)
print(cortest1, cortest2)
然后进行BOX-COX变换,如下:
# boxcox变换
ynew, lamb = scipy.stats.boxcox(df['y'])
df['y'] = ynew
其中ynew是变换后的y值,lamb是的值。
再建模和异方差性的分析,如下:
x1和x2的pvalue的值均大于0.05,则认为无异方差性。
代码如下:
result2 = smf.ols('y~x1+x2', data=df).fit()
print(result2.summary())
# 计算残差
eres = result2.resid
# 异方差性检查
abse = abs(eres)
# spearman相关系数检验
cortest1 = scipy.stats.spearmanr(df['x1'], abse)
cortest2 = scipy.stats.spearmanr(df['x2'], abse)
print(cortest1, cortest2)
3、BOX-COX消除自相关性
对以下数据进行建模,数据如下:
然后,自相关性分析,使用DW检验,结果为1.47,查表得到DL=0.98,DU=1.54,DW值落在自相关性的区域里面,所以存在自相关性。
代码如下:
#DW检验
DW = sm.stats.durbin_watson(result.resid)
rho = 1-0.5*DW
print(DW)
接着通过BOX-COX变换,如下:
# boxcox变换
ynew, lamb = scipy.stats.boxcox(df['y'])
df['y'] = ynew
print(df)
result2 = smf.ols('y~x1+x2', data=df).fit()
print(result2.summary())
print(lamb)
再进行DW检验,结果为1.68,DW值落在无自相关行区域,所以消除了模型的自相关性。
二、强影响点分析
强影响点实际就是是数据中出现的异常值点。通常是通过删除化学生残差进行判断,如下:
判断标准是SRE大于3,则存在异常值,否则就无异常值。判断出异常值后,就需要按照我前面的文章中异常的分析进行处理,如下:
这只是其中的两种处理方法。
代码如下:
import numpy as np
import statsmodels.api as sm
import statsmodels.formula.api as smf
import pandas as pd
import scipy
f = open('文件路径')
df = pd.read_csv(f)
f.close()
#建模
result = smf.ols('y~x1+x2', data=df).fit()
print(result1.summary())
print(result1.pvalues)
#删除学生化残差
infl = result.get_influence()
studentied_eres = infl.resid_studentized_external
print(studentied_eres)
总结:
以上就是本文的全部内容,有错误和疑问的地方,评论区交流,一起学习和进步!
完整代码如下:
异方差性
import numpy as np
import statsmodels.api as sm
import statsmodels.formula.api as smf
import pandas as pd
import scipy
f = open('文件路径')
df = pd.read_csv(f)
f.close()
#建模
result1 = smf.ols('y~x1+x2', data=df).fit()
print(result1.summary())
print(result1.pvalues)
# 异方差性检查
eres = result1.resid
abse = abs(eres)
# spearman相关系数检验
cortest1 = scipy.stats.spearmanr(df['x1'], abse)
cortest2 = scipy.stats.spearmanr(df['x2'], abse)
print(cortest1, "\n",cortest2)
# boxcox变换
ynew, lamb = scipy.stats.boxcox(df['y'])
df['y'] = ynew
#print(df)
result2 = smf.ols('y~x1+x2', data=df).fit()
print(result2.summary())
#print(lamb)
#再次检验
# 计算残差
eres = result2.resid
# 异方差性检查
abse = abs(eres)
# spearman相关系数检验
cortest1 = scipy.stats.spearmanr(df['x1'], abse)
cortest2 = scipy.stats.spearmanr(df['x2'], abse)
print(cortest1, "\n",cortest2)
自相关性
import numpy as np
import statsmodels.api as sm
import statsmodels.formula.api as smf
import pandas as pd
import scipy
f = open('文件路径')
df = pd.read_csv(f)
f.close()
#建模
result1 = smf.ols('y~x1+x2', data=df).fit()
print(result1.summary())
print(result1.pvalues)
#DW检验
DW = sm.stats.durbin_watson(result.resid)
rho = 1-0.5*DW
print(DW)
# boxcox变换
ynew, lamb = scipy.stats.boxcox(df['y'])
df['y'] = ynew
print(df)
result2 = smf.ols('y~x1+x2', data=df).fit()
print(result2.summary())
print(lamb)
#再次检验
DW = sm.stats.durbin_watson(result2.resid)
rho = 1-0.5*DW
print(DW)