NIG_POST_UPDATE
This function performs conjugate updating for a Normal likelihood with unknown mean and unknown variance using a Normal-Inverse-Gamma prior. It returns the posterior hyperparameters that define the updated joint prior for mean and variance.
With prior (\mu_0, \kappa_0, \alpha_0, \beta_0) and sample summaries (n, \bar{x}, s^2), the posterior updates are:
\kappa_n = \kappa_0 + n, \quad \mu_n = \frac{\kappa_0\mu_0 + n\bar{x}}{\kappa_n}, \quad \alpha_n = \alpha_0 + \frac{n}{2}
\beta_n = \beta_0 + \frac{1}{2}(n-1)s^2 + \frac{\kappa_0 n (\bar{x}-\mu_0)^2}{2\kappa_n}
Excel Usage
=NIG_POST_UPDATE(mu_prior, kappa_prior, alpha_prior, beta_prior, sample_size, sample_mean, sample_var)
mu_prior(float, required): Prior location hyperparameter for the mean.kappa_prior(float, required): Prior mean-strength hyperparameter (positive).alpha_prior(float, required): Prior inverse-gamma shape hyperparameter (positive).beta_prior(float, required): Prior inverse-gamma scale hyperparameter (positive).sample_size(int, required): Number of observations summarized by sample statistics (nonnegative).sample_mean(float, required): Observed sample mean.sample_var(float, required): Observed sample variance using denominator n-1 (nonnegative).
Returns (list[list]): 2D array containing posterior Normal-Inverse-Gamma hyperparameters.
Example 1: Posterior update from moderate sample summary
Inputs:
| mu_prior | kappa_prior | alpha_prior | beta_prior | sample_size | sample_mean | sample_var |
|---|---|---|---|---|---|---|
| 0 | 2 | 3 | 4 | 12 | 1.5 | 2.4 |
Excel formula:
=NIG_POST_UPDATE(0, 2, 3, 4, 12, 1.5, 2.4)
Expected output:
| Result | |
|---|---|
| 1.28571 | 14 |
| 9 | 19.1286 |
Example 2: Small sample with informative prior
Inputs:
| mu_prior | kappa_prior | alpha_prior | beta_prior | sample_size | sample_mean | sample_var |
|---|---|---|---|---|---|---|
| 5 | 10 | 6 | 8 | 3 | 4.6 | 1.2 |
Excel formula:
=NIG_POST_UPDATE(5, 10, 6, 8, 3, 4.6, 1.2)
Expected output:
| Result | |
|---|---|
| 4.90769 | 13 |
| 7.5 | 9.38462 |
Example 3: Large sample with weak prior information
Inputs:
| mu_prior | kappa_prior | alpha_prior | beta_prior | sample_size | sample_mean | sample_var |
|---|---|---|---|---|---|---|
| -2 | 1 | 2 | 2 | 60 | -1.1 | 0.9 |
Excel formula:
=NIG_POST_UPDATE(-2, 1, 2, 2, 60, -1.1, 0.9)
Expected output:
| Result | |
|---|---|
| -1.11475 | 61 |
| 32 | 28.9484 |
Example 4: Zero sample size preserves prior hyperparameters
Inputs:
| mu_prior | kappa_prior | alpha_prior | beta_prior | sample_size | sample_mean | sample_var |
|---|---|---|---|---|---|---|
| 1 | 3 | 4 | 5 | 0 | 2.5 | 1.8 |
Excel formula:
=NIG_POST_UPDATE(1, 3, 4, 5, 0, 2.5, 1.8)
Expected output:
| Result | |
|---|---|
| 1 | 3 |
| 4 | 5 |
Python Code
pass
def nig_post_update(mu_prior, kappa_prior, alpha_prior, beta_prior, sample_size, sample_mean, sample_var):
"""
Update Normal-Inverse-Gamma posterior hyperparameters from sample summaries.
See: https://en.wikipedia.org/wiki/Normal-inverse-gamma_distribution
This example function is provided as-is without any representation of accuracy.
Args:
mu_prior (float): Prior location hyperparameter for the mean.
kappa_prior (float): Prior mean-strength hyperparameter (positive).
alpha_prior (float): Prior inverse-gamma shape hyperparameter (positive).
beta_prior (float): Prior inverse-gamma scale hyperparameter (positive).
sample_size (int): Number of observations summarized by sample statistics (nonnegative).
sample_mean (float): Observed sample mean.
sample_var (float): Observed sample variance using denominator n-1 (nonnegative).
Returns:
list[list]: 2D array containing posterior Normal-Inverse-Gamma hyperparameters.
"""
try:
mu_prior = float(mu_prior)
kappa_prior = float(kappa_prior)
alpha_prior = float(alpha_prior)
beta_prior = float(beta_prior)
sample_size = int(sample_size)
sample_mean = float(sample_mean)
sample_var = float(sample_var)
if kappa_prior <= 0 or alpha_prior <= 0 or beta_prior <= 0:
return "Error: kappa_prior, alpha_prior, and beta_prior must be positive"
if sample_size < 0:
return "Error: sample_size must be nonnegative"
if sample_var < 0:
return "Error: sample_var must be nonnegative"
kappa_post = kappa_prior + sample_size
mu_post = (kappa_prior * mu_prior + sample_size * sample_mean) / kappa_post
alpha_post = alpha_prior + 0.5 * sample_size
scatter_term = 0.5 * max(sample_size - 1, 0) * sample_var
mean_shift_term = 0.5 * (kappa_prior * sample_size / kappa_post) * ((sample_mean - mu_prior) ** 2)
beta_post = beta_prior + scatter_term + mean_shift_term
return [[mu_post, kappa_post], [alpha_post, beta_post]]
except Exception as e:
return f"Error: {str(e)}"