【问题标题】:Is there a logit-normal equivalent of to sp.stats.norm.ppf in python? (or other languages...)python中是否有相当于sp.stats.norm.ppf的logit-normal? (或其他语言...)
【发布时间】:2022-01-13 14:19:35
【问题描述】:

如果我想做如下的事情:

# 使用正常的逆 CDF param_values2[:,0] = sp.stats.norm.ppf(param_values2[:,0],0,np.pi/2.)

要将区间 [0,1] 上的样本 (param_values2) 转换为均匀分布,但我想将它们转换为 logit 正态分布,我该怎么做?到目前为止,我在这方面找不到任何有用的东西......其他人的智慧/知识将不胜感激。

【问题讨论】:

标签: python statistics distribution


【解决方案1】:

您可以按照https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.rv_continuous.html 构建自己的发行版。你定义的私有函数越多,分布就越好。至少,您需要定义 _pdf() 和 _argcheck,其他所有内容都将在运行中(慢慢地!)计算。

基本上,如果您提供 _pdf(),则父 pdf() 调用将 jusr 重定向到 _pdf()。如果您提供 _cdf(),则 cdf() 将调用 _cdf()。 但如果没有提供 _ppf() 实现,父类会从 _pdf()、_cdf() 和您提供的所有其他部分为您补上。

示例代码(经过轻微测试!)帮助您入门

import numpy as np
from scipy.stats import rv_continuous
from scipy.special import erf

SQRT2 = np.float64(1.4142135623730951)

def logit(x):
    return np.log(x/(1.0-x))

class logit_norm(rv_continuous):

    def _pdf(self, x, μ, σ):
        if x == 0.0:
            return 0.0
        if x == 1.0:
            return 0.0
        return 1.0 / (σ * np.sqrt(2.0*np.pi)) * np.exp(-0.5 * ((logit(x) - μ)/σ)**2)/x/(1.0-x)

    def _cdf(self, x, μ, σ):
        if x == 0.0:
            return 0.0
        if x == 1.0:
            return 1.0
        return 0.5*(1.0 + erf((logit(x)-μ)/SQRT2/σ))

    def _argcheck(self, μ, σ):
        s = σ > 0.0
        return s

np.random.seed(seed=111)

lgtn = logit_norm(name='logit_norm', a=0.0, b=1.0)
test = lgtn.rvs(μ=2.0,σ=1.0,loc=0.0,scale=1.0, size=100000)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-10
    • 2021-08-10
    • 2012-09-21
    • 2012-08-16
    • 1970-01-01
    • 2012-09-19
    • 2010-10-31
    • 2020-09-06
    相关资源
    最近更新 更多