编辑: 已经弄清了分布情况。大部分情况下,我已经成功了,除了当形状参数为负数时。PDF应该适用于负形状值但在子类化分布上不起作用。
我正在尝试使用scipy stats创建一个倾斜正态分布。现在我只需要PDF。
我子类化了rv_continuous
,但是当我使用skew_norm.pdf(x, shape)
时,我得到了一个NaN数组。
这是我的类:
class skew_norm_gen(rv_continuous):
def _pdf(self, x, s):
return 2 * norm.pdf(x) * norm.cdf(x * s)
skew_norm = skew_norm_gen(name='skew_norm', shapes='s')
我尝试直接计算PDF(在类外部)并且它起作用。
另外,如果我添加 *args* ,我能像普通分布的PDF norm.pdf(x, loc=mu, scale=std)
一样传递位置和比例吗?
class skew_norm_gen(rv_continuous):
def _pdf(self, x, s, *args):
return 2 * norm.pdf(x, *args) * norm.cdf(x * s, *args)
skew_norm = skew_norm_gen(name='skew_norm', shapes='s')
谢谢。
编辑:
我也尝试了一个简单的例子,感谢CT Zhu的建议。下面的代码有时会生成nan数组,有时会生成值的数组。
In [26]:
import scipy.stats as ss
class skew_norm_gen(ss.rv_continuous):
def _pdf(self, x, s):
return 2 * ss.norm.pdf(x) * ss.norm.cdf(x * s)
skew_norm = skew_norm_gen(name='skew_norm', shapes='s')
In [27]:
data = ss.norm.rvs(0, size=100)
s = ss.skew(data)
skew_norm.pdf(data, s)
Out[28]:
array([ nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
nan])
EDIT 2:
如果形状参数小于0,则PDF输出NaN。
我可以直接计算偏态正态分布的PDF,结果很好。但如果尝试使用子类PDF,则会返回NaN。
_argcheck
方法即可。否则,它会认为负偏斜参数无效,并在所有地方放置默认的badvalue
nan
,请参见编辑。 - CT Zhu