Function Repository Resource:

CompleteConditionalDistribution

Source Notebook

Compute the complete conditional distribution of a variable in a statistical model

Contributed by: Christopher Wolfram, Aaron Schein, Nihar Mauskar and Ankur Garg

ResourceFunction["CompleteConditionalDistribution"][{Distributed[v1,dist1],Distributed[v2,dist2],},vi]

gives the distribution of vi conditional on v1,v2,.

Details and Options

CompleteConditionalDistribution supports Assumptions as an option.
CompleteConditionalDistribution works by constructing the log pdf of the conditional distribution and then grouping like terms to attempt to find a conjugate relationship (i.e., where the conditional distribution of vi is in the same family as its prior distribution).
CompleteConditionalDistribution first attempts to find a conjugate relationship (where the prior distribution of v is in the same family as the posterior). If it does not find a conjugate relationship, it returns a ProbabilityDistribution object.
See the usage for Distributed for more on .

Examples

Basic Examples (5) 

Compute the conditional probability of a beta-distributed variable:

In[1]:=
ResourceFunction[
 "CompleteConditionalDistribution"][{p \[Distributed] BetaDistribution[\[Alpha], \[Beta]], x \[Distributed] BinomialDistribution[n, p]}, p]
Out[1]=

Derive the formula for gamma-Poisson conjugacy:

In[2]:=
Simplify@ResourceFunction["CompleteConditionalDistribution"][{
   \[Lambda] \[Distributed] GammaDistribution[\[Alpha], \[Beta]],
   x \[Distributed] PoissonDistribution[\[Lambda]]
   },
  \[Lambda]
  ]
Out[2]=

Add a constant multiplier:

In[3]:=
Simplify@ResourceFunction["CompleteConditionalDistribution"][{
   \[Lambda] \[Distributed] GammaDistribution[\[Alpha], \[Beta]],
   x \[Distributed] PoissonDistribution[\[Lambda]*c]
   },
  \[Lambda]
  ]
Out[3]=

Compute a conditional distribution that is not a named distribution:

In[4]:=
\[ScriptCapitalD] = ResourceFunction["CompleteConditionalDistribution"][{
   x \[Distributed] PoissonDistribution[\[Lambda]],
   y \[Distributed] GammaDistribution[x, \[Beta]]
   },
  x,
  Assumptions -> y > 0
  ]
Out[4]=

Compute properties of the resulting distribution:

In[5]:=
Mean[\[ScriptCapitalD]]
Out[5]=
In[6]:=
FullSimplify@Variance[\[ScriptCapitalD]]
Out[6]=

Derive the formula for normal-normal conjugacy:

In[7]:=
Simplify@ResourceFunction["CompleteConditionalDistribution"][{
   \[Mu] \[Distributed] NormalDistribution[\[Mu]1, \[Sigma]1],
   x \[Distributed] NormalDistribution[\[Mu], \[Sigma]]
   },
  \[Mu]
  ]
Out[7]=

Derive the formula for normal-inverse gamma conjugacy:

In[8]:=
Simplify@ResourceFunction["CompleteConditionalDistribution"][{
   \[Sigma]2 \[Distributed] InverseGammaDistribution[\[Alpha], \[Beta]],
   x \[Distributed] NormalDistribution[\[Mu], Sqrt[\[Sigma]2]]
   },
  \[Sigma]2
  ]
Out[8]=

Compute multiple conjugate relationships for one model:

In[9]:=
model = {
   \[Mu] \[Distributed] NormalDistribution[\[Mu]1, \[Sigma]1],
   \[Sigma]2 \[Distributed] InverseGammaDistribution[\[Alpha], \[Beta]],
   x \[Distributed] NormalDistribution[m \[Mu] + b, Sqrt[\[Sigma]2]]
   };
In[10]:=
Simplify@
 ResourceFunction["CompleteConditionalDistribution"][model, \[Mu]]
Out[10]=
In[11]:=
Simplify@
 ResourceFunction["CompleteConditionalDistribution"][model, \[Sigma]2]
Out[11]=

Scope (3) 

Derive an update for a beta-binomial model based on multiple observed values:

In[12]:=
ResourceFunction["CompleteConditionalDistribution"][{
  p \[Distributed] BetaDistribution[\[Alpha], \[Beta]],
  Table[Indexed[x, i] \[Distributed] BinomialDistribution[n, p], {i, 5}]
  },
 p
 ]
Out[12]=

Derive an update for a normal-normal model based on multiple observed values:

In[13]:=
Simplify@ResourceFunction["CompleteConditionalDistribution"][{
   \[Mu] \[Distributed] NormalDistribution[\[Mu]0, \[Sigma]0],
   Table[
    Indexed[x, i] \[Distributed] NormalDistribution[\[Mu], \[Sigma]], {i, 5}]
   },
  \[Mu]
  ]
Out[13]=

Derive an update for a gamma-Poisson model based on multiple observed values:

In[14]:=
Simplify@ResourceFunction["CompleteConditionalDistribution"][{
   \[Lambda] \[Distributed] GammaDistribution[\[Alpha], \[Beta]],
   Table[
    Indexed[x, i] \[Distributed] PoissonDistribution[\[Lambda]*c], {i,
      5}]
   },
  \[Lambda]
  ]
Out[14]=

Applications (1) 

Derive gamma-gamma conjugacy:

In[15]:=
Simplify@ResourceFunction["CompleteConditionalDistribution"][{
   \[Beta] \[Distributed] GammaDistribution[\[Alpha]0, 1/\[Beta]0],
   x \[Distributed] GammaDistribution[\[Alpha], 1/\[Beta]]
   },
  \[Beta]
  ]
Out[15]=

Publisher

Christopher Wolfram

Requirements

Wolfram Language 14.0 (January 2024) or above

Version History

  • 1.0.0 – 09 July 2025

Related Resources

License Information