如何在Python中使用零偏斜度日志转换



如何在Python中进行零偏态日志转换?

例如,在Stata中,它在lnskew0中实现(请参见https://www.stata.com/manuals13/rlnskew0.pdf)。

我没有在Python中找到实现。有人知道实施吗?

否则,第一次尝试是:

from scipy.stats import skew
import numpy as np
from scipy.optimize import root_scalar

def lnskew0(x):
def skew_ln(k):
return skew(np.log(x - k))
res = root_scalar(
skew_ln,
bracket=[-x.min(), x.max()*0.99999],
method='bisect'
)
return np.log(x - res.root)

在只有正数的numpy阵列上运行良好。Stata的lnskew0是如何实现的,它也适用于负数?

我又尝试了一次,这样它也能处理负数:

from scipy.stats import skew
import numpy as np
from scipy.optimize import root_scalar

def lnskew0(x):
x0 = x + 1
def skew_ln_pos(k):
with np.errstate(all='ignore'):
return skew(np.log(x0 - k))
res_pos = root_scalar(
skew_ln_pos,
bracket=[-150, 150],
method='bisect'
)
def skew_ln_neg(k):
with np.errstate(all='ignore'):
return skew(np.log(-x0 - k))
res_neg = root_scalar(
skew_ln_neg,
bracket=[-150, 150],
method='bisect'
)
res = (res_pos.root - 1, res_neg.root + 1)
lnskew0_res = (
np.log(x - res[0]),
np.log(-x - res[1])
)
whichmin = np.nanargmin([abs(skew(x)) for x in lnskew0_res])
return lnskew0_res[whichmin]

注意:它仍然有一个问题。root_scalar的括号需要手动选择。

相关内容

  • 没有找到相关文章

最新更新