box-cox变换是统计建模中的一项常用变换。即方差稳定变换。用于连续的因变量不满足正态分布的情况。
先说一下泊松分布:
泊松分布是一种重尾分布,它的方差等于均值。因此均值越大,方差就越大,重尾程度就越大,,box-cox可以改变变量的分布,使得方差不再依赖于均值。
例如:
假设随机变量X符合泊松分布,如果通过他的平方根对它进行变换,则X’ =根号x 的方差就接近于一个常数,而不与均值相等。
box-cox的变换一般形式为:
在这里插入图片描述
式中在这里插入图片描述
为经Box-Cox变换后得到的新变量,y为原始连续因变量,在这里插入图片描述
为变换参数。以上变换要求原始变量y取值为正,**若取值为负时,可先对所有原始数据同加一个常数a使其y+a为正值,然后再进行以上的变换。**对不同的在这里插入图片描述
所作的变换不同。它包括了平方变换(在这里插入图片描述
),平方根变换(在这里插入图片描述
),对数变换(在这里插入图片描述

)和倒数变换(在这里插入图片描述
)等常用变换。所以Box-Cox变换是一族变换。Box-Cox变换中参数的估计有两种方法:(1)最大似然估计;(2)Bayes方法。通过求解值,就可以确定具体采用哪种变换形式。关于求解值的详细公式推导,大家可以自行查阅相关资料。

#定义lambda
from scipy import stats
import numpy as np
import matplotlab.pyplot as plt
lambdas = np.arange(-1,2,5,0,5)
lambdas
#定义因变量
x= np.arange(0,0.01,10,0.1).round(2)
#输出不同的lambda下的曲线
#定以曲线颜色
C=['red','blue','green','black','yellow','orange','pink']
#创建画布
fig = plt.figure(figsize=(10,10))
#使用axisartist.Subplot方法创建一个绘图区对象ax
ax = axisartist.Subplot(fig, 111)  
#将绘图区对象添加到画布中
fig.add_axes(ax)
ax.axis[:].set_visible(False)#通过set_visible方法设置绘图区所有坐标轴隐藏
ax.axis["x"] = ax.new_floating_axis(0,0)#ax.new_floating_axis代表添加新的坐标轴
ax.axis["x"].set_axisline_style("->", size = 1.0)#给x坐标轴加上箭头
#添加y坐标轴,且加上箭头
ax.axis["y"] = ax.new_floating_axis(1,0)
ax.axis["y"].set_axisline_style("-|>", size = 1.0)
#设置x、y轴上刻度显示方向
ax.axis["x"].set_axis_direction("top")
ax.axis["y"].set_axis_direction("right")
 
for i in range(len(lambdas)):
    Y=stats.boxcox(X,lmbda=lambdas[i])
    plt.plot(X,Y, c=C[i],label='lambda=%s'%(lambdas[i]))
    plt.legend()
plt.xlim(-1,10)
plt.ylim(-10,10)
plt.hlines(1,0,10,linestyles='dotted')
plt.legend(loc='upper right')
plt.show()

在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐