NN_POST_UPDATE
This function performs conjugate updating for a Normal likelihood with known observation variance and a Normal prior on the mean. It returns posterior mean and posterior variance for the unknown mean parameter.
If the prior is \mu \sim \mathcal{N}(\mu_0, \sigma_0^2) and the sample mean is \bar{x} from n observations with known variance \sigma^2, then:
\sigma_n^2 = \left(\frac{1}{\sigma_0^2} + \frac{n}{\sigma^2}\right)^{-1}, \qquad \mu_n = \sigma_n^2\left(\frac{\mu_0}{\sigma_0^2} + \frac{n\bar{x}}{\sigma^2}\right)
Excel Usage
=NN_POST_UPDATE(mu_prior, var_prior, sample_mean, known_var, sample_size)
mu_prior(float, required): Prior mean for the unknown normal mean parameter.var_prior(float, required): Prior variance for the unknown mean parameter (positive).sample_mean(float, required): Observed sample mean.known_var(float, required): Known observation variance (positive).sample_size(int, required): Number of observations used to compute sample mean (nonnegative).
Returns (list[list]): 2D array containing posterior mean/variance and precision summaries.
Example 1: Posterior mean shrinks between prior mean and sample mean
Inputs:
| mu_prior | var_prior | sample_mean | known_var | sample_size |
|---|---|---|---|---|
| 0 | 4 | 1.2 | 1 | 10 |
Excel formula:
=NN_POST_UPDATE(0, 4, 1.2, 1, 10)
Expected output:
| Result | |
|---|---|
| 1.17073 | 0.097561 |
| 10.25 | 10 |
Example 2: Strong prior influence with small sample size
Inputs:
| mu_prior | var_prior | sample_mean | known_var | sample_size |
|---|---|---|---|---|
| 2 | 0.5 | 5 | 4 | 3 |
Excel formula:
=NN_POST_UPDATE(2, 0.5, 5, 4, 3)
Expected output:
| Result | |
|---|---|
| 2.81818 | 0.363636 |
| 2.75 | 0.75 |
Example 3: Weak prior and large sample produce data-dominant posterior
Inputs:
| mu_prior | var_prior | sample_mean | known_var | sample_size |
|---|---|---|---|---|
| -1 | 10 | 0.2 | 2 | 50 |
Excel formula:
=NN_POST_UPDATE(-1, 10, 0.2, 2, 50)
Expected output:
| Result | |
|---|---|
| 0.195219 | 0.0398406 |
| 25.1 | 25 |
Example 4: Zero sample size returns prior-driven posterior
Inputs:
| mu_prior | var_prior | sample_mean | known_var | sample_size |
|---|---|---|---|---|
| 1.5 | 3 | 4 | 2 | 0 |
Excel formula:
=NN_POST_UPDATE(1.5, 3, 4, 2, 0)
Expected output:
| Result | |
|---|---|
| 1.5 | 3 |
| 0.333333 | 0 |
Python Code
pass
def nn_post_update(mu_prior, var_prior, sample_mean, known_var, sample_size):
"""
Update Normal posterior parameters for unknown mean with known variance.
See: https://en.wikipedia.org/wiki/Conjugate_prior#Continuous_distributions
This example function is provided as-is without any representation of accuracy.
Args:
mu_prior (float): Prior mean for the unknown normal mean parameter.
var_prior (float): Prior variance for the unknown mean parameter (positive).
sample_mean (float): Observed sample mean.
known_var (float): Known observation variance (positive).
sample_size (int): Number of observations used to compute sample mean (nonnegative).
Returns:
list[list]: 2D array containing posterior mean/variance and precision summaries.
"""
try:
mu_prior = float(mu_prior)
var_prior = float(var_prior)
sample_mean = float(sample_mean)
known_var = float(known_var)
sample_size = int(sample_size)
if var_prior <= 0 or known_var <= 0:
return "Error: var_prior and known_var must be positive"
if sample_size < 0:
return "Error: sample_size must be nonnegative"
prior_precision = 1.0 / var_prior
data_precision = sample_size / known_var
post_precision = prior_precision + data_precision
var_post = 1.0 / post_precision
mu_post = (prior_precision * mu_prior + data_precision * sample_mean) / post_precision
return [[mu_post, var_post], [post_precision, data_precision]]
except Exception as e:
return f"Error: {str(e)}"