基于Python回归模型的BOX-COX变换和强影响点分析

本文主要是回归模型的BOX-COX变换消除异方差和自相关性的影响以及强影响点的分析

 

目录

一、BOX-COX变换

1、原理

2、BOX-COX消除异方差性

3、BOX-COX消除自相关性

二、强影响点分析

总结:

完整代码如下:


一、BOX-COX变换

1、原理

                        图一                                                图二

 图一是y值大于0情况下的变换,图二是y小于0情况下的变换。通过这种变换寻找到一个最佳的\lambda值,然后通过\lambda值对y值进行变换。\lambda的值计算如下:

 通过这个式子去寻找最大的\lambda值,一般这个过程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是\lambda的值。

再建模和异方差性的分析,如下:

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,则存在异常值,否则就无异常值。判断出异常值后,就需要按照我前面的文章中异常的分析进行处理,如下:

基于Python回归模型的自相关性分析_数据小师弟的博客-CSDN博客_python自相关性检验

基于Python回归模型的异方差性分析_数据小师弟的博客-CSDN博客_python 回归方差

这只是其中的两种处理方法。

代码如下:

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)

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

瑶瑶瑶领先

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值