2015-12-04 1 views
0

J'ai une variable A qui est distribuée Bernoulli, A = pymc.Bernoulli('A', p_A), mais je n'ai pas une valeur dure pour p_A et que vous voulez échantillonner pour cela. Je sais qu'il devrait être petit, donc je veux utiliser une distribution exponentielle p_A = pymc.Exponential('p_A', 10). Cependant, la distribution exponentielle peut renvoyer des valeurs supérieures à 1, ce qui déclencherait une erreur A. Existe-t-il un moyen de limiter la sortie de p_A sans avoir à réimplémenter les distributions Bernoulli ou Exponential dans ma propre fonction @pymc.stochastic -decorated?Mettre des bornes sur les variables stochastiques dans PyMC

+0

Ma première tentative a été d'approcher la distribution exponentielle en utilisant une distribution bêta, 'a = 1',' b> 1'. Vous pouvez également trier approximativement une distribution de Poisson bornée. – Tunisia

Répondre

0

Pour toute autre âmes perdues qui viennent à travers ceci:

Je pense que la meilleure solution pour mes besoins (c'est que j'utilisais seulement la distribution exponentielle parce que les probabilités que je cherchais à générer étaient probablement petites, plutôt que par commodité mathématique) était d'utiliser une fonction bêta à la place .

Pour certain parameter values, il se rapproche de la forme d'une fonction exponentielle (et peut faire la même chose pour les binômes et les normales), mais il est limité à [0 1]. Probablement seulement utile pour faire des choses numériquement, cependant, car j'imagine que c'est une douleur de faire une analyse avec.

3

Vous pouvez utiliser une fonction déterministe pour tronquer la distribution exponentielle. Personnellement, je crois que ce serait mieux si vous utilisez une distribution qui est lié entre 0 et 1, mais pour résoudre exactement votre problème, vous pouvez le faire comme suit:

import pymc as pm 
p_A = pm.Exponential('p_A',10) 

@pm.deterministic 
def p_B(p=p_A): 
    return min(1, p) 

A = pm.Bernoulli('A', p_B) 

model = dict(p_A=p_A, p_B=p_B, A=A) 
S = pm.MCMC(model) 
S.sample(1000) 
p_B_trace = S.trace('p_B')[:]