@@ -43,96 +43,95 @@ logger.setLevel(logging.CRITICAL)
43434444```
454546-This lecture uses Bayesian methods offered by [pymc](https://www.pymc.io/projects/docs/en/stable/) and [numpyro](https://num.pyro.ai/en/stable/) to make statistical inferences about two parameters of a univariate first-order autoregression.
46+This lecture uses Bayesian methods offered by [pymc](https://www.pymc.io/projects/docs/en/stable/) and [numpyro](https://num.pyro.ai/en/stable/) to make statistical inferences about two parameters of a univariate first-order autoregression.
4747484849-The model is a good laboratory for illustrating
49+The model is a good laboratory for illustrating
5050consequences of alternative ways of modeling the distribution of the initial $y_0$:
51515252- As a fixed number
53-53+5454- As a random variable drawn from the stationary distribution of the $\{y_t\}$ stochastic process
5555565657-The first component of statistical model is
57+The first component of the statistical model is
585859-$$
60-y_{t+1} = \rho y_t + \sigma_x \epsilon_{t+1}, \quad t \geq 0
59+$$
60+y_{t+1} = \rho y_t + \sigma_x \epsilon_{t+1}, \quad t \geq 0
6161$$ (eq:themodel)
626263-where the scalars $\rho$ and $\sigma_x$ satisfy $|\rho| < 1$ and $\sigma_x > 0$;
63+where the scalars $\rho$ and $\sigma_x$ satisfy $|\rho| < 1$ and $\sigma_x > 0$;
6464$\{\epsilon_{t+1}\}$ is a sequence of i.i.d. normal random variables with mean $0$ and variance $1$.
65656666The second component of the statistical model is
67676868$$
6969y_0 \sim {\cal N}(\mu_0, \sigma_0^2)
70-$$ (eq:themodel_2)
70+$$ (eq:themodel_2)
7171727273737474Consider a sample $\{y_t\}_{t=0}^T$ governed by this statistical model.
757576-The model
76+The model
7777implies that the likelihood function of $\{y_t\}_{t=0}^T$ can be **factored**:
787879-$$
80-f(y_T, y_{T-1}, \ldots, y_0) = f(y_T| y_{T-1}) f(y_{T-1}| y_{T-2}) \cdots f(y_1 | y_0 ) f(y_0)
79+$$
80+f(y_T, y_{T-1}, \ldots, y_0) = f(y_T| y_{T-1}) f(y_{T-1}| y_{T-2}) \cdots f(y_1 | y_0 ) f(y_0)
8181$$
82828383where we use $f$ to denote a generic probability density.
848485-The statistical model {eq}`eq:themodel`-{eq}`eq:themodel_2` implies
85+The statistical model {eq}`eq:themodel`-{eq}`eq:themodel_2` implies
86868787$$
8888\begin{aligned}
8989f(y_t | y_{t-1}) & \sim {\mathcal N}(\rho y_{t-1}, \sigma_x^2) \\
9090 f(y_0) & \sim {\mathcal N}(\mu_0, \sigma_0^2)
91-\end{aligned}
91+\end{aligned}
9292$$
93939494We want to study how inferences about the unknown parameters $(\rho, \sigma_x)$ depend on what is assumed about the parameters $\mu_0, \sigma_0$ of the distribution of $y_0$.
959596-Below, we study two widely used alternative assumptions:
96+Below, we study two widely used alternative assumptions:
97979898- $(\mu_0,\sigma_0) = (y_0, 0)$ which means that $y_0$ is drawn from the distribution ${\mathcal N}(y_0, 0)$; in effect, we are **conditioning on an observed initial value**.
9999100100- $\mu_0,\sigma_0$ are functions of $\rho, \sigma_x$ because $y_0$ is drawn from the stationary distribution implied by $\rho, \sigma_x$.
101-102101103-102+103+104104**Note:** We do **not** treat a third possible case in which $\mu_0,\sigma_0$ are free parameters to be estimated.
105-106-Unknown parameters are $\rho, \sigma_x$.
105+106+Unknown parameters are $\rho, \sigma_x$.
107107108108We have independent **prior probability distributions** for $\rho, \sigma_x$ and want to compute a posterior probability distribution after observing a sample $\{y_{t}\}_{t=0}^T$.
109109110-The notebook uses `pymc4` and `numpyro` to compute a posterior distribution of $\rho, \sigma_x$.
110+The notebook uses `pymc4` and `numpyro` to compute a posterior distribution of $\rho, \sigma_x$.
111111112112113-Thus, we explore consequences of making these alternative assumptions about the distribution of $y_0$:
113+Thus, we explore consequences of making these alternative assumptions about the distribution of $y_0$:
114114115-- A first procedure is to condition on whatever value of $y_0$ is observed. This amounts to assuming that the probability distribution of the random variable $y_0$ is a Dirac delta function that puts probability one on the observed value of $y_0$.
115+- A first procedure is to condition on whatever value of $y_0$ is observed. This amounts to assuming that the probability distribution of the random variable $y_0$ is a Dirac delta function that puts probability one on the observed value of $y_0$.
116116117-- A second procedure assumes that $y_0$ is drawn from the stationary distribution of a process described by {eq}`eq:themodel`
118- so that $y_0 \sim {\cal N} \left(0, {\sigma_x^2\over (1-\rho)^2} \right) $
117+- A second procedure assumes that $y_0$ is drawn from the stationary distribution of a process described by {eq}`eq:themodel`
118+so that $y_0 \sim {\cal N} \left(0, {\sigma_x^2\over (1-\rho)^2} \right) $
119119120120When the initial value $y_0$ is far out in a tail of the stationary distribution, conditioning on an initial value gives a posterior that is **more accurate** in a sense that we'll explain.
121121122-Basically, when $y_0$ happens to be in a tail of the stationary distribution and we **don't condition on $y_0$**, the likelihood function for $\{y_t\}_{t=0}^T$ adjusts the posterior distribution of the parameter pair $\rho, \sigma_x $ to make the observed value of $y_0$ more likely than it really is under the stationary distribution, thereby adversely twisting the posterior in short samples.
122+Basically, when $y_0$ happens to be in a tail of the stationary distribution and we **don't condition on $y_0$**, the likelihood function for $\{y_t\}_{t=0}^T$ adjusts the posterior distribution of the parameter pair $\rho, \sigma_x $ to make the observed value of $y_0$ more likely than it really is under the stationary distribution, thereby adversely twisting the posterior in short samples.
123123124124An example below shows how not conditioning on $y_0$ adversely shifts the posterior probability distribution of $\rho$ toward larger values.
125125126126127-We begin by solving a **direct problem** that simulates an AR(1) process.
127+We begin by solving a **direct problem** that simulates an AR(1) process.
128128129129How we select the initial value $y_0$ matters.
130130131- * If we think $y_0$ is drawn from the stationary distribution ${\mathcal N}(0, \frac{\sigma_x^{2}}{1-\rho^2})$, then it is a good idea to use this distribution as $f(y_0)$. Why? Because $y_0$ contains information
132- about $\rho, \sigma_x$.
133-131+ * If we think $y_0$ is drawn from the stationary distribution ${\mathcal N}(0, \frac{\sigma_x^{2}}{1-\rho^2})$, then it is a good idea to use this distribution as $f(y_0)$. Why? Because $y_0$ contains information about $\rho, \sigma_x$.
132+134133 * If we suspect that $y_0$ is far in the tails of the stationary distribution -- so that variation in early observations in the sample have a significant **transient component** -- it is better to condition on $y_0$ by setting $f(y_0) = 1$.
135-134+136135137136To illustrate the issue, we'll begin by choosing an initial $y_0$ that is far out in a tail of the stationary distribution.
138137@@ -148,7 +147,7 @@ def ar1_simulate(rho, sigma, y0, T):
148147 y[0] = y0
149148 for t in range(1, T):
150149 y[t] = rho*y[t-1] + eps[t]
151-150+152151 return y
153152154153sigma = 1.
@@ -164,23 +163,23 @@ plt.plot(y)
164163plt.tight_layout()
165164```
166165167-Now we shall use Bayes' law to construct a posterior distribution, conditioning on the initial value of $y_0$.
166+Now we shall use Bayes' law to construct a posterior distribution, conditioning on the initial value of $y_0$.
168167169168(Later we'll assume that $y_0$ is drawn from the stationary distribution, but not now.)
170169171170First we'll use **pymc4**.
172171173172## PyMC Implementation
174173175-For a normal distribution in `pymc`,
174+For a normal distribution in `pymc`,
176175$var = 1/\tau = \sigma^{2}$.
177176178177```{code-cell} ipython3
179178180179AR1_model = pmc.Model()
181180182181with AR1_model:
183-182+184183 # Start with priors
185184 rho = pmc.Uniform('rho', lower=-1., upper=1.) # Assume stable rho
186185 sigma = pmc.HalfNormal('sigma', sigma = np.sqrt(10))
@@ -204,31 +203,31 @@ with AR1_model:
204203 az.plot_trace(trace, figsize=(17,6))
205204```
206205207-Evidently, the posteriors aren't centered on the true values of $.5, 1$ that we used to generate the data.
206+Evidently, the posteriors aren't centered on the true values of $.5, 1$ that we used to generate the data.
208207209-This is is a symptom of the classic **Hurwicz bias** for first order autorgressive processes (see Leonid Hurwicz {cite}`hurwicz1950least`.)
208+This is a symptom of the classic **Hurwicz bias** for first order autoregressive processes (see Leonid Hurwicz {cite}`hurwicz1950least`.)
210209211-The Hurwicz bias is worse the smaller is the sample (see {cite}`Orcutt_Winokur_69`.)
210+The Hurwicz bias is worse the smaller is the sample (see {cite}`Orcutt_Winokur_69`).
212211213212214213Be that as it may, here is more information about the posterior.
215214216215```{code-cell} ipython3
217216with AR1_model:
218217 summary = az.summary(trace, round_to=4)
219-218+220219summary
221220```
222221223222Now we shall compute a posterior distribution after seeing the same data but instead assuming that $y_0$ is drawn from the stationary distribution.
224223225-This means that
224+This means that
226225227226$$
228227y_0 \sim N \left(0, \frac{\sigma_x^{2}}{1 - \rho^{2}} \right)
229228$$
230229231-We alter the code as follows:
230+We alter the code as follows:
232231233232```{code-cell} ipython3
234233AR1_model_y0 = pmc.Model()
@@ -238,10 +237,10 @@ with AR1_model_y0:
238237 # Start with priors
239238 rho = pmc.Uniform('rho', lower=-1., upper=1.) # Assume stable rho
240239 sigma = pmc.HalfNormal('sigma', sigma=np.sqrt(10))
241-240+242241 # Standard deviation of ergodic y
243242 y_sd = sigma / np.sqrt(1 - rho**2)
244-243+245244 # yhat
246245 yhat = rho * y[:-1]
247246 y_data = pmc.Normal('y_obs', mu=yhat, sigma=sigma, observed=y[1:])
@@ -265,7 +264,7 @@ with AR1_model_y0:
265264```{code-cell} ipython3
266265with AR1_model:
267266 summary_y0 = az.summary(trace_y0, round_to=4)
268-267+269268summary_y0
270269```
271270@@ -278,7 +277,7 @@ that make observations more likely.
278277279278We'll return to this issue after we use `numpyro` to compute posteriors under our two alternative assumptions about the distribution of $y_0$.
280279281-We'll now repeat the calculations using `numpyro`.
280+We'll now repeat the calculations using `numpyro`.
282281283282## Numpyro Implementation
284283@@ -319,10 +318,10 @@ def AR1_model(data):
319318320319 # Expected value of y at the next period (rho * y)
321320 yhat = rho * data[:-1]
322-321+323322 # Likelihood of the actual realization.
324323 y_data = numpyro.sample('y_obs', dist.Normal(loc=yhat, scale=sigma), obs=data[1:])
325-324+326325```
327326328327```{code-cell} ipython3
@@ -347,7 +346,7 @@ plot_posterior(mcmc.get_samples())
347346mcmc.print_summary()
348347```
349348350-Next, we again compute the posterior under the assumption that $y_0$ is drawn from the stationary distribution, so that
349+Next, we again compute the posterior under the assumption that $y_0$ is drawn from the stationary distribution, so that
351350352351$$
353352y_0 \sim N \left(0, \frac{\sigma_x^{2}}{1 - \rho^{2}} \right)
@@ -366,7 +365,7 @@ def AR1_model_y0(data):
366365367366 # Expected value of y at the next period (rho * y)
368367 yhat = rho * data[:-1]
369-368+370369 # Likelihood of the actual realization.
371370 y_data = numpyro.sample('y_obs', dist.Normal(loc=yhat, scale=sigma), obs=data[1:])
372371 y0_data = numpyro.sample('y0_obs', dist.Normal(loc=0., scale=y_sd), obs=data[0])
@@ -402,4 +401,3 @@ is telling `numpyro` to explain what it interprets as "explosive" observations
402401Bayes' Law is able to generate a plausible likelihood for the first observation by driving $\rho \rightarrow 1$ and $\sigma \uparrow$ in order to raise the variance of the stationary distribution.
403402404403Our example illustrates the importance of what you assume about the distribution of initial conditions.
405-