如何在Python中应用Box-Cox转换?

11

我有以下形式的数据:

X   Y
3.53    0
4.93    50
5.53    60
6.21    70
7.37    80
9.98    90
16.56   100

我想找到n,以便将其适配为以下形式的函数:

enter image description here

我正在尝试通过Box-Cox变换确定n。如何在Python中实现?

4个回答

19

我认为您需要 scipy.stats.boxcox

from scipy import stats
import numpy as np

data = np.fromstring('3.53    0 4.93    50 5.53    60 6.21    70 7.37    80 9.98    90 16.56   100', sep=' ').reshape(7, 2)

stats.boxcox(data[0,])
(array([ 0.91024309,  1.06300488,  1.10938333,  1.15334193,  1.213348  ,
     1.30668122,  1.43178909]), -0.54874593147877893)

4

在Python中进行Box-Cox变换,您需要按照以下步骤操作:

from scipy.stats import boxcox
from scipy.special import inv_boxcox

y =[10,20,30,40,50]
y,fitted_lambda= boxcox(y,lmbda=None)
inv_boxcox(y,fitted_lambda)

scipy.special 包中存在 box-cox 方法,但它需要显式指定 lambda。因此,我使用了来自 scipy.stats 的 box-cox 和来自 special 的 inv_box-cox(因为 scipy.stats 中没有 inv_boxcox 方法)。


3

对于存在零值的情况,采用1+x的Box-Cox变换可能会有所帮助(boxcox1p)。

from scipy.special import boxcox1p
boxcox1p([0.01, 0.1], 0.25)

1

案例1:

这是您的数据框

    X       Y
0   3.53    0
1   4.93    50
2   5.53    60
3   6.21    70
4   7.37    80
5   9.98    90
6   16.56   100

你的数据包含0,因此可以尝试boxcox1p

import pandas as pd
from scipy.special import boxcox1p
df.apply(lambda x: boxcox1p(x,0.25))

输出:

    X           Y
0   1.835587    0.000000
1   2.241999    6.689380
2   2.394230    7.178730
3   2.554564    7.611132
4   2.803640    8.000000
5   3.281328    8.354362
6   4.188250    8.680616

案例二:

如果您的数据不包含0值,则可以使用boxcox进行转换。

    X       Y
0   3.53    10
1   4.93    50
2   5.53    60
3   6.21    70
4   7.37    80
5   9.98    90
6   16.56   100

那么

from scipy import stats
df.apply(lambda x: stats.boxcox(x)[0])

输出:

    X           Y
0   0.910243    16.561988
1   1.063005    157.733998
2   1.109383    202.939104
3   1.153342    251.083555
4   1.213348    301.896331
5   1.306681    355.163289
6   1.431789    410.710034 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接