From c814e4e308f0b4d1887feacb6b3345d03df69b2c Mon Sep 17 00:00:00 2001 From: Longye Tian <133612246+longye-tian@users.noreply.github.com> Date: Fri, 26 Jul 2024 16:29:24 +1000 Subject: [PATCH 01/17] [lp_intro]Update lp (#531) * explain iso-revenue lines * add comma in the numbers * Update lectures/lp_intro.md Co-authored-by: Matt McKay --------- Co-authored-by: Matt McKay --- lectures/lp_intro.md | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/lectures/lp_intro.md b/lectures/lp_intro.md index 27c8093f..e314e6e1 100644 --- a/lectures/lp_intro.md +++ b/lectures/lp_intro.md @@ -91,6 +91,8 @@ $$ The following graph illustrates the firm's constraints and iso-revenue lines. +Iso-revenue lines show all the combinations of materials and labor that produce the same revenue. + ```{code-cell} ipython3 --- tags: [hide-input] @@ -335,7 +337,7 @@ OR-Tools tells us that the best investment strategy is: 3. At the beginning of the third year, the bank balance should be $ \$75,072.245 $. -4. At the end of the third year, the mutual fund will get payouts from the annuity and corporate bond and repay its loan from the bank. At the end it will own $ \$141018.24 $, so that it's total net rate of return over the three periods is $ 41.02\%$. +4. At the end of the third year, the mutual fund will get payouts from the annuity and corporate bond and repay its loan from the bank. At the end it will own $ \$141,018.24 $, so that it's total net rate of return over the three periods is $ 41.02\%$. @@ -542,14 +544,14 @@ c_ex2 = np.array([1.30*3, 0, 0, 1.06, 1.30]) A_ex2 = np.array([[1, 1, 0, 0, 0], [1, -rate, 1, 0, 1], [1, 0, -rate, 1, 0]]) -b_ex2 = np.array([100000, 0, 0]) +b_ex2 = np.array([100_000, 0, 0]) # Bounds on decision variables bounds_ex2 = [( 0, None), - (-20000, None), - (-20000, None), - (-20000, None), - ( 0, 50000)] + (-20_000, None), + (-20_000, None), + (-20_000, None), + ( 0, 50_000)] ``` Let's solve the problem and check the status using `success` attribute. @@ -581,7 +583,7 @@ SciPy tells us that the best investment strategy is: 3. At the beginning of the third year, the mutual fund should borrow $ \$20,000$ from the bank and invest in the annuity. -4. At the end of the third year, the mutual fund will get payouts from the annuity and corporate bond and repay its loan from the bank. At the end it will own $ \$141018.24 $, so that it's total net rate of return over the three periods is $ 41.02\% $. +4. At the end of the third year, the mutual fund will get payouts from the annuity and corporate bond and repay its loan from the bank. At the end it will own $ \$141,018.24 $, so that it's total net rate of return over the three periods is $ 41.02\% $. From f5f71615b8f60b7c562100d6313147cfed9c26e5 Mon Sep 17 00:00:00 2001 From: JingkunZhao <155940781+SylviaZhaooo@users.noreply.github.com> Date: Fri, 26 Jul 2024 16:29:59 +1000 Subject: [PATCH 02/17] [solow] Update unfinished suggestions (#511) * [solow] Update unfinished suggestions * Update lectures/solow.md * Revise context --------- Co-authored-by: Matt McKay --- lectures/solow.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lectures/solow.md b/lectures/solow.md index 484f7664..0a5160b0 100644 --- a/lectures/solow.md +++ b/lectures/solow.md @@ -55,9 +55,11 @@ $$ Production functions with this property include * the **Cobb-Douglas** function $F(K, L) = A K^{\alpha} - L^{1-\alpha}$ with $0 \leq \alpha \leq 1$ and + L^{1-\alpha}$ with $0 \leq \alpha \leq 1$. * the **CES** function $F(K, L) = \left\{ a K^\rho + b L^\rho \right\}^{1/\rho}$ - with $a, b, \rho > 0$. + with $a, b, \rho > 0$. + +Here, $\alpha$ is the output elasticity of capital and $\rho$ is a parameter that determines the elasticity of substitution between capital and labor. We assume a closed economy, so aggregate domestic investment equals aggregate domestic saving. @@ -81,6 +83,7 @@ Setting $k_t := K_t / L$ and using homogeneity of degree one now yields $$ k_{t+1} + = s \frac{F(K_t, L)}{L} + (1 - \delta) \frac{K_t}{L} = s \frac{F(K_t, L)}{L} + (1 - \delta) k_t = s F(k_t, 1) + (1 - \delta) k_t $$ From a82fdf6e63c503e8c1267cf9e3694ff85001f655 Mon Sep 17 00:00:00 2001 From: Shu Hu Date: Fri, 26 Jul 2024 16:36:31 +1000 Subject: [PATCH 03/17] [lp_intro] add an admonition (#537) * [lp_intro] add an admonition * edits * Update lectures/lp_intro.md Co-authored-by: Matt McKay * Update lectures/lp_intro.md --------- Co-authored-by: Matt McKay --- lectures/lp_intro.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lectures/lp_intro.md b/lectures/lp_intro.md index e314e6e1..102ad4fd 100644 --- a/lectures/lp_intro.md +++ b/lectures/lp_intro.md @@ -40,6 +40,11 @@ We provide a standard form of a linear program and methods to transform other fo We tell how to solve a linear programming problem using [SciPy](https://scipy.org/) and [Google OR-Tools](https://developers.google.com/optimization). +```{seealso} +In another lecture, we will employ the linear programming method to solve the +{doc}`optimal transport problem `. +``` + Let's start with some standard imports. ```{code-cell} ipython3 From 21a6894f90053f0ee074b7b07de76c845f07904e Mon Sep 17 00:00:00 2001 From: John Stachurski Date: Thu, 1 Aug 2024 12:39:16 +1000 Subject: [PATCH 04/17] Misc edits to prob lecture (#539) * Misc edits to prob lecture * fix variable name and minor formatting update * add explanation for infinite support --------- Co-authored-by: mmcky --- lectures/prob_dist.md | 223 +++++++++++++++++++++++++----------------- 1 file changed, 133 insertions(+), 90 deletions(-) diff --git a/lectures/prob_dist.md b/lectures/prob_dist.md index 09174da3..5bfa6200 100644 --- a/lectures/prob_dist.md +++ b/lectures/prob_dist.md @@ -46,18 +46,22 @@ Let's start with discrete distributions. A discrete distribution is defined by a set of numbers $S = \{x_1, \ldots, x_n\}$ and a **probability mass function** (PMF) on $S$, which is a function $p$ from $S$ to $[0,1]$ with the property -$$ \sum_{i=1}^n p(x_i) = 1 $$ +$$ +\sum_{i=1}^n p(x_i) = 1 +$$ We say that a random variable $X$ **has distribution** $p$ if $X$ takes value $x_i$ with probability $p(x_i)$. That is, -$$ \mathbb P\{X = x_i\} = p(x_i) \quad \text{for } i= 1, \ldots, n $$ +$$ +\mathbb P\{X = x_i\} = p(x_i) \quad \text{for } i= 1, \ldots, n +$$ The **mean** or **expected value** of a random variable $X$ with distribution $p$ is $$ - \mathbb{E}[X] = \sum_{i=1}^n x_i p(x_i) +\mathbb{E}[X] = \sum_{i=1}^n x_i p(x_i) $$ Expectation is also called the *first moment* of the distribution. @@ -67,7 +71,7 @@ We also refer to this number as the mean of the distribution (represented by) $p The **variance** of $X$ is defined as $$ - \mathbb{V}[X] = \sum_{i=1}^n (x_i - \mathbb{E}[X])^2 p(x_i) +\mathbb{V}[X] = \sum_{i=1}^n (x_i - \mathbb{E}[X])^2 p(x_i) $$ Variance is also called the *second central moment* of the distribution. @@ -75,8 +79,8 @@ Variance is also called the *second central moment* of the distribution. The **cumulative distribution function** (CDF) of $X$ is defined by $$ - F(x) = \mathbb{P}\{X \leq x\} - = \sum_{i=1}^n \mathbb 1\{x_i \leq x\} p(x_i) +F(x) = \mathbb{P}\{X \leq x\} + = \sum_{i=1}^n \mathbb 1\{x_i \leq x\} p(x_i) $$ Here $\mathbb 1\{ \textrm{statement} \} = 1$ if "statement" is true and zero otherwise. @@ -115,7 +119,6 @@ u.pmf(1) u.pmf(2) ``` - Here's a plot of the probability mass function: ```{code-cell} ipython3 @@ -129,7 +132,6 @@ ax.set_ylabel('PMF') plt.show() ``` - Here's a plot of the CDF: ```{code-cell} ipython3 @@ -143,10 +145,8 @@ ax.set_ylabel('CDF') plt.show() ``` - The CDF jumps up by $p(x_i)$ at $x_i$. - ```{exercise} :label: prob_ex1 @@ -162,33 +162,33 @@ Check that your answers agree with `u.mean()` and `u.var()`. Another useful distribution is the Bernoulli distribution on $S = \{0,1\}$, which has PMF: $$ -p(x_i)= -\begin{cases} -p & \text{if $x_i = 1$}\\ -1-p & \text{if $x_i = 0$} -\end{cases} +p(i) = \theta^{i-1} (1 - \theta)^i $$ -Here $x_i \in S$ is the outcome of the random variable. +Here $\theta \in [0,1]$ is a parameter. + +We can think of this distribution as modeling probabilities for a random trial with success probability $\theta$. + +* $p(1) = \theta$ means that the trial succeeds (takes value 1) with probability $\theta$ +* $p(0) = 1 - \theta$ means that the trial fails (takes value 0) with + probability $1-\theta$ + +The formula for the mean is $p$, and the formula for the variance is $p(1-p)$. We can import the Bernoulli distribution on $S = \{0,1\}$ from SciPy like so: ```{code-cell} ipython3 -p = 0.4 -u = scipy.stats.bernoulli(p) +θ = 0.4 +u = scipy.stats.bernoulli(θ) ``` - -Here's the mean and variance: +Here's the mean and variance at $\theta=0.4$ ```{code-cell} ipython3 u.mean(), u.var() ``` -The formula for the mean is $p$, and the formula for the variance is $p(1-p)$. - - -Now let's evaluate the PMF: +Now let's evaluate the PMF ```{code-cell} ipython3 u.pmf(0) @@ -201,16 +201,18 @@ u.pmf(1) Another useful (and more interesting) distribution is the **binomial distribution** on $S=\{0, \ldots, n\}$, which has PMF: $$ - p(i) = \binom{n}{i} \theta^i (1-\theta)^{n-i} +p(i) = \binom{n}{i} \theta^i (1-\theta)^{n-i} $$ -Here $\theta \in [0,1]$ is a parameter. +Again, $\theta \in [0,1]$ is a parameter. The interpretation of $p(i)$ is: the probability of $i$ successes in $n$ independent trials with success probability $\theta$. For example, if $\theta=0.5$, then $p(i)$ is the probability of $i$ heads in $n$ flips of a fair coin. -The mean and variance are: +The formula for the mean is $n \theta$ and the formula for the variance is $n \theta (1-\theta)$. + +Let's investigate an example ```{code-cell} ipython3 n = 10 @@ -218,11 +220,18 @@ n = 10 u = scipy.stats.binom(n, θ) ``` +According to our formulas, the mean and variance are + +```{code-cell} ipython3 +n * θ, n * θ * (1 - θ) +``` + +Let's see if SciPy gives us the same results: + ```{code-cell} ipython3 u.mean(), u.var() ``` -The formula for the mean is $n \theta$ and the formula for the variance is $n \theta (1-\theta)$. Here's the PMF: @@ -285,24 +294,66 @@ We can see that the output graph is the same as the one above. ```{solution-end} ``` +#### Geometric distribution + +The geometric distribution has infinite support $S = \{0, 1, 2, \ldots\}$ and its PMF is given by + +$$ +p(i) = (1 - \theta)^i \theta +$$ + +where $\lambda \in [0,1]$ is a parameter + +(A discrete distribution has infinite support if the set of points to which it assigns positive probability is infinite.) + +To understand the distribution, think of repeated independent random trials, each with success probability $\theta$. + +The interpretation of $p(i)$ is: the probability there are $i$ failures before the first success occurs. + +It can be shown that the mean of the distribution is $1/\theta$ and the variance is $(1-\theta)/\theta$. + +Here's an example. + +```{code-cell} ipython3 +θ = 0.1 +u = scipy.stats.geom(θ) +u.mean(), u.var() +``` + +Here's part of the PMF: + +```{code-cell} ipython3 +fig, ax = plt.subplots() +n = 20 +S = np.arange(n) +ax.plot(S, u.pmf(S), linestyle='', marker='o', alpha=0.8, ms=4) +ax.vlines(S, 0, u.pmf(S), lw=0.2) +ax.set_xticks(S) +ax.set_xlabel('S') +ax.set_ylabel('PMF') +plt.show() +``` + + #### Poisson distribution -Poisson distribution on $S = \{0, 1, \ldots\}$ with parameter $\lambda > 0$ has PMF +The Poisson distribution on $S = \{0, 1, \ldots\}$ with parameter $\lambda > 0$ has PMF $$ - p(i) = \frac{\lambda^i}{i!} e^{-\lambda} +p(i) = \frac{\lambda^i}{i!} e^{-\lambda} $$ -The interpretation of $p(i)$ is: the probability of $i$ events in a fixed time interval, where the events occur at a constant rate $\lambda$ and independently of each other. +The interpretation of $p(i)$ is: the probability of $i$ events in a fixed time interval, where the events occur independently at a constant rate $\lambda$. + +It can be shown that the mean is $\lambda$ and the variance is also $\lambda$. + +Here's an example. -The mean and variance are: ```{code-cell} ipython3 λ = 2 u = scipy.stats.poisson(λ) u.mean(), u.var() ``` - -The expectation of the Poisson distribution is $\lambda$ and the variance is also $\lambda$. Here's the PMF: @@ -325,14 +376,16 @@ plt.show() ### Continuous distributions -Continuous distributions are represented by a **probability density function**, which is a function $p$ over $\mathbb R$ (the set of all real numbers) such that $p(x) \geq 0$ for all $x$ and +A continuous distribution is represented by a **probability density function**, which is a function $p$ over $\mathbb R$ (the set of all real numbers) such that $p(x) \geq 0$ for all $x$ and -$$ \int_{-\infty}^\infty p(x) dx = 1 $$ +$$ +\int_{-\infty}^\infty p(x) dx = 1 +$$ We say that random variable $X$ has distribution $p$ if $$ - \mathbb P\{a < X < b\} = \int_a^b p(x) dx +\mathbb P\{a < X < b\} = \int_a^b p(x) dx $$ for all $a \leq b$. @@ -342,14 +395,14 @@ The definition of the mean and variance of a random variable $X$ with distributi For example, the mean of $X$ is $$ - \mathbb{E}[X] = \int_{-\infty}^\infty x p(x) dx +\mathbb{E}[X] = \int_{-\infty}^\infty x p(x) dx $$ The **cumulative distribution function** (CDF) of $X$ is defined by $$ - F(x) = \mathbb P\{X \leq x\} - = \int_{-\infty}^x p(x) dx +F(x) = \mathbb P\{X \leq x\} + = \int_{-\infty}^x p(x) dx $$ @@ -358,15 +411,15 @@ $$ Perhaps the most famous distribution is the **normal distribution**, which has density $$ - p(x) = \frac{1}{\sqrt{2\pi}\sigma} - \exp\left(-\frac{(x-\mu)^2}{2\sigma^2}\right) +p(x) = \frac{1}{\sqrt{2\pi}\sigma} + \exp\left(-\frac{(x-\mu)^2}{2\sigma^2}\right) $$ -This distribution has two parameters, $\mu$ and $\sigma$. +This distribution has two parameters, $\mu \in \mathbb R$ and $\sigma \in (0, \infty)$. -It can be shown that, for this distribution, the mean is $\mu$ and the variance is $\sigma^2$. +Using calculus, it can be shown that, for this distribution, the mean is $\mu$ and the variance is $\sigma^2$. -We can obtain the moments, PDF and CDF of the normal density as follows: +We can obtain the moments, PDF and CDF of the normal density via SciPy as follows: ```{code-cell} ipython3 μ, σ = 0.0, 1.0 @@ -419,17 +472,18 @@ plt.show() The **lognormal distribution** is a distribution on $\left(0, \infty\right)$ with density $$ - p(x) = \frac{1}{\sigma x \sqrt{2\pi}} - \exp \left(- \frac{\left(\log x - \mu\right)^2}{2 \sigma^2} \right) +p(x) = \frac{1}{\sigma x \sqrt{2\pi}} + \exp \left(- \frac{\left(\log x - \mu\right)^2}{2 \sigma^2} \right) $$ This distribution has two parameters, $\mu$ and $\sigma$. It can be shown that, for this distribution, the mean is $\exp\left(\mu + \sigma^2/2\right)$ and the variance is $\left[\exp\left(\sigma^2\right) - 1\right] \exp\left(2\mu + \sigma^2\right)$. -It has a nice interpretation: if $X$ is lognormally distributed, then $\log X$ is normally distributed. +It can be proved that -It is often used to model variables that are "multiplicative" in nature, such as income or asset prices. +* if $X$ is lognormally distributed, then $\log X$ is normally distributed, and +* if $X$ is normally distributed, then $\exp X$ is lognormally distributed. We can obtain the moments, PDF, and CDF of the lognormal density as follows: @@ -477,15 +531,16 @@ plt.show() #### Exponential distribution -The **exponential distribution** is a distribution on $\left(0, \infty\right)$ with density +The **exponential distribution** is a distribution supported on $\left(0, \infty\right)$ with density $$ - p(x) = \lambda \exp \left( - \lambda x \right) +p(x) = \lambda \exp \left( - \lambda x \right) +\qquad (x > 0) $$ -This distribution has one parameter, $\lambda$. +This distribution has one parameter $\lambda$. -It is related to the Poisson distribution as it describes the distribution of the length of the time interval between two consecutive events in a Poisson process. +The exponential distribution can be thought of as the continuous analog of the geometric distribution. It can be shown that, for this distribution, the mean is $1/\lambda$ and the variance is $1/\lambda^2$. @@ -535,8 +590,8 @@ plt.show() The **beta distribution** is a distribution on $(0, 1)$ with density $$ - p(x) = \frac{\Gamma(\alpha + \beta)}{\Gamma(\alpha) \Gamma(\beta)} - x^{\alpha - 1} (1 - x)^{\beta - 1} +p(x) = \frac{\Gamma(\alpha + \beta)}{\Gamma(\alpha) \Gamma(\beta)} + x^{\alpha - 1} (1 - x)^{\beta - 1} $$ where $\Gamma$ is the [gamma function](https://en.wikipedia.org/wiki/Gamma_function). @@ -597,8 +652,8 @@ plt.show() The **gamma distribution** is a distribution on $\left(0, \infty\right)$ with density $$ - p(x) = \frac{\beta^\alpha}{\Gamma(\alpha)} - x^{\alpha - 1} \exp(-\beta x) +p(x) = \frac{\beta^\alpha}{\Gamma(\alpha)} + x^{\alpha - 1} \exp(-\beta x) $$ This distribution has two parameters, $\alpha > 0$ and $\beta > 0$. @@ -694,19 +749,19 @@ Suppose we have an observed distribution with values $\{x_1, \ldots, x_n\}$ The **sample mean** of this distribution is defined as $$ - \bar x = \frac{1}{n} \sum_{i=1}^n x_i +\bar x = \frac{1}{n} \sum_{i=1}^n x_i $$ The **sample variance** is defined as $$ - \frac{1}{n} \sum_{i=1}^n (x_i - \bar x)^2 +\frac{1}{n} \sum_{i=1}^n (x_i - \bar x)^2 $$ For the income distribution given above, we can calculate these numbers via ```{code-cell} ipython3 -x = np.asarray(df['income']) +x = np.asarray(df['income']) # Pull out income as a NumPy array ``` ```{code-cell} ipython3 @@ -720,6 +775,7 @@ x.mean(), x.var() Check that the formulas given above produce the same numbers. ``` + ### Visualization Let's look at different ways that we can visualize one or more observed distributions. @@ -730,12 +786,9 @@ We will cover - kernel density estimates and - violin plots -+++ {"user_expressions": []} #### Histograms -+++ {"user_expressions": []} - We can histogram the income distribution we just constructed as follows ```{code-cell} ipython3 @@ -747,11 +800,10 @@ ax.set_ylabel('density') plt.show() ``` -+++ {"user_expressions": []} Let's look at a distribution from real data. -In particular, we will look at the monthly return on Amazon shares between 2000/1/1 and 2023/1/1. +In particular, we will look at the monthly return on Amazon shares between 2000/1/1 and 2024/1/1. The monthly return is calculated as the percent change in the share price over each month. @@ -759,13 +811,12 @@ So we will have one observation for each month. ```{code-cell} ipython3 :tags: [hide-output] -df = yf.download('AMZN', '2000-1-1', '2023-1-1', interval='1mo' ) +df = yf.download('AMZN', '2000-1-1', '2024-1-1', interval='1mo' ) prices = df['Adj Close'] data = prices.pct_change()[1:] * 100 data.head() ``` -+++ {"user_expressions": []} The first observation is the monthly return (percent change) over January 2000, which was @@ -773,8 +824,6 @@ The first observation is the monthly return (percent change) over January 2000, data[0] ``` -+++ {"user_expressions": []} - Let's turn the return observations into an array and histogram it. ```{code-cell} ipython3 @@ -789,13 +838,15 @@ ax.set_ylabel('density') plt.show() ``` -+++ {"user_expressions": []} #### Kernel density estimates -Kernel density estimate (KDE) is a non-parametric way to estimate and visualize the PDF of a distribution. +Kernel density estimates (KDE) provide a simple way to estimate and visualize the density of a distribution. -KDE will generate a smooth curve that approximates the PDF. +If you are not familiar with KDEs, you can think of them as a smoothed +histogram. + +Let's have a look at a KDE formed from the Amazon return data. ```{code-cell} ipython3 fig, ax = plt.subplots() @@ -825,9 +876,8 @@ A suitable bandwidth is not too smooth (underfitting) or too wiggly (overfitting #### Violin plots -+++ {"user_expressions": []} -Yet another way to display an observed distribution is via a violin plot. +Another way to display an observed distribution is via a violin plot. ```{code-cell} ipython3 fig, ax = plt.subplots() @@ -837,43 +887,40 @@ ax.set_xlabel('KDE') plt.show() ``` -+++ {"user_expressions": []} - Violin plots are particularly useful when we want to compare different distributions. -For example, let's compare the monthly returns on Amazon shares with the monthly return on Apple shares. +For example, let's compare the monthly returns on Amazon shares with the monthly return on Costco shares. ```{code-cell} ipython3 :tags: [hide-output] -df = yf.download('AAPL', '2000-1-1', '2023-1-1', interval='1mo' ) +df = yf.download('COST', '2000-1-1', '2024-1-1', interval='1mo' ) prices = df['Adj Close'] data = prices.pct_change()[1:] * 100 -x_apple = np.asarray(data) +x_costco = np.asarray(data) ``` ```{code-cell} ipython3 fig, ax = plt.subplots() -ax.violinplot([x_amazon, x_apple]) +ax.violinplot([x_amazon, x_costco]) ax.set_ylabel('monthly return (percent change)') ax.set_xlabel('KDE') plt.show() ``` -+++ {"user_expressions": []} ### Connection to probability distributions -+++ {"user_expressions": []} - Let's discuss the connection between observed distributions and probability distributions. Sometimes it's helpful to imagine that an observed distribution is generated by a particular probability distribution. For example, we might look at the returns from Amazon above and imagine that they were generated by a normal distribution. -Even though this is not true, it might be a helpful way to think about the data. +(Even though this is not true, it *might* be a helpful way to think about the data.) -Here we match a normal distribution to the Amazon monthly returns by setting the sample mean to the mean of the normal distribution and the sample variance equal to the variance. +Here we match a normal distribution to the Amazon monthly returns by setting the +sample mean to the mean of the normal distribution and the sample variance equal +to the variance. Then we plot the density and the histogram. @@ -894,14 +941,11 @@ ax.set_ylabel('density') plt.show() ``` -+++ {"user_expressions": []} -The match between the histogram and the density is not very bad but also not very good. +The match between the histogram and the density is not bad but also not very good. One reason is that the normal distribution is not really a good fit for this observed data --- we will discuss this point again when we talk about {ref}`heavy tailed distributions`. -+++ {"user_expressions": []} - Of course, if the data really *is* generated by the normal distribution, then the fit will be better. Let's see this in action @@ -923,7 +967,6 @@ ax.set_ylabel('density') plt.show() ``` -+++ {"user_expressions": []} Note that if you keep increasing $N$, which is the number of observations, the fit will get better and better. From a58c4af24153d7cd49b2711e3a2d446c3450c9b7 Mon Sep 17 00:00:00 2001 From: Matt McKay Date: Thu, 1 Aug 2024 14:34:53 +1000 Subject: [PATCH 05/17] FIX: Update python code to simplify and resolve FutureWarning (#540) * Misc edits to prob lecture * fix variable name and minor formatting update * add explanation for infinite support * ENH: update code to simplify and resolve warnings * remove all asarray * address missed merge conflict issues * remove extra x=df['income'] * FIX: set pd option to see if FutureWarning is resolved for inf and na * revert test by setting pd option * upgrade anaconda==2024.06 --------- Co-authored-by: John Stachurski --- environment.yml | 2 +- lectures/prob_dist.md | 49 ++++++++++--------------------------------- 2 files changed, 12 insertions(+), 39 deletions(-) diff --git a/environment.yml b/environment.yml index 52036b80..d834b6a3 100644 --- a/environment.yml +++ b/environment.yml @@ -4,7 +4,7 @@ channels: - conda-forge dependencies: - python=3.11 - - anaconda=2024.02 + - anaconda=2024.06 - pip - pip: - jupyter-book==0.15.1 diff --git a/lectures/prob_dist.md b/lectures/prob_dist.md index 5bfa6200..2b619724 100644 --- a/lectures/prob_dist.md +++ b/lectures/prob_dist.md @@ -4,14 +4,13 @@ jupytext: extension: .md format_name: myst format_version: 0.13 - jupytext_version: 1.14.5 + jupytext_version: 1.16.1 kernelspec: display_name: Python 3 (ipykernel) language: python name: python3 --- - # Distributions and Probabilities ```{index} single: Distributions and Probabilities @@ -23,6 +22,7 @@ In this lecture we give a quick introduction to data and probability distributio ```{code-cell} ipython3 :tags: [hide-output] + !pip install --upgrade yfinance ``` @@ -35,7 +35,6 @@ import scipy.stats import seaborn as sns ``` - ## Common distributions In this section we recall the definitions of some well-known distributions and explore how to manipulate them with SciPy. @@ -99,7 +98,6 @@ n = 10 u = scipy.stats.randint(1, n+1) ``` - Here's the mean and variance: ```{code-cell} ipython3 @@ -195,7 +193,6 @@ u.pmf(0) u.pmf(1) ``` - #### Binomial distribution Another useful (and more interesting) distribution is the **binomial distribution** on $S=\{0, \ldots, n\}$, which has PMF: @@ -232,7 +229,6 @@ Let's see if SciPy gives us the same results: u.mean(), u.var() ``` - Here's the PMF: ```{code-cell} ipython3 @@ -250,7 +246,6 @@ ax.set_ylabel('PMF') plt.show() ``` - Here's the CDF: ```{code-cell} ipython3 @@ -264,7 +259,6 @@ ax.set_ylabel('CDF') plt.show() ``` - ```{exercise} :label: prob_ex3 @@ -334,7 +328,6 @@ ax.set_ylabel('PMF') plt.show() ``` - #### Poisson distribution The Poisson distribution on $S = \{0, 1, \ldots\}$ with parameter $\lambda > 0$ has PMF @@ -372,7 +365,6 @@ ax.set_ylabel('PMF') plt.show() ``` - ### Continuous distributions @@ -449,7 +441,6 @@ plt.legend() plt.show() ``` - Here's a plot of the CDF: ```{code-cell} ipython3 @@ -466,7 +457,6 @@ plt.legend() plt.show() ``` - #### Lognormal distribution The **lognormal distribution** is a distribution on $\left(0, \infty\right)$ with density @@ -646,7 +636,6 @@ plt.legend() plt.show() ``` - #### Gamma distribution The **gamma distribution** is a distribution on $\left(0, \infty\right)$ with density @@ -730,7 +719,6 @@ df = pd.DataFrame(data, columns=['name', 'income']) df ``` - In this situation, we might refer to the set of their incomes as the "income distribution." The terminology is confusing because this set is not a probability distribution @@ -761,14 +749,10 @@ $$ For the income distribution given above, we can calculate these numbers via ```{code-cell} ipython3 -x = np.asarray(df['income']) # Pull out income as a NumPy array -``` - -```{code-cell} ipython3 +x = df['income'] x.mean(), x.var() ``` - ```{exercise} :label: prob_ex4 @@ -792,7 +776,6 @@ We will cover We can histogram the income distribution we just constructed as follows ```{code-cell} ipython3 -x = df['income'] fig, ax = plt.subplots() ax.hist(x, bins=5, density=True, histtype='bar') ax.set_xlabel('income') @@ -800,7 +783,6 @@ ax.set_ylabel('density') plt.show() ``` - Let's look at a distribution from real data. In particular, we will look at the monthly return on Amazon shares between 2000/1/1 and 2024/1/1. @@ -811,25 +793,21 @@ So we will have one observation for each month. ```{code-cell} ipython3 :tags: [hide-output] -df = yf.download('AMZN', '2000-1-1', '2024-1-1', interval='1mo' ) + +df = yf.download('AMZN', '2000-1-1', '2024-1-1', interval='1mo') prices = df['Adj Close'] -data = prices.pct_change()[1:] * 100 -data.head() +x_amazon = prices.pct_change()[1:] * 100 +x_amazon.head() ``` - The first observation is the monthly return (percent change) over January 2000, which was ```{code-cell} ipython3 -data[0] +x_amazon.iloc[0] ``` Let's turn the return observations into an array and histogram it. -```{code-cell} ipython3 -x_amazon = np.asarray(data) -``` - ```{code-cell} ipython3 fig, ax = plt.subplots() ax.hist(x_amazon, bins=20) @@ -838,7 +816,6 @@ ax.set_ylabel('density') plt.show() ``` - #### Kernel density estimates Kernel density estimates (KDE) provide a simple way to estimate and visualize the density of a distribution. @@ -893,10 +870,10 @@ For example, let's compare the monthly returns on Amazon shares with the monthly ```{code-cell} ipython3 :tags: [hide-output] -df = yf.download('COST', '2000-1-1', '2024-1-1', interval='1mo' ) + +df = yf.download('COST', '2000-1-1', '2024-1-1', interval='1mo') prices = df['Adj Close'] -data = prices.pct_change()[1:] * 100 -x_costco = np.asarray(data) +x_costco = prices.pct_change()[1:] * 100 ``` ```{code-cell} ipython3 @@ -907,7 +884,6 @@ ax.set_xlabel('KDE') plt.show() ``` - ### Connection to probability distributions Let's discuss the connection between observed distributions and probability distributions. @@ -941,7 +917,6 @@ ax.set_ylabel('density') plt.show() ``` - The match between the histogram and the density is not bad but also not very good. One reason is that the normal distribution is not really a good fit for this observed data --- we will discuss this point again when we talk about {ref}`heavy tailed distributions`. @@ -967,8 +942,6 @@ ax.set_ylabel('density') plt.show() ``` - Note that if you keep increasing $N$, which is the number of observations, the fit will get better and better. This convergence is a version of the "law of large numbers", which we will discuss {ref}`later`. - From 1a46d9dc22480f5c2bcdae9a1e3090838493a4d3 Mon Sep 17 00:00:00 2001 From: John Stachurski Date: Thu, 1 Aug 2024 18:52:44 +1000 Subject: [PATCH 06/17] misc (#541) --- lectures/prob_dist.md | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/lectures/prob_dist.md b/lectures/prob_dist.md index 2b619724..6976b665 100644 --- a/lectures/prob_dist.md +++ b/lectures/prob_dist.md @@ -160,7 +160,8 @@ Check that your answers agree with `u.mean()` and `u.var()`. Another useful distribution is the Bernoulli distribution on $S = \{0,1\}$, which has PMF: $$ -p(i) = \theta^{i-1} (1 - \theta)^i +p(i) = \theta^i (1 - \theta)^{1-i} +\qquad (i = 0, 1) $$ Here $\theta \in [0,1]$ is a parameter. @@ -171,7 +172,7 @@ We can think of this distribution as modeling probabilities for a random trial w * $p(0) = 1 - \theta$ means that the trial fails (takes value 0) with probability $1-\theta$ -The formula for the mean is $p$, and the formula for the variance is $p(1-p)$. +The formula for the mean is $\theta$, and the formula for the variance is $\theta(1-\theta)$. We can import the Bernoulli distribution on $S = \{0,1\}$ from SciPy like so: @@ -186,11 +187,10 @@ Here's the mean and variance at $\theta=0.4$ u.mean(), u.var() ``` -Now let's evaluate the PMF +We can evaluate the PMF as follows ```{code-cell} ipython3 -u.pmf(0) -u.pmf(1) +u.pmf(0), u.pmf(1) ``` #### Binomial distribution @@ -756,7 +756,11 @@ x.mean(), x.var() ```{exercise} :label: prob_ex4 -Check that the formulas given above produce the same numbers. +If you try to check that the formulas given above for the sample mean and sample +variance produce the same numbers, you will see that the variance isn't quite +right. This is because SciPy uses $1/(n-1)$ instead of $1/n$ as the term at the +front of the variance. (Some books define the sample variance this way.) +Confirm. ``` From eecca097ccd9a0365209fab3bffabf5331edcb49 Mon Sep 17 00:00:00 2001 From: Matt McKay Date: Fri, 2 Aug 2024 09:57:45 +1000 Subject: [PATCH 07/17] FIX: pickups from live lecture (#542) * FIX: pickups from live lecture * update xlables This updates the x labels of the violin plot comparing Amazon and Costco. * Update prob_dist.md --------- Co-authored-by: Longye Tian --- lectures/prob_dist.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lectures/prob_dist.md b/lectures/prob_dist.md index 6976b665..22defb18 100644 --- a/lectures/prob_dist.md +++ b/lectures/prob_dist.md @@ -296,7 +296,7 @@ $$ p(i) = (1 - \theta)^i \theta $$ -where $\lambda \in [0,1]$ is a parameter +where $\theta \in [0,1]$ is a parameter (A discrete distribution has infinite support if the set of points to which it assigns positive probability is infinite.) @@ -884,7 +884,10 @@ x_costco = prices.pct_change()[1:] * 100 fig, ax = plt.subplots() ax.violinplot([x_amazon, x_costco]) ax.set_ylabel('monthly return (percent change)') -ax.set_xlabel('KDE') +ax.set_xlabel('retailers') + +ax.set_xticks([1, 2]) +ax.set_xticklabels(['Amazon', 'Costco']) plt.show() ``` From 2ecd0ff2a9896e5d8bad0de0b3c70c9e28cb2165 Mon Sep 17 00:00:00 2001 From: Longye Tian <133612246+longye-tian@users.noreply.github.com> Date: Fri, 2 Aug 2024 16:43:06 +1000 Subject: [PATCH 08/17] [ar1_processes] to [eigen_II] [heavy_tails][inequality]Example and spelling (#538) * update_ar1_example update_ar1_example; no spelling error. * update cagan_ree typos This commit updates cagan_ree.md typos * Update complex_and_trig.md add example admonition * Update cons_smooth.md update typos * Update eigen_II.md update typos * Update eigen_II.md add example admonition * Update eigen_I.md add example admonition * update typos in heavy_tails.md - change 'from world population review' to 'from the World Population Review' - change 'Law of Large Numbers' to 'law of large numbers' to match with Wikipedia form as discussed before - change 'heavy tailed' to 'heavy-tailed' for consistency - change 'The value the tail index' to 'The value of the tail index' - change 'Here is code that generates' to 'Here is the code generates' * [heavy_tails]add two example admonitions * [inequality] typo and grammar update - change 'per capital' to 'per capita' - change 'others is zero' to 'others are zero' - change 'the world bank' to 'the World Bank' to match Wikipedia - add empty link to match with the style guide - change 'Western economies GDP' to 'Western economies'GDP' * [inequality] add one example admonition * [input_output] update typos - change 'input output' to 'input-output' for consistency - change **feasible allocations must satisfy** to *feasible allocations must satisfy* to match with style guide - change 'a two good economy' to 'a two-good economy' * [input_output] example admonition This example admonition include code block * [input_output] example admonition update cannot include code blocks in the example admonition --- lectures/ar1_processes.md | 11 +++++++++-- lectures/cagan_ree.md | 6 +++--- lectures/complex_and_trig.md | 4 ++++ lectures/cons_smooth.md | 28 ++++++++++++++-------------- lectures/eigen_I.md | 4 +++- lectures/eigen_II.md | 30 +++++++++++++++++++----------- lectures/heavy_tails.md | 22 +++++++++++++++------- lectures/inequality.md | 17 +++++++++++------ lectures/input_output.md | 19 +++++++++++++------ 9 files changed, 91 insertions(+), 50 deletions(-) diff --git a/lectures/ar1_processes.md b/lectures/ar1_processes.md index 90cc0514..fe54d3d1 100644 --- a/lectures/ar1_processes.md +++ b/lectures/ar1_processes.md @@ -60,6 +60,9 @@ where $a, b, c$ are scalar-valued parameters (Equation {eq}`can_ar1` is sometimes called a **stochastic difference equation**.) +```{prf:example} +:label: ar1_ex_ar + For example, $X_t$ might be * the log of labor income for a given household, or @@ -70,6 +73,7 @@ of the previous value and an IID shock $W_{t+1}$. (We use $t+1$ for the subscript of $W_{t+1}$ because this random variable is not observed at time $t$.) +``` The specification {eq}`can_ar1` generates a time series $\{ X_t\}$ as soon as we specify an initial condition $X_0$. @@ -330,7 +334,10 @@ Notes: * In {eq}`ar1_ergo`, convergence holds with probability one. * The textbook by {cite}`MeynTweedie2009` is a classic reference on ergodicity. -For example, if we consider the identity function $h(x) = x$, we get +```{prf:example} +:label: ar1_ex_id + +If we consider the identity function $h(x) = x$, we get $$ \frac{1}{m} \sum_{t = 1}^m X_t \to @@ -339,7 +346,7 @@ $$ $$ In other words, the time series sample mean converges to the mean of the stationary distribution. - +``` Ergodicity is important for a range of reasons. diff --git a/lectures/cagan_ree.md b/lectures/cagan_ree.md index fab16d01..f0274b56 100644 --- a/lectures/cagan_ree.md +++ b/lectures/cagan_ree.md @@ -18,7 +18,7 @@ kernelspec: We'll use linear algebra first to explain and then do some experiments with a "monetarist theory of price levels". -Economists call it a "monetary" or "monetarist" theory of price levels because effects on price levels occur via a central banks's decisions to print money supply. +Economists call it a "monetary" or "monetarist" theory of price levels because effects on price levels occur via a central bank's decisions to print money supply. * a goverment's fiscal policies determine whether its _expenditures_ exceed its _tax collections_ * if its expenditures exceed its tax collections, the government can instruct the central bank to cover the difference by _printing money_ @@ -27,7 +27,7 @@ Economists call it a "monetary" or "monetarist" theory of price levels because e Such a theory of price levels was described by Thomas Sargent and Neil Wallace in chapter 5 of {cite}`sargent2013rational`, which reprints a 1981 Federal Reserve Bank of Minneapolis article entitled "Unpleasant Monetarist Arithmetic". -Sometimes this theory is also called a "fiscal theory of price levels" to emphasize the importance of fisal deficits in shaping changes in the money supply. +Sometimes this theory is also called a "fiscal theory of price levels" to emphasize the importance of fiscal deficits in shaping changes in the money supply. The theory has been extended, criticized, and applied by John Cochrane {cite}`cochrane2023fiscal`. @@ -41,7 +41,7 @@ persistent inflation. The "monetarist" or "fiscal theory of price levels" asserts that -* to _start_ a persistent inflation the government beings persistently to run a money-financed government deficit +* to _start_ a persistent inflation the government begins persistently to run a money-financed government deficit * to _stop_ a persistent inflation the government stops persistently running a money-financed government deficit diff --git a/lectures/complex_and_trig.md b/lectures/complex_and_trig.md index 8fe53202..7f40497c 100644 --- a/lectures/complex_and_trig.md +++ b/lectures/complex_and_trig.md @@ -103,12 +103,16 @@ from sympy import (Symbol, symbols, Eq, nsolve, sqrt, cos, sin, simplify, ### An Example +```{prf:example} +:label: ct_ex_com + Consider the complex number $z = 1 + \sqrt{3} i$. For $z = 1 + \sqrt{3} i$, $x = 1$, $y = \sqrt{3}$. It follows that $r = 2$ and $\theta = \tan^{-1}(\sqrt{3}) = \frac{\pi}{3} = 60^o$. +``` Let's use Python to plot the trigonometric form of the complex number $z = 1 + \sqrt{3} i$. diff --git a/lectures/cons_smooth.md b/lectures/cons_smooth.md index b2bace94..2719baa8 100644 --- a/lectures/cons_smooth.md +++ b/lectures/cons_smooth.md @@ -21,7 +21,7 @@ In this lecture, we'll study a famous model of the "consumption function" that M In this lecture, we'll study what is often called the "consumption-smoothing model" using matrix multiplication and matrix inversion, the same tools that we used in this QuantEcon lecture {doc}`present values `. -Formulas presented in {doc}`present value formulas` are at the core of the consumption smoothing model because we shall use them to define a consumer's "human wealth". +Formulas presented in {doc}`present value formulas` are at the core of the consumption-smoothing model because we shall use them to define a consumer's "human wealth". The key idea that inspired Milton Friedman was that a person's non-financial income, i.e., his or her wages from working, could be viewed as a dividend stream from that person's ''human capital'' @@ -39,7 +39,7 @@ It will take a while for a "present value" or asset price explicilty to appear i ## Analysis -As usual, we'll start with by importing some Python modules. +As usual, we'll start by importing some Python modules. ```{code-cell} ipython3 import numpy as np @@ -128,7 +128,7 @@ Indeed, we shall see that when $\beta R = 1$ (a condition assumed by Milton Frie By **smoother** we mean as close as possible to being constant over time. -The preference for smooth consumption paths that is built into the model gives it the name "consumption smoothing model". +The preference for smooth consumption paths that is built into the model gives it the name "consumption-smoothing model". Let's dive in and do some calculations that will help us understand how the model works. @@ -176,7 +176,7 @@ $$ \sum_{t=0}^T R^{-t} c_t = a_0 + h_0. $$ (eq:budget_intertemp) -Equation {eq}`eq:budget_intertemp` says that the present value of the consumption stream equals the sum of finanical and non-financial (or human) wealth. +Equation {eq}`eq:budget_intertemp` says that the present value of the consumption stream equals the sum of financial and non-financial (or human) wealth. Robert Hall {cite}`Hall1978` showed that when $\beta R = 1$, a condition Milton Friedman had also assumed, it is "optimal" for a consumer to smooth consumption by setting @@ -196,7 +196,7 @@ $$ (eq:conssmoothing) Equation {eq}`eq:conssmoothing` is the consumption-smoothing model in a nutshell. -## Mechanics of Consumption smoothing model +## Mechanics of consumption-smoothing model As promised, we'll provide step-by-step instructions on how to use linear algebra, readily implemented in Python, to compute all objects in play in the consumption-smoothing model. @@ -338,14 +338,14 @@ print('Welfare:', welfare(cs_model, c_seq)) ### Experiments -In this section we decribe how a consumption sequence would optimally respond to different sequences sequences of non-financial income. +In this section we describe how a consumption sequence would optimally respond to different sequences sequences of non-financial income. -First we create a function `plot_cs` that generate graphs for different instances of the consumption smoothing model `cs_model`. +First we create a function `plot_cs` that generates graphs for different instances of the consumption-smoothing model `cs_model`. This will help us avoid rewriting code to plot outcomes for different non-financial income sequences. ```{code-cell} ipython3 -def plot_cs(model, # consumption smoothing model +def plot_cs(model, # consumption-smoothing model a0, # initial financial wealth y_seq # non-financial income process ): @@ -368,7 +368,7 @@ def plot_cs(model, # consumption smoothing model plt.show() ``` -In the experiments below, please study how consumption and financial asset sequences vary accross different sequences for non-financial income. +In the experiments below, please study how consumption and financial asset sequences vary across different sequences for non-financial income. #### Experiment 1: one-time gain/loss @@ -602,7 +602,7 @@ First, we define the welfare with respect to $\xi_1$ and $\phi$ def welfare_rel(ξ1, ϕ): """ Compute welfare of variation sequence - for given ϕ, ξ1 with a consumption smoothing model + for given ϕ, ξ1 with a consumption-smoothing model """ cvar_seq = compute_variation(cs_model, ξ1=ξ1, @@ -661,13 +661,13 @@ QuantEcon lecture {doc}`geometric series `. In particular, it **lowers** the government expenditure multiplier relative to one implied by the original Keynesian consumption function presented in {doc}`geometric series `. -Friedman's work opened the door to an enlighening literature on the aggregate consumption function and associated government expenditure multipliers that +Friedman's work opened the door to an enlightening literature on the aggregate consumption function and associated government expenditure multipliers that remains active today. ## Appendix: solving difference equations with linear algebra -In the preceding sections we have used linear algebra to solve a consumption smoothing model. +In the preceding sections we have used linear algebra to solve a consumption-smoothing model. The same tools from linear algebra -- matrix multiplication and matrix inversion -- can be used to study many other dynamic models. @@ -749,7 +749,7 @@ is the inverse of $A$ and check that $A A^{-1} = I$ ``` -### Second order difference equation +### Second-order difference equation A second-order linear difference equation for $\{y_t\}_{t=0}^T$ is @@ -783,6 +783,6 @@ Multiplying both sides by inverse of the matrix on the left again provides the ```{exercise} :label: consmooth_ex2 -As an exercise, we ask you to represent and solve a **third order linear difference equation**. +As an exercise, we ask you to represent and solve a **third-order linear difference equation**. How many initial conditions must you specify? ``` diff --git a/lectures/eigen_I.md b/lectures/eigen_I.md index 46dc221f..948b2f05 100644 --- a/lectures/eigen_I.md +++ b/lectures/eigen_I.md @@ -88,7 +88,8 @@ itself. This means $A$ is an $n \times n$ matrix that maps (or "transforms") a vector $x$ in $\mathbb{R}^n$ to a new vector $y=Ax$ also in $\mathbb{R}^n$. -Here's one example: +```{prf:example} +:label: eigen1_ex_sq $$ \begin{bmatrix} @@ -116,6 +117,7 @@ $$ transforms the vector $x = \begin{bmatrix} 1 \\ 3 \end{bmatrix}$ to the vector $y = \begin{bmatrix} 5 \\ 2 \end{bmatrix}$. +``` Let's visualize this using Python: diff --git a/lectures/eigen_II.md b/lectures/eigen_II.md index 52fd505e..5ccd9ebb 100644 --- a/lectures/eigen_II.md +++ b/lectures/eigen_II.md @@ -26,7 +26,7 @@ In addition to what's in Anaconda, this lecture will need the following librarie In this lecture we will begin with the foundational concepts in spectral theory. -Then we will explore the Perron-Frobenius Theorem and connect it to applications in Markov chains and networks. +Then we will explore the Perron-Frobenius theorem and connect it to applications in Markov chains and networks. We will use the following imports: @@ -64,6 +64,9 @@ An $n \times n$ nonnegative matrix $A$ is called irreducible if $A + A^2 + A^3 + In other words, for each $i,j$ with $1 \leq i, j \leq n$, there exists a $k \geq 0$ such that $a^{k}_{ij} > 0$. +```{prf:example} +:label: eigen2_ex_irr + Here are some examples to illustrate this further: $$ @@ -94,6 +97,7 @@ $$ $C$ is not irreducible since $C^k = C$ for all $k \geq 0$ and thus $c^{k}_{12},c^{k}_{21} = 0$ for all $k \geq 0$. +``` ### Left eigenvectors @@ -159,7 +163,7 @@ This is a more common expression and where the name left eigenvectors originates For a square nonnegative matrix $A$, the behavior of $A^k$ as $k \to \infty$ is controlled by the eigenvalue with the largest absolute value, often called the **dominant eigenvalue**. -For any such matrix $A$, the Perron-Frobenius Theorem characterizes certain +For any such matrix $A$, the Perron-Frobenius theorem characterizes certain properties of the dominant eigenvalue and its corresponding eigenvector. ```{prf:Theorem} Perron-Frobenius Theorem @@ -188,7 +192,7 @@ Let's build our intuition for the theorem using a simple example we have seen [b Now let's consider examples for each case. -#### Example: Irreducible matrix +#### Example: irreducible matrix Consider the following irreducible matrix $A$: @@ -204,7 +208,7 @@ We can compute the dominant eigenvalue and the corresponding eigenvector eig(A) ``` -Now we can see the claims of the Perron-Frobenius Theorem holds for the irreducible matrix $A$: +Now we can see the claims of the Perron-Frobenius theorem holds for the irreducible matrix $A$: 1. The dominant eigenvalue is real-valued and non-negative. 2. All other eigenvalues have absolute values less than or equal to the dominant eigenvalue. @@ -223,6 +227,9 @@ Let $A$ be a square nonnegative matrix and let $A^k$ be the $k^{th}$ power of $A A matrix is called **primitive** if there exists a $k \in \mathbb{N}$ such that $A^k$ is everywhere positive. +```{prf:example} +:label: eigen2_ex_prim + Recall the examples given in irreducible matrices: $$ @@ -244,10 +251,11 @@ B^2 = \begin{bmatrix} 1 & 0 \\ $$ $B$ is irreducible but not primitive since there are always zeros in either principal diagonal or secondary diagonal. +``` We can see that if a matrix is primitive, then it implies the matrix is irreducible but not vice versa. -Now let's step back to the primitive matrices part of the Perron-Frobenius Theorem +Now let's step back to the primitive matrices part of the Perron-Frobenius theorem ```{prf:Theorem} Continous of Perron-Frobenius Theorem :label: con-perron-frobenius @@ -259,7 +267,7 @@ If $A$ is primitive then, $ r(A)^{-m} A^m$ converges to $v w^{\top}$ when $m \rightarrow \infty$. The matrix $v w^{\top}$ is called the **Perron projection** of $A$. ``` -#### Example 1: Primitive matrix +#### Example 1: primitive matrix Consider the following primitive matrix $B$: @@ -277,7 +285,7 @@ We compute the dominant eigenvalue and the corresponding eigenvector eig(B) ``` -Now let's give some examples to see if the claims of the Perron-Frobenius Theorem hold for the primitive matrix $B$: +Now let's give some examples to see if the claims of the Perron-Frobenius theorem hold for the primitive matrix $B$: 1. The dominant eigenvalue is real-valued and non-negative. 2. All other eigenvalues have absolute values strictly less than the dominant eigenvalue. @@ -373,18 +381,18 @@ check_convergence(B) The result shows that the matrix is not primitive as it is not everywhere positive. -These examples show how the Perron-Frobenius Theorem relates to the eigenvalues and eigenvectors of positive matrices and the convergence of the power of matrices. +These examples show how the Perron-Frobenius theorem relates to the eigenvalues and eigenvectors of positive matrices and the convergence of the power of matrices. In fact we have already seen the theorem in action before in {ref}`the Markov chain lecture `. (spec_markov)= -#### Example 2: Connection to Markov chains +#### Example 2: connection to Markov chains We are now prepared to bridge the languages spoken in the two lectures. A primitive matrix is both irreducible and aperiodic. -So Perron-Frobenius Theorem explains why both {ref}`Imam and Temple matrix ` and [Hamilton matrix](https://en.wikipedia.org/wiki/Hamiltonian_matrix) converge to a stationary distribution, which is the Perron projection of the two matrices +So Perron-Frobenius theorem explains why both {ref}`Imam and Temple matrix ` and [Hamilton matrix](https://en.wikipedia.org/wiki/Hamiltonian_matrix) converge to a stationary distribution, which is the Perron projection of the two matrices ```{code-cell} ipython3 P = np.array([[0.68, 0.12, 0.20], @@ -449,7 +457,7 @@ As we have seen, the largest eigenvalue for a primitive stochastic matrix is one This can be proven using [Gershgorin Circle Theorem](https://en.wikipedia.org/wiki/Gershgorin_circle_theorem), but it is out of the scope of this lecture. -So by the statement (6) of Perron-Frobenius Theorem, $\lambda_i<1$ for all $i` -of the Law of Large Numbers, which considered IID $X_1, \ldots, X_n$ with common distribution $F$ +of the law of large numbers, which considered IID $X_1, \ldots, X_n$ with common distribution $F$ If $\mathbb E |X_i|$ is finite, then the sample mean $\bar X_n := \frac{1}{n} \sum_{i=1}^n X_i$ satisfies @@ -957,7 +965,7 @@ the sample mean $\bar X_n := \frac{1}{n} \sum_{i=1}^n X_i$ satisfies where $\mu := \mathbb E X_i = \int x F(dx)$ is the common mean of the sample. The condition $\mathbb E | X_i | = \int |x| F(dx) < \infty$ holds -in most cases but can fail if the distribution $F$ is very heavy tailed. +in most cases but can fail if the distribution $F$ is very heavy-tailed. For example, it fails for the Cauchy distribution. @@ -1006,7 +1014,7 @@ We return to this point in the exercises. We have now seen that 1. heavy tails are frequent in economics and -2. the Law of Large Numbers fails when tails are very heavy. +2. the law of large numbers fails when tails are very heavy. But what about in the real world? Do heavy tails matter? @@ -1261,7 +1269,7 @@ Present discounted value of tax revenue will be estimated by The Pareto distribution is assumed to take the form {eq}`pareto` with $\bar x = 1$ and $\alpha = 1.05$. -(The value the tail index $\alpha$ is plausible given the data {cite}`gabaix2016power`.) +(The value of the tail index $\alpha$ is plausible given the data {cite}`gabaix2016power`.) To make the lognormal option as similar as possible to the Pareto option, choose its parameters such that the mean and median of both distributions are the same. @@ -1315,7 +1323,7 @@ $$ which we solve for $\mu$ and $\sigma$ given $\alpha = 1.05$. -Here is code that generates the two samples, produces the violin plot and +Here is the code that generates the two samples, produces the violin plot and prints the mean and standard deviation of the two samples. ```{code-cell} ipython3 diff --git a/lectures/inequality.md b/lectures/inequality.md index cd6dfcf0..b1ec0e11 100644 --- a/lectures/inequality.md +++ b/lectures/inequality.md @@ -18,19 +18,23 @@ kernelspec: In the lecture {doc}`long_run_growth` we studied how GDP per capita has changed for certain countries and regions. -Per capital GDP is important because it gives us an idea of average income for +Per capita GDP is important because it gives us an idea of average income for households in a given country. However, when we study income and wealth, averages are only part of the story. +```{prf:example} +:label: ie_ex_av + For example, imagine two societies, each with one million people, where * in the first society, the yearly income of one man is $100,000,000 and the income of the - others is zero + others are zero * in the second society, the yearly income of everyone is $100 These countries have the same income per capita (average income is $100) but the lives of the people will be very different (e.g., almost everyone in the first society is starving, even though one person is fabulously rich). +``` The example above suggests that we should go beyond simple averages when we study income and wealth. @@ -532,7 +536,7 @@ Let's look at the Gini coefficient for the distribution of income in the US. We will get pre-computed Gini coefficients (based on income) from the World Bank using the [wbgapi](https://blogs.worldbank.org/opendata/introducing-wbgapi-new-python-package-accessing-world-bank-data). -Let's use the `wbgapi` package we imported earlier to search the world bank data for Gini to find the Series ID. +Let's use the `wbgapi` package we imported earlier to search the World Bank data for Gini to find the Series ID. ```{code-cell} ipython3 wb.search("gini") @@ -755,8 +759,9 @@ min_year = plot_data.year.min() max_year = plot_data.year.max() ``` -The time series for all three countries start and stop in different years. We will add a year mask to the data to -improve clarity in the chart including the different end years associated with each countries time series. +The time series for all three countries start and stop in different years. + +We will add a year mask to the data to improve clarity in the chart including the different end years associated with each country's time series. ```{code-cell} ipython3 labels = [1979, 1986, 1991, 1995, 2000, 2020, 2021, 2022] + \ @@ -783,7 +788,7 @@ fig.show() This figure is built using `plotly` and is {ref}` available on the website ` ``` -This plot shows that all three Western economies GDP per capita has grown over +This plot shows that all three Western economies' GDP per capita has grown over time with some fluctuations in the Gini coefficient. From the early 80's the United Kingdom and the US economies both saw increases diff --git a/lectures/input_output.md b/lectures/input_output.md index 8d6d649b..7c8170c2 100644 --- a/lectures/input_output.md +++ b/lectures/input_output.md @@ -120,7 +120,7 @@ A basic framework for their analysis is After introducing the input-output model, we describe some of its connections to {doc}`linear programming lecture `. -## Input output analysis +## Input-output analysis Let @@ -184,7 +184,7 @@ plt.text(1.6, -0.5, r'$d_{2}$') plt.show() ``` -**Feasible allocations must satisfy** +*Feasible allocations must satisfy* $$ \begin{aligned} @@ -263,8 +263,10 @@ $$ $$ +```{prf:example} +:label: io_ex_tg -For example a two good economy described by +For example a two-good economy described by $$ A = @@ -279,6 +281,7 @@ d = 2 \end{bmatrix} $$ (eq:inout_ex) +``` ```{code-cell} ipython3 A = np.array([[0.1, 40], @@ -336,6 +339,9 @@ $$ Equation {eq}`eq:inout_frontier` sweeps out a **production possibility frontier** of final consumption bundles $d$ that can be produced with exogenous labor input $x_0$. +```{prf:example} +:label: io_ex_ppf + Consider the example in {eq}`eq:inout_ex`. Suppose we are now given @@ -345,6 +351,7 @@ a_0^\top = \begin{bmatrix} 4 & 100 \end{bmatrix} $$ +``` Then we can find $A_0^\top$ by @@ -507,9 +514,9 @@ This illustrates that an element $l_{ij}$ of $L$ shows the total impact on secto ## Applications of graph theory -We can further study input output networks through applications of {doc}`graph theory `. +We can further study input-output networks through applications of {doc}`graph theory `. -An input output network can be represented by a weighted directed graph induced by the adjacency matrix $A$. +An input-output network can be represented by a weighted directed graph induced by the adjacency matrix $A$. The set of nodes $V = [n]$ is the list of sectors and the set of edges is given by @@ -550,7 +557,7 @@ The above figure indicates that manufacturing is the most dominant sector in the ### Output multipliers -Another way to rank sectors in input output networks is via output multipliers. +Another way to rank sectors in input-output networks is via output multipliers. The **output multiplier** of sector $j$ denoted by $\mu_j$ is usually defined as the total sector-wide impact of a unit change of demand in sector $j$. From 20a3b6c7a8e7468b784b9de1535ac528bc132201 Mon Sep 17 00:00:00 2001 From: Longye Tian <133612246+longye-tian@users.noreply.github.com> Date: Wed, 7 Aug 2024 19:33:16 +1000 Subject: [PATCH 09/17] [laffer_adaptive] [lake_model] spelling and check example admonition (#545) * [laffer_adaptive] update style and spelling - change 'it reverse' to 'it reverses' - change the subtitle to lower case to match with the style - change 'pseudo code' to 'pseudo-code' to match with the title for consistency - change 'limiting values exists' to 'limiting values exist' - add hyphen to steady state when using is as adjective for consistency. * [lake_model] update spelling - change 'the below graph' to 'the graph below' for better word ordering - change 'long run growth' to 'long-run growth' for consistency --- lectures/laffer_adaptive.md | 28 ++++++++++++++-------------- lectures/lake_model.md | 4 ++-- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/lectures/laffer_adaptive.md b/lectures/laffer_adaptive.md index fd7b7f37..684f2e6f 100644 --- a/lectures/laffer_adaptive.md +++ b/lectures/laffer_adaptive.md @@ -33,7 +33,7 @@ that we adopted in lectures {doc}`money_inflation` and lectures {doc}`money_infl We shall discover that changing our hypothesis about expectations formation in this way will change some our findings and leave others intact. In particular, we shall discover that * replacing rational expectations with adaptive expectations leaves the two stationary inflation rates unchanged, but that $\ldots$ -* it reverse the perverse dynamics by making the **lower** stationary inflation rate the one to which the system typically converges +* it reverses the perverse dynamics by making the **lower** stationary inflation rate the one to which the system typically converges * a more plausible comparative dynamic outcome emerges in which now inflation can be **reduced** by running **lower** government deficits These more plausible comparative dynamics underlie the "old time religion" that states that @@ -50,7 +50,7 @@ by dropping rational expectations and instead assuming that people form expecta {cite}`marcet2003recurrent` and {cite}`sargent2009conquest` extended that work and applied it to study recurrent high-inflation episodes in Latin America. ``` -## The Model +## The model Let @@ -88,9 +88,9 @@ $$ (eq:adaptex) where $\delta \in (0,1)$ -## Computing An Equilibrium Sequence +## Computing an equilibrium sequence -Equation the expressions for $m_{t+1}$ promided by {eq}`eq:ada_mdemand` and {eq}`eq:ada_msupply2` and use equation {eq}`eq:adaptex` to eliminate $\pi_t^*$ to obtain +Equation the expressions for $m_{t+1}$ provided by {eq}`eq:ada_mdemand` and {eq}`eq:ada_msupply2` and use equation {eq}`eq:adaptex` to eliminate $\pi_t^*$ to obtain the following equation for $p_t$: $$ @@ -99,7 +99,7 @@ $$ (eq:pequation) **Pseudo-code** -Here is pseudo code for our algorithm. +Here is the pseudo-code for our algorithm. Starting at time $0$ with initial conditions $(m_0, \pi_{-1}^*, p_{-1})$, for each $t \geq 0$ deploy the following steps in order: @@ -111,14 +111,14 @@ deploy the following steps in order: This completes the algorithm. -## Claims or Conjectures +## Claims or conjectures It will turn out that * if they exist, limiting values $\overline \pi$ and $\overline \mu$ will be equal -* if limiting values exists, there are two possible limiting values, one high, one low +* if limiting values exist, there are two possible limiting values, one high, one low * unlike the outcome in lecture {doc}`money_inflation_nonlinear`, for almost all initial log price levels and expected inflation rates $p_0, \pi_{t}^*$, the limiting $\overline \pi = \overline \mu$ is the **lower** steady state value @@ -128,7 +128,7 @@ It will turn out that * the preceding equation for $p_0$ comes from $m_1 - p_0 = - \alpha \bar \pi$ -## Limiting Values of Inflation Rate +## Limiting values of inflation rate As in our earlier lecture {doc}`money_inflation_nonlinear`, we can compute the two prospective limiting values for $\bar \pi$ by studying the steady-state Laffer curve. @@ -213,15 +213,15 @@ print(f'The two steady state of π are: {π_l, π_u}') We find two steady state $\bar \pi$ values -## Steady State Laffer Curve +## Steady-state Laffer curve -The following figure plots the steady state Laffer curve together with the two stationary inflation rates. +The following figure plots the steady-state Laffer curve together with the two stationary inflation rates. ```{code-cell} ipython3 --- mystnb: figure: - caption: Seigniorage as function of steady state inflation. The dashed brown lines + caption: Seigniorage as function of steady-state inflation. The dashed brown lines indicate $\pi_l$ and $\pi_u$. name: laffer_curve_adaptive width: 500px @@ -258,11 +258,11 @@ def plot_laffer(model, πs): plot_laffer(model, (π_l, π_u)) ``` -## Associated Initial Price Levels +## Associated initial price levels Now that we have our hands on the two possible steady states, we can compute two initial log price levels $p_{-1}$, which as initial conditions, imply that $\pi_t = \bar \pi $ for all $t \geq 0$. -In particular, to initiate a fixed point of the dynamic Laffer curve dynamics we set +In particular, to initiate a fixed point of the dynamic Laffer curve dynamics, we set $$ p_{-1} = m_0 + \alpha \pi^* @@ -348,7 +348,7 @@ eq_g = lambda x: np.exp(-model.α * x) - np.exp(-(1 + model.α) * x) print('eq_g == g:', np.isclose(eq_g(m_seq[-1] - m_seq[-2]), model.g)) ``` -## Slippery Side of Laffer Curve Dynamics +## Slippery side of Laffer curve dynamics We are now equipped to compute time series starting from different $p_{-1}, \pi_{-1}^*$ settings, analogous to those in this lecture {doc}`money_inflation` and this lecture {doc}`money_inflation_nonlinear`. diff --git a/lectures/lake_model.md b/lectures/lake_model.md index ba11f07f..f70da94f 100644 --- a/lectures/lake_model.md +++ b/lectures/lake_model.md @@ -36,7 +36,7 @@ The "flows" between the two lakes are as follows: 3. employed workers separate from their jobs at rate $\alpha$. 4. unemployed workers find jobs at rate $\lambda$. -The below graph illustrates the lake model. +The graph below illustrates the lake model. ```{figure} /_static/lecture_specific/lake_model/lake_model_worker.png :name: lake_model_graphviz @@ -216,7 +216,7 @@ Moreover, the times series of unemployment and employment seems to grow at some Since by intuition if we consider unemployment pool and employment pool as a closed system, the growth should be similar to the labor force. -We next ask whether the long run growth rates of $e_t$ and $u_t$ +We next ask whether the long-run growth rates of $e_t$ and $u_t$ also dominated by $1+b-d$ as labor force. The answer will be clearer if we appeal to {ref}`Perron-Frobenius theorem`. From 0774777c6e31cb1e3150b1afa5f5b11bf3c029ab Mon Sep 17 00:00:00 2001 From: Longye Tian <133612246+longye-tian@users.noreply.github.com> Date: Wed, 7 Aug 2024 19:35:13 +1000 Subject: [PATCH 10/17] [intro_supply_demand] Update spellings and example admonitions (#543) * [intro_supply_demand] Update typos * [intro_supply_demand] example admonition add two example admonitions --- lectures/intro_supply_demand.md | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/lectures/intro_supply_demand.md b/lectures/intro_supply_demand.md index baacb821..aea36eb5 100644 --- a/lectures/intro_supply_demand.md +++ b/lectures/intro_supply_demand.md @@ -33,7 +33,7 @@ Exports were regarded as good because they brought in bullion (gold flowed into Imports were regarded as bad because bullion was required to pay for them (gold flowed out). -This [zero-sum](https://en.wikipedia.org/wiki/Zero-sum_game) view of economics was eventually overturned by the work of the classical economists such as [Adam Smith](https://en.wikipedia.org/wiki/Adam_Smith) and [David Ricado](https://en.wikipedia.org/wiki/David_Ricardo), who showed how freeing domestic and international trade can enhance welfare. +This [zero-sum](https://en.wikipedia.org/wiki/Zero-sum_game) view of economics was eventually overturned by the work of the classical economists such as [Adam Smith](https://en.wikipedia.org/wiki/Adam_Smith) and [David Ricardo](https://en.wikipedia.org/wiki/David_Ricardo), who showed how freeing domestic and international trade can enhance welfare. There are many different expressions of this idea in economics. @@ -68,6 +68,9 @@ Before we look at the model of supply and demand, it will be helpful to have som ### A discrete example +```{prf:example} +:label: isd_ex_cs + Regarding consumer surplus, suppose that we have a single good and 10 consumers. These 10 consumers have different preferences; in particular, the amount they would be willing to pay for one unit of the good differs. @@ -79,6 +82,7 @@ Suppose that the willingness to pay for each of the 10 consumers is as follows: | willing to pay | 98 | 72 | 41 | 38 | 29 | 21 | 17 | 12 | 11 | 10 | (We have ordered consumers by willingness to pay, in descending order.) +``` If $p$ is the price of the good and $w_i$ is the amount that consumer $i$ is willing to pay, then $i$ buys when $w_i \geq p$. @@ -253,6 +257,9 @@ Let $v_i$ be the price at which producer $i$ is willing to sell the good. When the price is $p$, producer surplus for producer $i$ is $\max\{p - v_i, 0\}$. +```{prf:example} +:label: isd_ex_dc + For example, a producer willing to sell at \$10 and selling at price \$20 makes a surplus of \$10. Total producer surplus is given by @@ -273,6 +280,7 @@ p = 2 q^2 $$ The shaded area is the total producer surplus in this continuous model. +``` ```{code-cell} ipython3 --- @@ -351,7 +359,7 @@ Many of these rules relate to one of the most beautiful and powerful results in We will not try to cover these ideas here, partly because the subject is too big, and partly because you only need to know one rule for this lecture, stated below. -If $f(x) = c + \mathrm{d} x$, then +If $f(x) = c + dx$, then $$ \int_a^b f(x) \mathrm{d} x = c (b - a) + \frac{d}{2}(b^2 - a^2) @@ -670,7 +678,7 @@ This is the competitive equilibrium quantity. Observe that the equilibrium quantity equals the same $q$ given by equation {eq}`eq:old1`. The outcome that the quantity determined by equation {eq}`eq:old1` equates -supply to demand brings us a **key finding:** +supply to demand brings us a *key finding*: * a competitive equilibrium quantity maximizes our welfare criterion @@ -689,11 +697,11 @@ Our generalizations will extend the preceding analysis of a market for a single In addition -* we'll derive **demand curves** from a consumer problem that maximizes a - **utility function** subject to a **budget constraint**. +* we'll derive *demand curves* from a consumer problem that maximizes a + *utility function* subject to a *budget constraint*. -* we'll derive **supply curves** from the problem of a producer who is price - taker and maximizes his profits minus total costs that are described by a **cost function**. +* we'll derive *supply curves* from the problem of a producer who is price + taker and maximizes his profits minus total costs that are described by a *cost function*. ## Exercises From c25fe88eb77340967ac7df866b75b3719220f292 Mon Sep 17 00:00:00 2001 From: Longye Tian <133612246+longye-tian@users.noreply.github.com> Date: Thu, 15 Aug 2024 10:09:29 +1000 Subject: [PATCH 11/17] [markov_chains_II] to [money_inflation]spelling and example admontion (#546) * [markov_chains_II] spelling and example admontion - change 'Benhabib el al' to 'Benhabib et al' * [markov_chains_II] example admonitions add example admonitions that includes a figure. * [mle] spelling and example admonition - change 'log-normal' to 'lognormal' for consistency - add one example admonition. * [markov_chains_II] add another example admonition add example admonition for irreducibility * [money_inflation] Spelling update - change 'take the form of what are' to 'take the form of what is' - change 'qualitive outcome' to 'qualitative outcome' - change 'it reverse the pervese' to 'it reverses the perverse' - change 'theses tools' to 'these tools' - change 'steady state rate' to 'steady-state rate' for consistency * [money_inflation_nonlinear] Update spelling - change 'stationary inflation rate that assert' to 'stationary inflation rate that asserts' - change 'it reverse the pervese' to 'it reverses the perverse' - change 'qualitive' to 'qualitative'. --- lectures/markov_chains_II.md | 14 ++++++++++++-- lectures/mle.md | 6 ++++-- lectures/money_inflation.md | 14 +++++++------- lectures/money_inflation_nonlinear.md | 6 +++--- 4 files changed, 26 insertions(+), 14 deletions(-) diff --git a/lectures/markov_chains_II.md b/lectures/markov_chains_II.md index 59b8e23c..fe2ad9b3 100644 --- a/lectures/markov_chains_II.md +++ b/lectures/markov_chains_II.md @@ -71,6 +71,8 @@ that The stochastic matrix $P$ is called **irreducible** if all states communicate; that is, if $x$ and $y$ communicate for all $(x, y)$ in $S \times S$. +```{prf:example} +:label: mc2_ex_ir For example, consider the following transition probabilities for wealth of a fictitious set of households @@ -95,6 +97,7 @@ $$ It's clear from the graph that this stochastic matrix is irreducible: we can eventually reach any state from any other state. +``` We can also test this using [QuantEcon.py](http://quantecon.org/quantecon-py)'s MarkovChain class @@ -107,6 +110,9 @@ mc = qe.MarkovChain(P, ('poor', 'middle', 'rich')) mc.is_irreducible ``` +```{prf:example} +:label: mc2_ex_pf + Here's a more pessimistic scenario in which poor people remain poor forever ```{image} /_static/lecture_specific/markov_chains_II/Irre_2.png @@ -116,6 +122,7 @@ Here's a more pessimistic scenario in which poor people remain poor forever This stochastic matrix is not irreducible since, for example, rich is not accessible from poor. +``` Let's confirm this @@ -272,6 +279,9 @@ In any of these cases, ergodicity will hold. ### Example: a periodic chain +```{prf:example} +:label: mc2_ex_pc + Let's look at the following example with states 0 and 1: $$ @@ -291,7 +301,7 @@ The transition graph shows that this model is irreducible. ``` Notice that there is a periodic cycle --- the state cycles between the two states in a regular way. - +``` Not surprisingly, this property is called [periodicity](https://stats.libretexts.org/Bookshelves/Probability_Theory/Probability_Mathematical_Statistics_and_Stochastic_Processes_(Siegrist)/16%3A_Markov_Processes/16.05%3A_Periodicity_of_Discrete-Time_Chains). @@ -392,7 +402,7 @@ plt.show() ````{exercise} :label: mc_ex1 -Benhabib el al. {cite}`benhabib_wealth_2019` estimated that the transition matrix for social mobility as the following +Benhabib et al. {cite}`benhabib_wealth_2019` estimated that the transition matrix for social mobility as the following $$ P:= diff --git a/lectures/mle.md b/lectures/mle.md index ee00c399..8a15d6ac 100644 --- a/lectures/mle.md +++ b/lectures/mle.md @@ -39,6 +39,8 @@ $$ where $w$ is wealth. +```{prf:example} +:label: mle_ex_wt For example, if $a = 0.05$, $b = 0.1$, and $\bar w = 2.5$, this means @@ -46,7 +48,7 @@ For example, if $a = 0.05$, $b = 0.1$, and $\bar w = 2.5$, this means * a 10% tax on wealth in excess of 2.5. The unit is 100,000, so $w= 2.5$ means 250,000 dollars. - +``` Let's go ahead and define $h$: ```{code-cell} ipython3 @@ -242,7 +244,7 @@ num = (ln_sample - μ_hat)**2 σ_hat ``` -Let's plot the log-normal pdf using the estimated parameters against our sample data. +Let's plot the lognormal pdf using the estimated parameters against our sample data. ```{code-cell} ipython3 dist_lognorm = lognorm(σ_hat, scale = exp(μ_hat)) diff --git a/lectures/money_inflation.md b/lectures/money_inflation.md index 17ec7e0f..216a9a63 100644 --- a/lectures/money_inflation.md +++ b/lectures/money_inflation.md @@ -35,7 +35,7 @@ Our model equates the demand for money to the supply at each time $t \geq 0$. Equality between those demands and supply gives a *dynamic* model in which money supply and price level *sequences* are simultaneously determined by a set of simultaneous linear equations. -These equations take the form of what are often called vector linear **difference equations**. +These equations take the form of what is often called vector linear **difference equations**. In this lecture, we'll roll up our sleeves and solve those equations in two different ways. @@ -49,19 +49,19 @@ In this lecture we will encounter these concepts from macroeconomics: * perverse dynamics under rational expectations in which the system converges to the higher stationary inflation tax rate * a peculiar comparative stationary-state outcome connected with that stationary inflation rate: it asserts that inflation can be *reduced* by running *higher* government deficits, i.e., by raising more resources by printing money. -The same qualitive outcomes prevail in this lecture {doc}`money_inflation_nonlinear` that studies a nonlinear version of the model in this lecture. +The same qualitative outcomes prevail in this lecture {doc}`money_inflation_nonlinear` that studies a nonlinear version of the model in this lecture. These outcomes set the stage for the analysis to be presented in this lecture {doc}`laffer_adaptive` that studies a nonlinear version of the present model; it assumes a version of "adaptive expectations" instead of rational expectations. That lecture will show that * replacing rational expectations with adaptive expectations leaves the two stationary inflation rates unchanged, but that $\ldots$ -* it reverse the pervese dynamics by making the *lower* stationary inflation rate the one to which the system typically converges +* it reverses the perverse dynamics by making the *lower* stationary inflation rate the one to which the system typically converges * a more plausible comparative dynamic outcome emerges in which now inflation can be *reduced* by running *lower* government deficits -This outcome will be used to justify a selection of a stationary inflation rate that underlies the analysis of unpleasant monetarist arithmetic to be studies in this lecture {doc}`unpleasant`. +This outcome will be used to justify a selection of a stationary inflation rate that underlies the analysis of unpleasant monetarist arithmetic to be studied in this lecture {doc}`unpleasant`. -We'll use theses tools from linear algebra: +We'll use these tools from linear algebra: * matrix multiplication * matrix inversion @@ -349,7 +349,7 @@ g2 = seign(msm.R_l, msm) print(f'R_l, g_l = {msm.R_l:.4f}, {g2:.4f}') ``` -Now let's compute the maximum steady-state amount of seigniorage that could be gathered by printing money and the state state rate of return on money that attains it. +Now let's compute the maximum steady-state amount of seigniorage that could be gathered by printing money and the state-state rate of return on money that attains it. ## Two computation strategies @@ -950,7 +950,7 @@ Those dynamics are "perverse" not only in the sense that they imply that the mon ```{note} -The same qualitive outcomes prevail in this lecture {doc}`money_inflation_nonlinear` that studies a nonlinear version of the model in this lecture. +The same qualitative outcomes prevail in this lecture {doc}`money_inflation_nonlinear` that studies a nonlinear version of the model in this lecture. ``` diff --git a/lectures/money_inflation_nonlinear.md b/lectures/money_inflation_nonlinear.md index 7bd8306a..e120bdf1 100644 --- a/lectures/money_inflation_nonlinear.md +++ b/lectures/money_inflation_nonlinear.md @@ -35,14 +35,14 @@ As in that lecture, we discussed these topics: * an **inflation tax** that a government gathers by printing paper or electronic money * a dynamic **Laffer curve** in the inflation tax rate that has two stationary equilibria * perverse dynamics under rational expectations in which the system converges to the higher stationary inflation tax rate -* a peculiar comparative stationary-state analysis connected with that stationary inflation rate that assert that inflation can be *reduced* by running *higher* government deficits +* a peculiar comparative stationary-state analysis connected with that stationary inflation rate that asserts that inflation can be *reduced* by running *higher* government deficits These outcomes will set the stage for the analysis of {doc}`laffer_adaptive` that studies a version of the present model that uses a version of "adaptive expectations" instead of rational expectations. That lecture will show that * replacing rational expectations with adaptive expectations leaves the two stationary inflation rates unchanged, but that $\ldots$ -* it reverse the pervese dynamics by making the *lower* stationary inflation rate the one to which the system typically converges +* it reverses the perverse dynamics by making the *lower* stationary inflation rate the one to which the system typically converges * a more plausible comparative dynamic outcome emerges in which now inflation can be *reduced* by running *lower* government deficits ## The model @@ -399,7 +399,7 @@ Those dynamics are "perverse" not only in the sense that they imply that the mon * the figure indicates that inflation can be *reduced* by running *higher* government deficits, i.e., by raising more resources through printing money. ```{note} -The same qualitive outcomes prevail in {doc}`money_inflation` that studies a linear version of the model in this lecture. +The same qualitative outcomes prevail in {doc}`money_inflation` that studies a linear version of the model in this lecture. ``` We discovered that From b7730c6083c0a20adb0fd73642733ab7f8e665f9 Mon Sep 17 00:00:00 2001 From: Matt McKay Date: Thu, 15 Aug 2024 15:49:43 +1000 Subject: [PATCH 12/17] [french_revolution] [greek_square] [inflation_history] Tom's edits for July (#525) * upload french_rev from tom_edits * remove redundent files * update TOC * Tom's July 6 edits of french revolution lecture * Tom's edits of french revolution lecture July 7 * Tom's July 22 edits of french revolution lecture * revert one change in the text * rebuild with cite * update fig labels * Tom's July 23 edits of some lectures and bib file * update solution and quote directives * fix a small typo * make the last graph clearer * update style in line with style guide * update based on feedback --------- Co-authored-by: Humphrey Yang Co-authored-by: thomassargent30 Co-authored-by: Humphrey Yang <39026988+HumphreyYang@users.noreply.github.com> --- lectures/_static/quant-econ.bib | 19 +++ lectures/french_rev.md | 219 ++++++++++++++++++-------------- lectures/greek_square.md | 89 ++++++++++++- lectures/inflation_history.md | 8 +- 4 files changed, 238 insertions(+), 97 deletions(-) diff --git a/lectures/_static/quant-econ.bib b/lectures/_static/quant-econ.bib index 34cad8c4..61f867e2 100644 --- a/lectures/_static/quant-econ.bib +++ b/lectures/_static/quant-econ.bib @@ -3,6 +3,25 @@ Note: Extended Information (like abstracts, doi, url's etc.) can be found in quant-econ-extendedinfo.bib file in _static/ ### + +@book{russell2004history, + title={History of western philosophy}, + author={Russell, Bertrand}, + year={2004}, + publisher={Routledge} +} + +@article{north1989, + title={Constitutions and commitment: the evolution of institutions governing public choice in seventeenth-century England}, + author={North, Douglass C and Weingast, Barry R}, + journal={The journal of economic history}, + volume={49}, + number={4}, + pages={803--832}, + year={1989}, + publisher={Cambridge University Press} +} + @incollection{keynes1940pay, title={How to Pay for the War}, author={Keynes, John Maynard}, diff --git a/lectures/french_rev.md b/lectures/french_rev.md index 8a9c6a21..1f5aec0d 100644 --- a/lectures/french_rev.md +++ b/lectures/french_rev.md @@ -16,53 +16,47 @@ kernelspec: ## Overview -This lecture describes some monetary and fiscal features of the French Revolution (1789-1799) -described by {cite}`sargent_velde1995`. +This lecture describes some of the monetary and fiscal features of the French Revolution (1789-1799) described by {cite}`sargent_velde1995`. To finance public expenditures and service its debts, -the French Revolutionaries performed several policy experiments. +the French government embarked on policy experiments. -The Revolutionary legislators who authored these experiments were guided by their having decided to put in place monetary-fiscal policies recommended to them by theories that they believed. +The authors of these experiments had in mind theories about how government monetary and fiscal policies affected economic outcomes. -Some of those theories make contact with modern theories about monetary and fiscal policies that interest us today. +Some of those theories about monetary and fiscal policies still interest us today. -* a *tax-smoothing* model like Robert Barro's {cite}`Barro1979` +* a **tax-smoothing** model like Robert Barro's {cite}`Barro1979` - * this normative (i.e., prescriptive mode) advises a government to finance temporary war-time surges in government expenditures mostly by issuing government debt; after the war to roll over whatever debt accumulated during the war, and to increase taxes permanently by enough to finance interest payments on that post-war debt + * this normative (i.e., prescriptive model) advises a government to finance temporary war-time surges in expenditures mostly by issuing government debt, raising taxes by just enough to service the additional debt issued during the wary; then, after the war, to roll over whatever debt the government had accumulated during the war; and to increase taxes after the war permanently by just enough to finance interest payments on that post-war government debt -* *unpleasant monetarist arithmetic* like that described in {doc}`unpleasant` +* **unpleasant monetarist arithmetic** like that described in this quanteon lecture {doc}`unpleasant` - * this arithmetic governed French government debt dynamics in the decades preceding 1789 and according to leading historians set the stage for the French Revolution + * mathematics involving compound interest governed French government debt dynamics in the decades preceding 1789; according to leading historians, that arithmetic set the stage for the French Revolution -* a **real bills** theory of the effects of government open market operations in which the government *backs* its issues of paper money with valuable real property or financial assets +* a *real bills* theory of the effects of government open market operations in which the government *backs* new issues of paper money with government holdings of valuable real property or financial assets that holders of money can purchase from the government in exchange for their money. - * the Revolutionaries learned about this theory from Adam Smith's 1776 book The Wealth of Nations - and other contemporary sources + * The Revolutionaries learned about this theory from Adam Smith's 1776 book The Wealth of Nations + {cite}`smith2010wealth` and other contemporary sources - * It shaped how the Revolutionaries issued paper money called assignats from 1789 to 1791 + * It shaped how the Revolutionaries issued a paper money called **assignats** from 1789 to 1791 * a classical **gold** or **silver standard** - * Napoleon, who became head of government in 1799 used this theory to guide his monetary and fiscal policies + * Napoleon Bonaparte became head of the French government in 1799. He used this theory to guide his monetary and fiscal policies -* a classical inflation-tax theory of inflation in which Philip Cagan's demand for money studied -in this lecture {doc}`cagan_ree` is a key component +* a classical **inflation-tax** theory of inflation in which Philip Cagan's ({cite}`Cagan`) demand for money studied in this lecture {doc}`cagan_ree` is a key component - * This theory helps us explain French price level and money supply data from 1794 to 1797 s + * This theory helps explain French price level and money supply data from 1794 to 1797 -* a *legal restrictions* or *financial repression* theory of the demand for real balances +* a **legal restrictions** or **financial repression** theory of the demand for real balances - * the Twelve Members comprising the Committee of Public Safety who adminstered the Terror from June 1793 to July 1794 used this theory to guide their monetary policy - -We use matplotlib to replicate several of the graphs that {cite}`sargent_velde1995` used to portray outcomes of these experiments - ---- - + * The Twelve Members comprising the Committee of Public Safety who adminstered the Terror from June 1793 to July 1794 used this theory to shape their monetary policy +We use matplotlib to replicate several of the graphs with which {cite}`sargent_velde1995` portrayed outcomes of these experiments ## Data Sources -This lecture uses data from three spreadsheets: +This lecture uses data from three spreadsheets assembled by {cite}`sargent_velde1995`: * [datasets/fig_3.xlsx](https://github.com/QuantEcon/lecture-python-intro/blob/main/lectures/datasets/fig_3.xlsx) * [datasets/dette.xlsx](https://github.com/QuantEcon/lecture-python-intro/blob/main/lectures/datasets/dette.xlsx) * [datasets/assignat.xlsx](https://github.com/QuantEcon/lecture-python-intro/blob/main/lectures/datasets/assignat.xlsx) @@ -83,13 +77,26 @@ assignat_url = f'{base_url}assignat.xlsx' ## Government Expenditures and Taxes Collected -We'll start by using `matplotlib` to construct two graphs that will provide important historical context. + + +We'll start by using `matplotlib` to construct several graphs that will provide important historical context. + +These graphs are versions of ones that appear in {cite}`sargent_velde1995`. + +These graphs show that during the 18th century + + * government expenditures in France and Great Britain both surged during four big wars, and by comparable amounts + * In Britain, tax revenues were approximately equal to government expenditures during peace times, + but were substantially less than government expenditures during wars + * In France, even in peace time, tax revenues were substantially less than government expenditures + + ```{code-cell} ipython3 --- mystnb: figure: - caption: Military Spending in Britain and France + caption: "Military Spending in Britain and France" name: fr_fig4 --- # Read the data from Excel file @@ -125,22 +132,23 @@ During the 18th century, Britain and France fought four large wars. Britain won the first three wars and lost the fourth. -Each of those wars produced surges in both countries government expenditures that each country somehow had to finance. +Each of those wars produced surges in both countries' government expenditures that each country somehow had to finance. -{numref}`fr_fig4` shows surges in military expenditures in France (in blue) and Great Britain. +Figure {numref}`fr_fig4` shows surges in military expenditures in France (in blue) and Great Britain. during those four wars. -A remarkable aspect of {numref}`fr_fig4` is that despite having a population less than half of France's, Britain was able to finance military expenses of about the same amount as France's. +A remarkable aspect of figure {numref}`fr_fig4` is that despite having a population less than half of France's, Britain was able to finance military expenses of about the same amounts as France's. -This testifies to Britain's success in having created state institutions that could tax, spend, and borrow. +This testifies to Britain's having created state institutions that could sustain high tax collections, government spending , and government borrowing. See {cite}`north1989`. ```{code-cell} ipython3 --- mystnb: figure: - caption: Government Expenditures and Tax Revenues in Britain + caption: "Government Expenditures and Tax Revenues in Britain" name: fr_fig2 --- + # Read the data from Excel file data2 = pd.read_excel(dette_url, sheet_name='Militspe', usecols='M:X', skiprows=7, nrows=102, header=None) @@ -170,14 +178,15 @@ plt.tight_layout() plt.show() ``` -Figures {numref}`fr_fig2` and {numref}`fr_fig3` summarize British and French government fiscal policies during the century before the start the French Revolution in 1789. +Figures {numref}`fr_fig2` and {numref}`fr_fig3` summarize British and French government fiscal policies during the century before the start of the French Revolution in 1789. -Progressive forces in France before 1789 thought admired how Britain had financed its government expenditures and advocated reforms in French institutions designed to make them more like Britain's. + +Before 1789, progressive forces in France admired how Britain had financed its government expenditures and wanted to redesign French fiscal arrangements to make them more like Britain's. Figure {numref}`fr_fig2` shows government expenditures and how it was distributed among expenditures for - * civil (non military) activities + * civil (non-military) activities * debt service, i.e., interest payments * military expenditures (the yellow line minus the red line) @@ -187,35 +196,38 @@ Notice the surges in total government expenditures associated with surges in mil in these four wars * Wars against France's King Louis XIV early in the 18th century - * The War of the Spanish Succession in the 1740s + * The War of the Austrian Succession in the 1740s * The French and Indian War in the 1750's and 1760s * The American War for Independence from 1775 to 1783 -{numref}`fr_fig2` indicates that +Figure {numref}`fr_fig2` indicates that - * during times of peace, the expenditures approximately equal taxes and debt service payments neither grow nor decline over time + * during times of peace, government expenditures approximately equal taxes and debt service payments neither grow nor decline over time * during times of wars, government expenditures exceed tax revenues * the government finances the deficit of revenues relative to expenditures by issuing debt * after a war is over, the government's tax revenues exceed its non-interest expenditures by just enough to service the debt that the government issued to finance earlier deficits * thus, after a war, the government does *not* raise taxes by enough to pay off its debt * instead, it just rolls over whatever debt it inherits, raising taxes by just enough to service the interest payments on that debt -Eighteenth century British fiscal policy portrayed {numref}`fr_fig2` thus looks very much like a text-book example of a *tax-smoothing* model like Robert Barro's {cite}`Barro1979`. +Eighteenth-century British fiscal policy portrayed Figure {numref}`fr_fig2` thus looks very much like a text-book example of a *tax-smoothing* model like Robert Barro's {cite}`Barro1979`. -A striking feature of the graph is what we'll nick name a **law of gravity** for taxes and expenditures. +A striking feature of the graph is what we'll label a *law of gravity* between tax collections and government expenditures. * levels of government expenditures at taxes attract each other * while they can temporarily differ -- as they do during wars -- they come back together when peace returns + + Next we'll plot data on debt service costs as fractions of government revenues in Great Britain and France during the 18th century. ```{code-cell} ipython3 --- mystnb: figure: - caption: Ratio of debt service to taxes, Britain and France + caption: "Ratio of debt service to taxes, Britain and France" name: fr_fig1 --- + # Read the data from the Excel file data1 = pd.read_excel(dette_url, sheet_name='Debt', usecols='R:S', skiprows=5, nrows=99, header=None) @@ -234,6 +246,8 @@ plt.plot(date[index], 100 * data1[index].iloc[:, 0], # Plot the additional data plt.plot(range(1774, 1789), 100 * data1a, '*:', color='orange') +# Note about the data +# The French data before 1720 don't match up with the published version # Set the plot properties plt.gca().spines['top'].set_visible(False) plt.gca().spines['right'].set_visible(False) @@ -245,12 +259,12 @@ plt.tight_layout() plt.show() ``` -Figure {numref}`fr_fig1` shows that interest payments on government debt (i.e., so-called ''debt service'') were high fractions of government tax revenues in both Great Britain and France. +Figure {numref}`fr_fig1` shows that interest payments on government debt (i.e., so-called ''debt service'') were high fractions of government tax revenues in both Great Britain and France. + +{numref}`fr_fig2` showed us that in peace times Britain managed to balance its budget despite those large interest costs. -{numref}`fr_fig2` showed us that Britain managed to balance its budget despite those large -interest costs. +But as we'll see in our next graph, on the eve of the French Revolution in 1788, the fiscal *law of gravity* that worked so well in Britain did not working very well in France. -But as we'll see in our next graph, on the eve of the French Revolution in 1788, that fiscal policy *law of gravity* that worked so well in Britain, did not seem to be working in France. ```{code-cell} ipython3 # Read the data from the Excel file @@ -264,7 +278,7 @@ data1.replace(0, np.nan, inplace=True) --- mystnb: figure: - caption: Government Spending and Tax Revenues in France + caption: "Government Spending and Tax Revenues in France" name: fr_fig3 --- # Plot the data @@ -291,23 +305,25 @@ plt.tight_layout() plt.show() ``` -{numref}`fr_fig3` shows that in 1788 on the eve of the French Revolution government expenditures exceeded tax revenues. +{numref}`fr_fig3` shows that on the eve of the French Revolution in 1788, government expenditures exceeded tax revenues. + Especially during and after France's expenditures to help the Americans in their War of Independence from Great Britain, growing government debt service (i.e., interest payments) contributed to this situation. This was partly a consequence of the unfolding of the debt dynamics that underlies the Unpleasant Arithmetic discussed in this quantecon lecture {doc}`unpleasant`. + {cite}`sargent_velde1995` describe how the Ancient Regime that until 1788 had governed France had stable institutional features that made it difficult for the government to balance its budget. Powerful contending interests had prevented from the government from closing the gap between its -total expenditures and its tax revenues by +total expenditures and its tax revenues by either - * raising taxes - * lowering government's non debt service (i.e., non-interest) expenditures - * lowering its debt service (i.e., interest) costs by rescheduling its debt, i.e., defaulting on on part of its debt + * raising taxes, or + * lowering government's non-debt service (i.e., non-interest) expenditures, or + * lowering debt service (i.e., interest) costs by rescheduling, i.e., defaulting on some debts -The French constitution and prevailing arrangements had empowered three constituencies to block adjustments to components of the government budget constraint that they cared especially about +Precedents and prevailing French arrangements had empowered three constituencies to block adjustments to components of the government budget constraint that they cared especially about * tax payers * beneficiaries of government expenditures @@ -331,7 +347,7 @@ would bring sustained budget balance. In 1789, the Revolutionaries quickly reorganized the Estates General into a National Assembly. -A first piece of business was to address the fiscal crisis, the situation that had motivated the King to convence the Estates General. +A first piece of business was to address the fiscal crisis, the situation that had motivated the King to convene the Estates General. The Revolutionaries were not socialists or communists. @@ -350,12 +366,12 @@ This coincidence fostered a three step plan for servicing the French government * sell the church lands * use the proceeds from those sales to service or even retire French government debt -The monetary theory underlying this plan had been set out by Adam Smith in his analysis of what he called **real bills** in his 1776 book -**The Wealth of Nations** {cite}`smith2010wealth`, which many of the revolutionaries had read. +The monetary theory underlying this plan had been set out by Adam Smith in his analysis of what he called *real bills* in his 1776 book +**The Wealth of Nations** {cite}`smith2010wealth`, which many of the revolutionaries had read. -Adam Smith defined a **real bill** as a paper money note that is backed by a claims on a real asset like productive capital or inventories. +Adam Smith defined a *real bill* as a paper money note that is backed by a claims on a real asset like productive capital or inventories. -The National Assembly put togethere an ingenious institutional arrangement to implement this plan. +The National Assembly put together an ingenious institutional arrangement to implement this plan. In response to a motion by Catholic Bishop Talleyrand (an atheist), the National Assembly confiscated and nationalized Church lands. @@ -369,7 +385,7 @@ Their plan involved issuing paper notes called ''assignats'' that entitled beare These paper notes would be ''as good as silver coins'' in the sense that both were acceptable means of payment in exchange for those (formerly) church lands. -Finance Minister Necker and the Constituants of the National Assembly thus planned +Finance Minister Necker and the Constituents of the National Assembly thus planned to solve the privatization problem *and* the debt problem simultaneously by creating a new currency. @@ -383,7 +399,7 @@ Records of debates show how members of the Assembly marshaled theory and evidence to assess the likely effects of their innovation. - * Members of the Natioanl Assembly quoted David Hume and Adam Smith + * Members of the National Assembly quoted David Hume and Adam Smith * They cited John Law's System of 1720 and the American experiences with paper money fifteen years earlier as examples of how paper money schemes can go awry * Knowing pitfalls, they set out to avoid them @@ -401,9 +417,9 @@ They wanted to honor government debts -- interests of French government creditor But they set out to remake the French tax code and the administrative machinery for collecting taxes. - * they abolished all sorts of taxes - * they abolished the Ancient Regimes scheme for ''tax farming'' - * tax farming meant that the government had privatized tax collection by hiring private citizes -- so called tax farmers to collect taxes, while retaining a fraction of them as payment for their services + * they abolished many taxes + * they abolished the Ancient Regimes scheme for *tax farming* + * tax farming meant that the government had privatized tax collection by hiring private citizens -- so-called tax farmers to collect taxes, while retaining a fraction of them as payment for their services * the great chemist Lavoisier was also a tax farmer, one of the reasons that the Committee for Public Safety sent him to the guillotine in 1794 As a consequence of these tax reforms, government tax revenues declined @@ -414,7 +430,7 @@ The next figure shows this --- mystnb: figure: - caption: Index of real per capital revenues, France + caption: "Index of real per capital revenues, France" name: fr_fig5 --- # Read data from Excel file @@ -450,7 +466,7 @@ amounts during the period form 1789 to 1799. --- mystnb: figure: - caption: Spending (blue) and Revenues (orange), (real values) + caption: "Spending (blue) and Revenues (orange), (real values)" name: fr_fig11 --- # Read data from Excel file @@ -487,7 +503,7 @@ plt.tight_layout() plt.show() ``` -To cover the disrepancies between government expenditures and tax revenues revealed in {numref}`fr_fig11`, the French revolutionaries printed paper money and spent it. +To cover the discrepancies between government expenditures and tax revenues revealed in {numref}`fr_fig11`, the French revolutionaries printed paper money and spent it. The next figure shows that by printing money, they were able to finance substantial purchases of goods and services, including military goods and soldiers' pay. @@ -496,7 +512,7 @@ of goods and services, including military goods and soldiers' pay. --- mystnb: figure: - caption: Revenues raised by printing paper money notes + caption: "Revenues raised by printing paper money notes" name: fr_fig24 --- # Read data from Excel file @@ -540,11 +556,11 @@ where Notice the 1793-1794 surge in revenues raised by printing money. -* this reflects extraordinary measures that the Committee for Public Safety adopted to force citizens to accept paper money, or else. +* This reflects extraordinary measures that the Committee for Public Safety adopted to force citizens to accept paper money, or else. Also note the abrupt fall off in revenues raised by 1797 and the absence of further observations after 1797. -* this reflects the end using the printing press to raise revenues. +* This reflects the end of using the printing press to raise revenues. What French paper money entitled its holders to changed over time in interesting ways. @@ -559,7 +575,7 @@ Note that we use a log scale because the price level rose so much. --- mystnb: figure: - caption: Price Level and Price of Gold (log scale) + caption: "Price Level and Price of Gold (log scale)" name: fr_fig9 --- # Read the data from Excel file @@ -595,22 +611,23 @@ plt.show() ``` We have partioned {numref}`fr_fig9` that shows the log of the price level and {numref}`fr_fig8` -below that plots real balances $\frac{M_t}{p_t}$ into three periods that correspond to -to different monetary experiments. +below that plots real balances $\frac{M_t}{p_t}$ into three periods that correspond to different monetary experiments or *regimes*. The first period ends in the late summer of 1793, and is characterized by growing real balances and moderate inflation. The second period begins and ends -with the Terror. It is marked by high real balances, around 2,500 millions, and +with the Terror. It is marked by high real balances, around 2,500 million, and roughly stable prices. The fall of Robespierre in late July 1794 begins the third of our episodes, in which real balances decline and prices rise rapidly. We interpret -these three episodes in terms of three separate theories about money: a ''backing'' -or ''**real bills**'' theory (the text is Adam Smith {cite}`smith2010wealth`), -a legal restrictions theory ( {cite}`keynes1940pay`, {cite}`bryant1984price` ) -and a classical hyperinflation theory ({cite}`Cagan`).% +these three episodes in terms of distinct theories + +* a *backing* or *real bills* theory (the classic text for this theory is Adam Smith {cite}`smith2010wealth`) +* a legal restrictions theory ( {cite}`keynes1940pay`, {cite}`bryant1984price` ) +* a classical hyperinflation theory ({cite}`Cagan`) +* ```{note} According to the empirical definition of hyperinflation adopted by {cite}`Cagan`, beginning in the month that inflation exceeds 50 percent @@ -627,7 +644,7 @@ nearly met in one of these episodes than in the other two. --- mystnb: figure: - caption: Real balances of assignats (in gold and goods) + caption: "Real balances of assignats (in gold and goods)" name: fr_fig8 --- # Read the data from Excel file @@ -678,11 +695,11 @@ hyperinflations. -* subperiod 1: ("**real bills** period): January 1791 to July 1793 +* subperiod 1: ("*real bills* period): January 1791 to July 1793 -* subperiod 2: ("terror:): August 1793 - July 1794 +* subperiod 2: ("terror"): August 1793 - July 1794 -* subperiod 3: ("classic Cagan hyperinflation): August 1794 - March 1796 +* subperiod 3: ("classic Cagan hyperinflation"): August 1794 - March 1796 ```{code-cell} ipython3 def fit(x, y): @@ -719,7 +736,7 @@ a3_rev, b3_rev = fit(infl[44:63], bal[44:63]) --- mystnb: figure: - caption: Inflation and Real Balances + caption: "Inflation and Real Balances" name: fr_fig104 --- plt.figure() @@ -745,8 +762,7 @@ plt.tight_layout() plt.show() ``` -The three clouds of points in Figure -{numref}`fr_fig104` evidently +The three clouds of points in {numref}`fr_fig104` evidently depict different real balance-inflation relationships. Only the cloud for the @@ -754,7 +770,7 @@ third period has the inverse relationship familiar to us now from twentieth-cent hyperinflations. To bring this out, we'll use linear regressions to draw straight lines that compress the - inflation-real balance relationship for our three sub periods. + inflation-real balance relationship for our three sub-periods. Before we do that, we'll drop some of the early observations during the terror period to obtain the following graph. @@ -775,7 +791,7 @@ a3_rev, b3_rev = fit(infl[44:63], bal[44:63]) --- mystnb: figure: - caption: Inflation and Real Balances + caption: "Inflation and Real Balances" name: fr_fig104b --- plt.figure() @@ -799,14 +815,14 @@ plt.tight_layout() plt.show() ``` -Now let's regress inflation on real balances during the **real bills** period and plot the regression +Now let's regress inflation on real balances during the *real bills* period and plot the regression line. ```{code-cell} ipython3 --- mystnb: figure: - caption: Inflation and Real Balances + caption: "Inflation and Real Balances" name: fr_fig104c --- plt.figure() @@ -835,7 +851,7 @@ plt.show() The regression line in {numref}`fr_fig104c` shows that large increases in real balances of assignats (paper money) were accompanied by only modest rises in the price level, an outcome in line -with the **real bills** theory. +with the *real bills* theory. During this period, assignats were claims on church lands. @@ -851,7 +867,7 @@ line. --- mystnb: figure: - caption: Inflation and Real Balances + caption: "Inflation and Real Balances" name: fr_fig104d --- plt.figure() @@ -896,7 +912,7 @@ Cagan {cite}`Cagan`. --- mystnb: figure: - caption: Inflation and Real Balances + caption: "Inflation and Real Balances" name: fr_fig104e --- plt.figure() @@ -930,7 +946,7 @@ period of the hyperinflation. --- mystnb: figure: - caption: Inflation and Real Balances + caption: "Inflation and Real Balances" name: fr_fig104f --- plt.figure() @@ -957,5 +973,24 @@ plt.tight_layout() plt.show() ``` -{numref}`fr_fig104e` shows the results of regressing real balances on inflation during the +{numref}`fr_fig104e` shows the results of regressing real money balances on inflation during the period of the hyperinflation. + +## Hyperinflation Ends + +{cite}`sargent_velde1995` tell how in 1797 the Revolutionary government abruptly ended the inflation by + + * repudiating 2/3 of the national debt, and thereby + * eliminating the net-of-interest government defict + * no longer printing money, but instead + * using gold and silver coins as money + +In 1799, Napoleon Bonaparte became first consul and for the next 15 years used resources confiscated from conquered territories to help pay for French government expenditures. + +## Underlying Theories + +This lecture sets the stage for studying theories of inflation and the government monetary and fiscal policies that bring it about. + +A *monetarist theory of the price level* is described in this quantecon lecture {doc}`cagan_ree`. + +That lecture sets the stage for these quantecon lectures {doc}`money_inflation` and {doc}`unpleasant`. diff --git a/lectures/greek_square.md b/lectures/greek_square.md index 3ae37d38..8bf4a982 100644 --- a/lectures/greek_square.md +++ b/lectures/greek_square.md @@ -4,7 +4,7 @@ jupytext: extension: .md format_name: myst format_version: 0.13 - jupytext_version: 1.16.2 + jupytext_version: 1.16.1 kernelspec: display_name: Python 3 (ipykernel) language: python @@ -16,8 +16,16 @@ kernelspec: ## Introduction +Chapter 24 of {cite}`russell2004history` about early Greek mathematics and astronomy contains this +fascinating passage: -This lecture can be viewed as a sequel to {doc}`eigen_I`. + ```{epigraph} + The square root of 2, which was the first irrational to be discovered, was known to the early Pythagoreans, and ingenious methods of approximating to its value were discovered. The best was as follows: Form two columns of numbers, which we will call the $a$'s and the $b$'s; each starts with a $1$. The next $a$, at each stage, is formed by adding the last $a$ and the $b$ already obtained; the next $b$ is formed by adding twice the previous $a$ to the previous $b$. The first 6 pairs so obtained are $(1,1), (2,3), (5,7), (12,17), (29,41), (70,99)$. In each pair, $2 a - b$ is $1$ or $-1$. Thus $b/a$ is nearly the square root of two, and at each fresh step it gets nearer. For instance, the reader may satisy himself that the square of $99/70$ is very nearly equal to $2$. + ``` + +This lecture drills down and studies this ancient method for computing square roots by using some of the matrix algebra that we've learned in earlier quantecon lectures. + +In particular, this lecture can be viewed as a sequel to {doc}`eigen_I`. It provides an example of how eigenvectors isolate *invariant subspaces* that help construct and analyze solutions of linear difference equations. @@ -679,7 +687,7 @@ We find that the ratios converge to $\lambda_2$ in the first case and $\lambda_1 :tags: [hide-input] # Plot the ratios for y_t / y_{t-1} -fig, axs = plt.subplots(1, 2, figsize=(14, 6)) +fig, axs = plt.subplots(1, 2, figsize=(12, 6), dpi=500) # First subplot axs[0].plot(np.round(ratios_λ1, 6), @@ -715,3 +723,78 @@ All of these exploit very similar equations based on eigen decompositions. We shall encounter equations very similar to {eq}`eq:deactivate1` and {eq}`eq:deactivate2` in {doc}`money_inflation` and in many other places in dynamic economic theory. + + +## Exercise + +```{exercise-start} +:label: greek_square_ex_a +``` +Please use matrix algebra to formulate the method described by Bertrand Russell at the beginning of this lecture. + +1. Define a state vector $x_t = \begin{bmatrix} a_t \cr b_t \end{bmatrix}$. +2. Formulate a first-order vector difference equation for $x_t$ of the form $x_{t+1} = A x_t$ and +compute the matrix $A$. +3. Use the system $x_{t+1} = A x_t$ to replicate the sequence of $a_t$'s and $b_t$'s described by Bertrand Russell. +4. Compute the eigenvectors and eigenvalues of $A$ and compare them to corresponding objects computed in the text of this lecture. + +```{exercise-end} +``` + +```{solution-start} greek_square_ex_a +:class: dropdown +``` + +Here is one soluition. + +According to the quote, we can formulate + +$$ +\begin{aligned} +a_{t+1} &= a_t + b_t \\ +b_{t+1} &= 2a_t + b_t +\end{aligned} +$$ (eq:gs_ex1system) + +with $x_0 = \begin{bmatrix} a_0 \cr b_0 \end{bmatrix} = \begin{bmatrix} 1 \cr 1 \end{bmatrix}$ + +By {eq}`eq:gs_ex1system`, we can write matrix $A$ as + +$$ +A = \begin{bmatrix} 1 & 1 \cr + 2 & 1 \end{bmatrix} +$$ + +Then $x_{t+1} = A x_t$ for $t \in \{0, \dots, 5\}$ + +```{code-cell} ipython3 +# Define the matrix A +A = np.array([[1, 1], + [2, 1]]) + +# Initial vector x_0 +x_0 = np.array([1, 1]) + +# Number of iterations +n = 6 + +# Generate the sequence +xs = np.array([x_0]) +x_t = x_0 +for _ in range(1, n): + x_t = A @ x_t + xs = np.vstack([xs, x_t]) + +# Print the sequence +for i, (a_t, b_t) in enumerate(xs): + print(f"Iter {i}: a_t = {a_t}, b_t = {b_t}") + +# Compute eigenvalues and eigenvectors of A +eigenvalues, eigenvectors = np.linalg.eig(A) + +print(f'\nEigenvalues:\n{eigenvalues}') +print(f'\nEigenvectors:\n{eigenvectors}') +``` + +```{solution-end} +``` diff --git a/lectures/inflation_history.md b/lectures/inflation_history.md index 013954d4..5c5d0740 100644 --- a/lectures/inflation_history.md +++ b/lectures/inflation_history.md @@ -131,6 +131,10 @@ By staring at {numref}`lrpl` carefully, you might be able to guess when these te During these episodes, the gold/silver standard was temporarily abandoned when a government printed paper money to pay for war expenditures. +```{note} +This quantecon lecture {doc}`french_rev` describes circumstances leading up to and during the big inflation that occurred during the French Revolution. +``` + Despite these temporary lapses, a striking thing about the figure is that price levels were roughly constant over three centuries. In the early century, two other features of this data attracted the attention of [Irving Fisher](https://en.wikipedia.org/wiki/Irving_Fisher) of Yale University and [John Maynard Keynes](https://en.wikipedia.org/wiki/John_Maynard_Keynes) of Cambridge University. @@ -649,7 +653,7 @@ The US government stood ready to convert a dollar into a specified amount of gol Immediately after World War I, Hungary, Austria, Poland, and Germany were not on the gold standard. -Their currencies were “fiat” or "unbacked", meaning that they were not backed by credible government promises to convert them into gold or silver coins on demand. +Their currencies were "fiat" or "unbacked", meaning that they were not backed by credible government promises to convert them into gold or silver coins on demand. The governments printed new paper notes to pay for goods and services. @@ -665,6 +669,6 @@ Chapter 3 of {cite}`sargent2002big` described deliberate changes in policy that Each government stopped printing money to pay for goods and services once again and made its currency convertible to the US dollar or the UK pound. -The story told in {cite}`sargent2002big` is grounded in a "monetarist theory of the price level" described in {doc}`cagan_ree` and {doc}`cagan_adaptive`. +The story told in {cite}`sargent2002big` is grounded in a *monetarist theory of the price level* described in {doc}`cagan_ree` and {doc}`cagan_adaptive`. Those lectures discuss theories about what owners of those rapidly depreciating currencies were thinking and how their beliefs shaped responses of inflation to government monetary and fiscal policies. From 659a09a891de5413868996079ad75f5cf6c19b39 Mon Sep 17 00:00:00 2001 From: Matt McKay Date: Fri, 16 Aug 2024 15:37:09 +1000 Subject: [PATCH 13/17] RMV: removes ak2 lecture and redirects to the intermediate series (#549) * RMV: removes ak2 lecture and redirects to the intermediate series * add dependency for collab run --- .github/workflows/collab.yml | 2 +- environment.yml | 1 + lectures/_config.yml | 5 +- lectures/_toc.yml | 1 - lectures/ak2.md | 1280 ---------------------------------- 5 files changed, 6 insertions(+), 1283 deletions(-) delete mode 100644 lectures/ak2.md diff --git a/.github/workflows/collab.yml b/.github/workflows/collab.yml index f2ede9bf..90595060 100644 --- a/.github/workflows/collab.yml +++ b/.github/workflows/collab.yml @@ -30,7 +30,7 @@ jobs: - name: Install Build Software shell: bash -l {0} run: | - pip install jupyter-book==0.15.1 docutils==0.17.1 quantecon-book-theme==0.7.1 sphinx-tojupyter==0.3.0 sphinxext-rediraffe==0.2.7 sphinx-exercise==0.4.1 sphinxcontrib-youtube==1.1.0 sphinx-togglebutton==0.3.1 arviz==0.13.0 sphinx_proof==0.1.3 + pip install jupyter-book==0.15.1 docutils==0.17.1 quantecon-book-theme==0.7.1 sphinx-tojupyter==0.3.0 sphinxext-rediraffe==0.2.7 sphinx-exercise==0.4.1 sphinxcontrib-youtube==1.1.0 sphinx-togglebutton==0.3.1 arviz==0.13.0 sphinx_proof==0.1.3 sphinx_reredirects==0.1.3 # Build of HTML (Execution Testing) - name: Build HTML shell: bash -l {0} diff --git a/environment.yml b/environment.yml index d834b6a3..d9b55519 100644 --- a/environment.yml +++ b/environment.yml @@ -17,6 +17,7 @@ dependencies: - ghp-import==1.1.0 - sphinxcontrib-youtube==1.1.0 - sphinx-togglebutton==0.3.1 + - sphinx_reredirects==0.1.3 # Sandpit Requirements # - PuLP # - cvxpy diff --git a/lectures/_config.yml b/lectures/_config.yml index 59ada928..d16319ad 100644 --- a/lectures/_config.yml +++ b/lectures/_config.yml @@ -35,7 +35,7 @@ latex: targetname: quantecon-python-intro.tex sphinx: - extra_extensions: [sphinx_multitoc_numbering, sphinxext.rediraffe, sphinx_exercise, sphinx_togglebutton, sphinx.ext.intersphinx, sphinx_proof, sphinx_tojupyter] + extra_extensions: [sphinx_multitoc_numbering, sphinxext.rediraffe, sphinx_exercise, sphinx_togglebutton, sphinx.ext.intersphinx, sphinx_proof, sphinx_tojupyter, sphinx_reredirects] config: bibtex_reference_style: author_year # false-positive links @@ -110,6 +110,9 @@ sphinx: mathjax_path: https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js rediraffe_redirects: index_toc.md: intro.md + # Remote Redirects + redirects: + ak2: https://python.quantecon.org/ak2.html tojupyter_static_file_path: ["_static"] tojupyter_target_html: true tojupyter_urlpath: "https://intro.quantecon.org/" diff --git a/lectures/_toc.yml b/lectures/_toc.yml index 220ba830..8e4de355 100644 --- a/lectures/_toc.yml +++ b/lectures/_toc.yml @@ -56,7 +56,6 @@ parts: - file: unpleasant - file: money_inflation_nonlinear - file: laffer_adaptive - - file: ak2 - caption: Stochastic Dynamics numbered: true chapters: diff --git a/lectures/ak2.md b/lectures/ak2.md deleted file mode 100644 index 67726502..00000000 --- a/lectures/ak2.md +++ /dev/null @@ -1,1280 +0,0 @@ ---- -jupytext: - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.14.1 -kernelspec: - display_name: Python 3 (ipykernel) - language: python - name: python3 ---- - -# Transitions in an Overlapping Generations Model - -In addition to what’s in Anaconda, this lecture will need the following libraries: - -```{code-cell} ipython3 -:tags: [hide-output] -!pip install --upgrade quantecon -``` - -## Introduction - - -This lecture presents a life-cycle model consisting of overlapping generations of two-period lived people proposed by Peter Diamond -{cite}`diamond1965national`. - -We'll present the version that was analyzed in chapter 2 of Auerbach and -Kotlikoff (1987) {cite}`auerbach1987dynamic`. - -Auerbach and Kotlikoff (1987) used their two period model as a warm-up for their analysis of overlapping generation models of long-lived people that is the main topic of their book. - -Their model of two-period lived overlapping generations is a useful starting point because - -* it sets forth the structure of interactions between generations of different agents who are alive at a given date -* it activates forces and tradeoffs confronting the government and successive generations of people -* it is good laboratory for studying connections between government tax and subsidy programs and for policies for issuing and servicing government debt -* some interesting experiments involving transitions from one steady state to another can be computed by hand -* it is a good setting for illustrating a **shooting method** for solving a system of non-linear difference equations with initial and terminal condition - - ```{note} -Auerbach and Kotlikoff use computer code to calculate transition paths for their models with long-lived people. -``` - -We take the liberty of extending Auerbach and Kotlikoff's chapter 2 model to study some arrangements for redistributing resources across generations - - * these take the form of a sequence of age-specific lump sum taxes and transfers - -We study how these arrangements affect capital accumulation and government debt - -## Setting - -Time is discrete and is indexed by $t=0, 1, 2, \ldots$. - -The economy lives forever, but the people inside it do not. - -At each time $ t \geq 0$ a representative old person and a representative young person are alive. - -At time $t$ a representative old person coexists with a representative young person who will become an old person at time $t+1$. - -We assume that the population size is constant over time. - -A young person works, saves, and consumes. - -An old person dissaves and consumes, but does not work, - -A government lives forever, i.e., at $t=0, 1, 2, \ldots $. - -Each period $t \geq 0$, the government taxes, spends, transfers, and borrows. - - - - -Initial conditions set outside the model at time $t=0$ are - -* $K_0$ -- initial capital stock brought into time $t=0$ by a representative initial old person -* $D_0$ -- government debt falling due at $t=0$ and owned by a representative old person at time $t=0$ - -$K_0$ and $D_0$ are both measured in units of time $0$ goods. - -A government **policy** consists of five sequences $\{G_t, D_t, \tau_t, \delta_{ot}, \delta_{yt}\}_{t=0}^\infty $ whose components are - - * $\tau_t$ -- flat rate tax at time $t$ on wages and earnings from capital and government bonds - * $D_t$ -- one-period government bond principal due at time $t$, per capita - * $G_t$ -- government purchases of goods at time $t$, per capita - * $\delta_{yt}$ -- a lump sum tax on each young person at time $t$ - * $\delta_{ot}$ -- a lump sum tax on each old person at time $t$ - - - -An **allocation** is a collection of sequences $\{C_{yt}, C_{ot}, K_{t+1}, L_t, Y_t, G_t\}_{t=0}^\infty $; constituents of the sequences include - - * $K_t$ -- physical capital per capita - * $L_t$ -- labor per capita - * $Y_t$ -- output per capita - -and also - -* $C_{yt}$ -- consumption of young person at time $t \geq 0$ -* $C_{ot}$ -- consumption of old person at time $t \geq 0$ -* $K_{t+1} - K_t \equiv I_t $ -- investment in physical capital at time $t \geq 0$ -* $G_t$ -- government purchases - -National income and product accounts consist of a sequence of equalities - -* $Y_t = C_{yt} + C_{ot} + (K_{t+1} - K_t) + G_t, \quad t \geq 0$ - -A **price system** is a pair of sequences $\{W_t, r_t\}_{t=0}^\infty$; constituents of a price sequence include rental rates for the factors of production - -* $W_t$ -- rental rate for labor at time $t \geq 0$ -* $r_t$ -- rental rate for capital at time $t \geq 0$ - - -## Production - -There are two factors of production, physical capital $K_t$ and labor $L_t$. - -Capital does not depreciate. - -The initial capital stock $K_0$ is owned by the representative initial old person, who rents it to the firm at time $0$. - -Net investment rate $I_t$ at time $t$ is - -$$ -I_t = K_{t+1} - K_t -$$ - -The capital stock at time $t$ emerges from cumulating past rates of investment: - -$$ -K_t = K_0 + \sum_{s=0}^{t-1} I_s -$$ - -A Cobb-Douglas technology converts physical capital $K_t$ and labor services $L_t$ into -output $Y_t$ - -$$ -Y_t = K_t^\alpha L_t^{1-\alpha}, \quad \alpha \in (0,1) -$$ (eq:prodfn) - - -## Government - -At time $t-1$, the government issues one-period risk-free debt that promises to pay $D_t$ time $t$ goods per capita at time $t$. - -Young people at time $t$ purchase government debt $D_{t+1}$ that matures at time $t+1$. - -Government debt issued at $t$ bears a before-tax net rate of interest rate of $r_{t}$ at time $t+1$. - -The government budget constraint at time $t \geq 0$ is - -$$ -D_{t+1} - D_t = r_t D_t + G_t - T_t -$$ - -or - - - - -$$ -D_{t+1} = (1 + r_t) D_t + G_t - T_t . -$$ (eq:govbudgetsequence) - -Total tax collections net of transfers equal $T_t$ and satisfy - - -$$ -T_t = \tau_t W_t L_t + \tau_t r_t (D_t + K_t) + \delta_{yt} + \delta_{ot} -$$ - - - - -## Activities in Factor Markets - -**Old people:** At each $t \geq 0$, a representative old person - - * brings $K_t$ and $D_t$ into the period, - * rents capital to a representative firm for $r_{t} K_t$, - * pays taxes $\tau_t r_t (K_t+ D_t)$ on its rental and interest earnings, - * pays a lump sum tax $\delta_{ot}$ to the government, - * sells $K_t$ to a young person. - - - **Young people:** At each $t \geq 0$, a representative young person - * sells one unit of labor services to a representative firm for $W_t$ in wages, - * pays taxes $\tau_t W_t$ on its labor earnings - * pays a lump sum tax $\delta_{yt}$ to the goverment, - * spends $C_{yt}$ on consumption, - * acquires non-negative assets $A_{t+1}$ consisting of a sum of physical capital $K_{t+1}$ and one-period government bonds $D_{t+1}$ that mature at $t+1$. - -```{note} -If a lump-sum tax is negative, it means that the government pays the person a subsidy. -``` - - -## Representative firm's problem - -The representative firm hires labor services from young people at competitive wage rate $W_t$ and hires capital from old people at competitive rental rate -$r_t$. - -The rental rate on capital $r_t$ equals the interest rate on government one-period bonds. - -Units of the rental rates are: - -* for $W_t$, output at time $t$ per unit of labor at time $t$ -* for $r_t$, output at time $t$ per unit of capital at time $t$ - - -We take output at time $t$ as *numeraire*, so the price of output at time $t$ is one. - -The firm's profits at time $t$ are - -$$ -K_t^\alpha L_t^{1-\alpha} - r_t K_t - W_t L_t . -$$ - -To maximize profits a firm equates marginal products to rental rates: - -$$ -\begin{aligned} -W_t & = (1-\alpha) K_t^\alpha L_t^{-\alpha} \\ -r_t & = \alpha K_t^\alpha L_t^{1-\alpha} -\end{aligned} -$$ (eq:firmfonc) - -Output can be consumed either by old people or young people; or sold to young people who use it to augment the capital stock; or sold to the government for uses that do not generate utility for the people in the model (i.e., ``it is thrown into the ocean''). - - -The firm thus sells output to old people, young people, and the government. - - - - - - - - - -## Individuals' problems - -### Initial old person - -At time $t=0$, a representative initial old person is endowed with $(1 + r_0(1 - \tau_0)) A_0$ in initial assets. - -It must pay a lump sum tax to (if positive) or receive a subsidy from (if negative) -$\delta_{ot}$ the government. - -An old person's budget constraint is - - - -$$ -C_{o0} = (1 + r_0 (1 - \tau_0)) A_0 - \delta_{ot} . -$$ (eq:hbudgetold) - -An initial old person's utility function is $C_{o0}$, so the person's optimal consumption plan -is provided by equation {eq}`eq:hbudgetold`. - -### Young person - -At each $t \geq 0$, a young person inelastically supplies one unit of labor and in return -receives pre-tax labor earnings of $W_t$ units of output. - -A young person's post-tax-and-transfer earnings are $W_t (1 - \tau_t) - \delta_{yt}$. - -At each $t \geq 0$, a young person chooses a consumption plan $C_{yt}, C_{ot+1}$ -to maximize the Cobb-Douglas utility function - -$$ -U_t = C_{yt}^\beta C_{o,t+1}^{1-\beta}, \quad \beta \in (0,1) -$$ (eq:utilfn) - -subject to the following budget constraints at times $t$ and $t+1$: - -$$ -\begin{aligned} -C_{yt} + A_{t+1} & = W_t (1 - \tau_t) - \delta_{yt} \\ -C_{ot+1} & = (1+ r_{t+1} (1 - \tau_{t+1}))A_{t+1} - \delta_{ot} -\end{aligned} -$$ (eq:twobudgetc) - - -Solving the second equation of {eq}`eq:twobudgetc` for savings $A_{t+1}$ and substituting it into the first equation implies the present value budget constraint - -$$ -C_{yt} + \frac{C_{ot+1}}{1 + r_{t+1}(1 - \tau_{t+1})} = W_t (1 - \tau_t) - \delta_{yt} - \frac{\delta_{ot}}{1 + r_{t+1}(1 - \tau_{t+1})} -$$ (eq:onebudgetc) - -To solve the young person's choice problem, form a Lagrangian - -$$ -\begin{aligned} -{\mathcal L} & = C_{yt}^\beta C_{o,t+1}^{1-\beta} \\ & + \lambda \Bigl[ C_{yt} + \frac{C_{ot+1}}{1 + r_{t+1}(1 - \tau_{t+1})} - W_t (1 - \tau_t) + \delta_{yt} + \frac{\delta_{ot}}{1 + r_{t+1}(1 - \tau_{t+1})}\Bigr], -\end{aligned} -$$ (eq:lagC) - -where $\lambda$ is a Lagrange multiplier on the intertemporal budget constraint {eq}`eq:onebudgetc`. - - -After several lines of algebra, the intertemporal budget constraint {eq}`eq:onebudgetc` and the first-order conditions for maximizing ${\mathcal L}$ with respect to $C_{yt}, C_{ot+1}$ -imply that an optimal consumption plan satisfies - -$$ -\begin{aligned} -C_{yt} & = \beta \Bigl[ W_t (1 - \tau_t) - \delta_{yt} - \frac{\delta_{ot}}{1 + r_{t+1}(1 - \tau_{t+1})}\Bigr] \\ -\frac{C_{0t+1}}{1 + r_{t+1}(1-\tau_{t+1}) } & = (1-\beta) \Bigl[ W_t (1 - \tau_t) - \delta_{yt} - \frac{\delta_{ot}}{1 + r_{t+1}(1 - \tau_{t+1})}\Bigr] -\end{aligned} -$$ (eq:optconsplan) - -The first-order condition for minimizing Lagrangian {eq}`eq:lagC` with respect to the Lagrange multipler $\lambda$ recovers the budget constraint {eq}`eq:onebudgetc`, -which, using {eq}`eq:optconsplan` gives the optimal savings plan - -$$ -A_{t+1} = (1-\beta) [ (1- \tau_t) W_t - \delta_{yt}] + \beta \frac{\delta_{ot}}{1 + r_{t+1}(1 - \tau_{t+1})} -$$ (eq:optsavingsplan) - - -(sec-equilibrium)= -## Equilbrium - -**Definition:** An equilibrium is an allocation, a government policy, and a price system with the properties that -* given the price system and the government policy, the allocation solves - * representative firms' problems for $t \geq 0$ - * individual persons' problems for $t \geq 0$ -* given the price system and the allocation, the government budget constraint is satisfied for all $t \geq 0$. - - -## Next steps - - -To begin our analysis of equilibrium outcomes, we'll study the special case of the model with which Auerbach and -Kotlikoff (1987) {cite}`auerbach1987dynamic` began their analysis in chapter 2. - -It can be solved by hand. - -We shall do that next. - -After we derive a closed form solution, we'll pretend that we don't know and will compute equilibrium outcome paths. - -We'll do that by first formulating an equilibrium as a fixed point of a mapping from sequences of factor prices and tax rates to sequences of factor prices and tax rates. - -We'll compute an equilibrium by iterating to convergence on that mapping. - - -## Closed form solution - -To get the special chapter 2 case of Auerbach and Kotlikoff (1987) {cite}`auerbach1987dynamic`, we set both $\delta_{ot}$ and $\delta_{yt}$ to zero. - -As our special case of {eq}`eq:optconsplan`, we compute the following consumption-savings plan for a representative young person: - - -$$ -\begin{aligned} -C_{yt} & = \beta (1 - \tau_t) W_t \\ -A_{t+1} &= (1-\beta) (1- \tau_t) W_t -\end{aligned} -$$ - -Using {eq}`eq:firmfonc` and $A_t = K_t + D_t$, we obtain the following closed form transition law for capital: - -$$ -K_{t+1}=K_{t}^{\alpha}\left(1-\tau_{t}\right)\left(1-\alpha\right)\left(1-\beta\right) - D_{t}\\ -$$ (eq:Klawclosed) - -### Steady states - -From {eq}`eq:Klawclosed` and the government budget constraint {eq}`eq:govbudgetsequence`, we compute **time-invariant** or **steady state values** $\hat K, \hat D, \hat T$: - -$$ -\begin{aligned} -\hat{K} &=\hat{K}\left(1-\hat{\tau}\right)\left(1-\alpha\right)\left(1-\beta\right) - \hat{D} \\ -\hat{D} &= (1 + \hat{r}) \hat{D} + \hat{G} - \hat{T} \\ -\hat{T} &= \hat{\tau} \hat{Y} + \hat{\tau} \hat{r} \hat{D} . -\end{aligned} -$$ (eq:steadystates) - -These imply - -$$ -\begin{aligned} -\hat{K} &= \left[\left(1-\hat{\tau}\right)\left(1-\alpha\right)\left(1-\beta\right)\right]^{\frac{1}{1-\alpha}} \\ -\hat{\tau} &= \frac{\hat{G} + \hat{r} \hat{D}}{\hat{Y} + \hat{r} \hat{D}} -\end{aligned} -$$ - -Let's take an example in which - -1. there is no initial government debt, $D_t=0$, -2. government consumption $G_t$ equals $15\%$ of output $Y_t$ - -Our formulas for steady-state values tell us that - -$$ -\begin{aligned} -\hat{D} &= 0 \\ -\hat{G} &= 0.15 \hat{Y} \\ -\hat{\tau} &= 0.15 \\ -\end{aligned} -$$ - - - -### Implementation - -```{code-cell} ipython3 -import numpy as np -import matplotlib.pyplot as plt -from numba import njit -from quantecon.optimize import brent_max -``` - - -For parameters $\alpha = 0.3$ and $\beta = 0.5$, let's compute $\hat{K}$: - -```{code-cell} ipython3 -# parameters -α = 0.3 -β = 0.5 - -# steady states of τ and D -τ_hat = 0.15 -D_hat = 0. - -# solve for steady state of K -K_hat = ((1 - τ_hat) * (1 - α) * (1 - β)) ** (1 / (1 - α)) -K_hat -``` -Knowing $\hat K$, we can calculate other equilibrium objects. - -Let's first define some Python helper functions. - -```{code-cell} ipython3 -@njit -def K_to_Y(K, α): - - return K ** α - -@njit -def K_to_r(K, α): - - return α * K ** (α - 1) - -@njit -def K_to_W(K, α): - - return (1 - α) * K ** α - -@njit -def K_to_C(K, D, τ, r, α, β): - - # optimal consumption for the old when δ=0 - A = K + D - Co = A * (1 + r * (1 - τ)) - - # optimal consumption for the young when δ=0 - W = K_to_W(K, α) - Cy = β * W * (1 - τ) - - return Cy, Co -``` - -We can use these helper functions to obtain steady state values $\hat{Y}$, $\hat{r}$, and $\hat{W}$ associated with steady state values $\hat{K}$ and $\hat{r}$. - -```{code-cell} ipython3 -Y_hat, r_hat, W_hat = K_to_Y(K_hat, α), K_to_r(K_hat, α), K_to_W(K_hat, α) -Y_hat, r_hat, W_hat -``` - -Since steady state government debt $\hat{D}$ is $0$, all taxes are used to pay for government expenditures - -```{code-cell} ipython3 -G_hat = τ_hat * Y_hat -G_hat -``` - -We use the optimal consumption plans to find steady state consumptions for young and old - -```{code-cell} ipython3 -Cy_hat, Co_hat = K_to_C(K_hat, D_hat, τ_hat, r_hat, α, β) -Cy_hat, Co_hat -``` - -Let's store the steady state quantities and prices using an array called `init_ss` - -```{code-cell} ipython3 -init_ss = np.array([K_hat, Y_hat, Cy_hat, Co_hat, # quantities - W_hat, r_hat, # prices - τ_hat, D_hat, G_hat # policies - ]) -``` - - -### Transitions - - - -We have computed a steady state in which the government policy sequences are each constant over time. - - -We'll use this steady state as an initial condition at time $t=0$ for another economy in which government policy sequences are with time-varying sequences. - -To make sense of our calculation, we'll treat $t=0$ as time when a huge unanticipated shock occurs in the form of - - * a time-varying government policy sequences that disrupts an original steady state - * new government policy sequences are eventually time-invariant in the sense that after some date $T >0$, each sequence is constant over time. - * sudden revelation of a new government policy in the form of sequences starting at time $t=0$ - -We assume that everyone, including old people at time $t=0$, knows the new government policy sequence and chooses accordingly. - - - - -As the capital stock and other aggregates adjust to the fiscal policy change over time, the economy will approach a new steady state. - -We can find a transition path from an old steady state to a new steady state by employing a fixed-point algorithm in a space of sequences. - -But in our special case with its closed form solution, we have available a simpler and faster -approach. - -Here we define a Python class `ClosedFormTrans` that computes length $T$ transition path in response to a particular fiscal policy change. - -We choose $T$ large enough so that we have gotten very close to a new steady state after $T$ periods. - -The class takes three keyword arguments, `τ_pol`, `D_pol`, and `G_pol`. - -These are sequences of tax rate, government debt level, and government purchases, respectively. - -In each policy experiment below, we will pass two out of three as inputs required to depict a fiscal policy. - -We'll then compute the single remaining undetermined policy variable from the government budget constraint. - -When we simulate transition paths, it is useful to distinguish **state variables** at time $t$ such as $K_t, Y_t, D_t, W_t, r_t$ from **control variables** that include $C_{yt}, C_{ot}, \tau_{t}, G_t$. - -```{code-cell} ipython3 -class ClosedFormTrans: - """ - This class simulates length T transitional path of a economy - in response to a fiscal policy change given its initial steady - state. The simulation is based on the closed form solution when - the lump sum taxations are absent. - - """ - - def __init__(self, α, β): - - self.α, self.β = α, β - - def simulate(self, - T, # length of transitional path to simulate - init_ss, # initial steady state - τ_pol=None, # sequence of tax rates - D_pol=None, # sequence of government debt levels - G_pol=None): # sequence of government purchases - - α, β = self.α, self.β - - # unpack the steady state variables - K_hat, Y_hat, Cy_hat, Co_hat = init_ss[:4] - W_hat, r_hat = init_ss[4:6] - τ_hat, D_hat, G_hat = init_ss[6:9] - - # initialize array containers - # K, Y, Cy, Co - quant_seq = np.empty((T+1, 4)) - - # W, r - price_seq = np.empty((T+1, 2)) - - # τ, D, G - policy_seq = np.empty((T+2, 3)) - - # t=0, starting from steady state - K0, Y0 = K_hat, Y_hat - W0, r0 = W_hat, r_hat - D0 = D_hat - - # fiscal policy - if τ_pol is None: - D1 = D_pol[1] - G0 = G_pol[0] - τ0 = (G0 + (1 + r0) * D0 - D1) / (Y0 + r0 * D0) - elif D_pol is None: - τ0 = τ_pol[0] - G0 = G_pol[0] - D1 = (1 + r0) * D0 + G0 - τ0 * (Y0 + r0 * D0) - elif G_pol is None: - D1 = D_pol[1] - τ0 = τ_pol[0] - G0 = τ0 * (Y0 + r0 * D0) + D1 - (1 + r0) * D0 - - # optimal consumption plans - Cy0, Co0 = K_to_C(K0, D0, τ0, r0, α, β) - - # t=0 economy - quant_seq[0, :] = K0, Y0, Cy0, Co0 - price_seq[0, :] = W0, r0 - policy_seq[0, :] = τ0, D0, G0 - policy_seq[1, 1] = D1 - - # starting from t=1 to T - for t in range(1, T+1): - - # transition of K - K_old, τ_old = quant_seq[t-1, 0], policy_seq[t-1, 0] - D = policy_seq[t, 1] - K = K_old ** α * (1 - τ_old) * (1 - α) * (1 - β) - D - - # output, capital return, wage - Y, r, W = K_to_Y(K, α), K_to_r(K, α), K_to_W(K, α) - - # to satisfy the government budget constraint - if τ_pol is None: - D = D_pol[t] - D_next = D_pol[t+1] - G = G_pol[t] - τ = (G + (1 + r) * D - D_next) / (Y + r * D) - elif D_pol is None: - τ = τ_pol[t] - G = G_pol[t] - D = policy_seq[t, 1] - D_next = (1 + r) * D + G - τ * (Y + r * D) - elif G_pol is None: - D = D_pol[t] - D_next = D_pol[t+1] - τ = τ_pol[t] - G = τ * (Y + r * D) + D_next - (1 + r) * D - - # optimal consumption plans - Cy, Co = K_to_C(K, D, τ, r, α, β) - - # store time t economy aggregates - quant_seq[t, :] = K, Y, Cy, Co - price_seq[t, :] = W, r - policy_seq[t, 0] = τ - policy_seq[t+1, 1] = D_next - policy_seq[t, 2] = G - - self.quant_seq = quant_seq - self.price_seq = price_seq - self.policy_seq = policy_seq - - return quant_seq, price_seq, policy_seq - - def plot(self): - - quant_seq = self.quant_seq - price_seq = self.price_seq - policy_seq = self.policy_seq - - fig, axs = plt.subplots(3, 3, figsize=(14, 10)) - - # quantities - for i, name in enumerate(['K', 'Y', 'Cy', 'Co']): - ax = axs[i//3, i%3] - ax.plot(range(T+1), quant_seq[:T+1, i], label=name) - ax.hlines(init_ss[i], 0, T+1, color='r', linestyle='--') - ax.legend() - ax.set_xlabel('t') - - # prices - for i, name in enumerate(['W', 'r']): - ax = axs[(i+4)//3, (i+4)%3] - ax.plot(range(T+1), price_seq[:T+1, i], label=name) - ax.hlines(init_ss[i+4], 0, T+1, color='r', linestyle='--') - ax.legend() - ax.set_xlabel('t') - - # policies - for i, name in enumerate(['τ', 'D', 'G']): - ax = axs[(i+6)//3, (i+6)%3] - ax.plot(range(T+1), policy_seq[:T+1, i], label=name) - ax.hlines(init_ss[i+6], 0, T+1, color='r', linestyle='--') - ax.legend() - ax.set_xlabel('t') -``` - -We can create an instance `closed` for model parameters $\{\alpha, \beta\}$ and use it for various fiscal policy experiments. - - -```{code-cell} ipython3 -closed = ClosedFormTrans(α, β) -``` - -(exp-tax-cut)= -### Experiment 1: Tax cut - -To illustrate the power of `ClosedFormTrans`, let's first experiment with the following fiscal policy change: - -1. at $t=0$, the government unexpectedly announces a one-period tax cut, $\tau_0 =(1-\frac{1}{3}) \hat{\tau}$, by issuing government debt $\bar{D}$ -2. from $t=1$, the government will keep $D_t=\bar{D}$ and adjust $\tau_{t}$ to collect taxation to pay for the government consumption and interest payments on the debt -3. government consumption $G_t$ will be fixed at $0.15 \hat{Y}$ - -The following equations completely characterize the equilibrium transition path originating from the initial steady state - -$$ -\begin{aligned} -K_{t+1} &= K_{t}^{\alpha}\left(1-\tau_{t}\right)\left(1-\alpha\right)\left(1-\beta\right) - \bar{D} \\ -\tau_{0} &= (1-\frac{1}{3}) \hat{\tau} \\ -\bar{D} &= \hat{G} - \tau_0\hat{Y} \\ -\quad\tau_{t} & =\frac{\hat{G}+r_{t} \bar{D}}{\hat{Y}+r_{t} \bar{D}} -\end{aligned} -$$ - -We can simulate the transition for $20$ periods, after which the economy will be close to a new steady state. - -The first step is to prepare sequences of policy variables that describe fiscal policy. - -We must define sequences of government expenditure $\{G_t\}_{t=0}^{T}$ and debt level $\{D_t\}_{t=0}^{T+1}$ in advance, then pass them to the solver. - -```{code-cell} ipython3 -T = 20 - -# tax cut -τ0 = τ_hat * (1 - 1/3) - -# sequence of government purchase -G_seq = τ_hat * Y_hat * np.ones(T+1) - -# sequence of government debt -D_bar = G_hat - τ0 * Y_hat -D_seq = np.ones(T+2) * D_bar -D_seq[0] = D_hat -``` - -Let's use the `simulate` method of `closed` to compute dynamic transitions. - -Note that we leave `τ_pol` as `None`, since the tax rates need to be determined to satisfy the government budget constraint. - -```{code-cell} ipython3 -quant_seq1, price_seq1, policy_seq1 = closed.simulate(T, init_ss, - D_pol=D_seq, - G_pol=G_seq) -closed.plot() -``` - -We can also experiment with a lower tax cut rate, such as $0.2$. - -```{code-cell} ipython3 -# lower tax cut rate -τ0 = 0.15 * (1 - 0.2) - -# the corresponding debt sequence -D_bar = G_hat - τ0 * Y_hat -D_seq = np.ones(T+2) * D_bar -D_seq[0] = D_hat - -quant_seq2, price_seq2, policy_seq2 = closed.simulate(T, init_ss, - D_pol=D_seq, - G_pol=G_seq) -``` - -```{code-cell} ipython3 -fig, axs = plt.subplots(3, 3, figsize=(14, 10)) - -# quantities -for i, name in enumerate(['K', 'Y', 'Cy', 'Co']): - ax = axs[i//3, i%3] - ax.plot(range(T+1), quant_seq1[:T+1, i], label=name+', 1/3') - ax.plot(range(T+1), quant_seq2[:T+1, i], label=name+', 0.2') - ax.hlines(init_ss[i], 0, T+1, color='r', linestyle='--') - ax.legend() - ax.set_xlabel('t') - -# prices -for i, name in enumerate(['W', 'r']): - ax = axs[(i+4)//3, (i+4)%3] - ax.plot(range(T+1), price_seq1[:T+1, i], label=name+', 1/3') - ax.plot(range(T+1), price_seq2[:T+1, i], label=name+', 0.2') - ax.hlines(init_ss[i+4], 0, T+1, color='r', linestyle='--') - ax.legend() - ax.set_xlabel('t') - -# policies -for i, name in enumerate(['τ', 'D', 'G']): - ax = axs[(i+6)//3, (i+6)%3] - ax.plot(range(T+1), policy_seq1[:T+1, i], label=name+', 1/3') - ax.plot(range(T+1), policy_seq2[:T+1, i], label=name+', 0.2') - ax.hlines(init_ss[i+6], 0, T+1, color='r', linestyle='--') - ax.legend() - ax.set_xlabel('t') -``` - -The economy with lower tax cut rate at $t=0$ has the same transitional pattern, but is less distorted, and it converges to a new steady state with higher physical capital stock. - -(exp-expen-cut)= -### Experiment 2: Government asset accumulation - -Assume that the economy is initially in the same steady state. - -Now the government promises to cut its spending on services and goods by half $\forall t \geq 0$. - -The government targets the same tax rate $\tau_t=\hat{\tau}$ and to accumulate assets $-D_t$ over time. - -To conduct this experiment, we pass `τ_seq` and `G_seq` as inputs and let `D_pol` be determined along the path by satisfying the government budget constraint. - -```{code-cell} ipython3 -# government expenditure cut by a half -G_seq = τ_hat * 0.5 * Y_hat * np.ones(T+1) - -# targeted tax rate -τ_seq = τ_hat * np.ones(T+1) - -closed.simulate(T, init_ss, τ_pol=τ_seq, G_pol=G_seq); -closed.plot() -``` - -As the government accumulates the asset and uses it in production, the rental rate on capital falls and private investment falls. - -As a result, the ratio $-\frac{D_t}{K_t}$ of the government asset to physical capital used in production will increase over time - -```{code-cell} ipython3 -plt.plot(range(T+1), -closed.policy_seq[:-1, 1] / closed.quant_seq[:, 0]) -plt.xlabel('t') -plt.title('-D/K'); -``` - -We want to know how this policy experiment affects individuals. - -In the long run, future cohorts will enjoy higher consumption throughout their lives because they will earn higher labor income when they work. - -However, in the short run, old people suffer because increases in their labor income are not big enough to offset their losses of capital income. - -Such distinct long run and short run effects motivate us to study transition paths. - -```{note} -Although the consumptions in the new steady state are strictly higher, it is at a cost of fewer public services and goods. -``` - - -### Experiment 3: Temporary expenditure cut - -Let's now investigate a scenario in which the government also cuts its spending by half and accumulates the asset. - -But now let the government cut its expenditures only at $t=0$. - -From $t \geq 1$, the government expeditures return to $\hat{G}$ and $\tau_t$ adjusts to maintain the asset level $-D_t = -D_1$. - -```{code-cell} ipython3 -# sequence of government purchase -G_seq = τ_hat * Y_hat * np.ones(T+1) -G_seq[0] = 0 - -# sequence of government debt -D_bar = G_seq[0] - τ_hat * Y_hat -D_seq = D_bar * np.ones(T+2) -D_seq[0] = D_hat - -closed.simulate(T, init_ss, D_pol=D_seq, G_pol=G_seq); -closed.plot() -``` - -The economy quickly converges to a new steady state with higher physical capital stock, lower interest rate, higher wage rate, and higher consumptions for both the young and the old. - -Even though government expenditure $G_t$ returns to its high initial level from $t \geq 1$, the government can balance the budget at a lower tax rate because it gathers additional revenue $-r_t D_t$ from the asset accumulated during the temporary cut in the spendings. - -As in {ref}`exp-expen-cut`, old perople early in the transition periods suffer from this policy shock. - - -## A computational strategy - -With the preceding caluations, we studied dynamic transitions instigated by alternative fiscal policies. - -In all these experiments, we maintained the assumption that lump sum taxes were absent so that $\delta_{yt}=0, \delta_{ot}=0$. - -In this section, we investigate the transition dynamics when the lump sum taxes are present. - -The government will use lump sum taxes and transfers to redistribute resources across successive -generations. - -Including lump sum taxes disrupts closed form solution because of how they make optimal consumption and saving plans depend on future prices and tax rates. - -Therefore, we compute equilibrium transitional paths by finding a fixed point of a mapping from sequences to sequences. - - * that fixed point pins down an equilibrium - -To set the stage for the entry of the mapping whose fixed point we seek, we return to concepts introduced in - section {ref}`sec-equilibrium`. - - -**Definition:** Given parameters $\{\alpha$, $\beta\}$, a competitive equilibrium consists of - -* sequences of optimal consumptions $\{C_{yt}, C_{ot}\}$ -* sequences of prices $\{W_t, r_t\}$ -* sequences of capital stock and output $\{K_t, Y_t\}$ -* sequences of tax rates, government assets (debt), government purchases $\{\tau_t, D_t, G_t\, \delta_{yt}, \delta_{ot}\}$ - -with the properties that - -* given the price system and government fiscal policy, consumption plans are optimal -* the government budget constraints are satisfied for all $t$ - -An equilibrium transition path can be computed by "guessing and verifying" some endogenous sequences. - -In our {ref}`exp-tax-cut` example, sequences $\{D_t\}_{t=0}^{T}$ and $\{G_t\}_{t=0}^{T}$ are exogenous. - -In addition, we assume that the lump sum taxes $\{\delta_{yt}, \delta_{ot}\}_{t=0}^{T}$ are given and known to everybody inside the model. - -We can solve for sequences of other equilibrium sequences following the steps below - -1. guess prices $\{W_t, r_t\}_{t=0}^{T}$ and tax rates $\{\tau_t\}_{t=0}^{T}$ -2. solve for optimal consumption and saving plans $\{C_{yt}, C_{ot}\}_{t=0}^{T}$, treating the guesses of future prices and taxes as true -3. solve for transition of the capital stock $\{K_t\}_{t=0}^{T}$ -4. update the guesses for prices and tax rates with the values implied by the equilibrium conditions -5. iterate until convergence - -Let's implement this "guess and verify" approach - -We start by defining the Cobb-Douglas utility function - -```{code-cell} ipython3 -@njit -def U(Cy, Co, β): - - return (Cy ** β) * (Co ** (1-β)) -``` - -We use `Cy_val` to compute the lifetime value of an arbitrary consumption plan, $C_y$, given the intertemporal budget constraint. - -Note that it requires knowing future prices $r_{t+1}$ and tax rate $\tau_{t+1}$. - -```{code-cell} ipython3 -@njit -def Cy_val(Cy, W, r_next, τ, τ_next, δy, δo_next, β): - - # Co given by the budget constraint - Co = (W * (1 - τ) - δy - Cy) * (1 + r_next * (1 - τ_next)) - δo_next - - return U(Cy, Co, β) -``` - -An optimal consumption plan $C_y^*$ can be found by maximizing `Cy_val`. - -Here is an example that computes optimal consumption $C_y^*=\hat{C}_y$ in the steady state with $\delta_{yt}=\delta_{ot}=0,$ like one that we studied earlier - -```{code-cell} ipython3 -W, r_next, τ, τ_next = W_hat, r_hat, τ_hat, τ_hat -δy, δo_next = 0, 0 - -Cy_opt, U_opt, _ = brent_max(Cy_val, # maximand - 1e-6, # lower bound - W*(1-τ)-δy-1e-6, # upper bound - args=(W, r_next, τ, τ_next, δy, δo_next, β)) - -Cy_opt, U_opt -``` - -Let's define a Python class `AK2` that computes the transition paths with the fixed-point algorithm. - -It can handle nonzero lump sum taxes - -```{code-cell} ipython3 -class AK2(): - """ - This class simulates length T transitional path of a economy - in response to a fiscal policy change given its initial steady - state. The transitional path is found by employing a fixed point - algorithm to satisfy the equilibrium conditions. - - """ - - def __init__(self, α, β): - - self.α, self.β = α, β - - def simulate(self, - T, # length of transitional path to simulate - init_ss, # initial steady state - δy_seq, # sequence of lump sum tax for the young - δo_seq, # sequence of lump sum tax for the old - τ_pol=None, # sequence of tax rates - D_pol=None, # sequence of government debt levels - G_pol=None, # sequence of government purchases - verbose=False, - max_iter=500, - tol=1e-5): - - α, β = self.α, self.β - - # unpack the steady state variables - K_hat, Y_hat, Cy_hat, Co_hat = init_ss[:4] - W_hat, r_hat = init_ss[4:6] - τ_hat, D_hat, G_hat = init_ss[6:9] - - # K, Y, Cy, Co - quant_seq = np.empty((T+2, 4)) - - # W, r - price_seq = np.empty((T+2, 2)) - - # τ, D, G - policy_seq = np.empty((T+2, 3)) - policy_seq[:, 1] = D_pol - policy_seq[:, 2] = G_pol - - # initial guesses of prices - price_seq[:, 0] = np.ones(T+2) * W_hat - price_seq[:, 1] = np.ones(T+2) * r_hat - - # initial guesses of policies - policy_seq[:, 0] = np.ones(T+2) * τ_hat - - # t=0, starting from steady state - quant_seq[0, :2] = K_hat, Y_hat - - if verbose: - # prepare to plot iterations until convergence - fig, axs = plt.subplots(1, 3, figsize=(14, 4)) - - # containers for checking convergence - price_seq_old = np.empty_like(price_seq) - policy_seq_old = np.empty_like(policy_seq) - - # start iteration - i_iter = 0 - while True: - - if verbose: - # plot current prices at ith iteration - for i, name in enumerate(['W', 'r']): - axs[i].plot(range(T+1), price_seq[:T+1, i]) - axs[i].set_title(name) - axs[i].set_xlabel('t') - axs[2].plot(range(T+1), policy_seq[:T+1, 0], - label=f'{i_iter}th iteration') - axs[2].legend(bbox_to_anchor=(1.05, 1), loc='upper left') - axs[2].set_title('τ') - axs[2].set_xlabel('t') - - # store old prices from last iteration - price_seq_old[:] = price_seq - policy_seq_old[:] = policy_seq - - # start updating quantities and prices - for t in range(T+1): - K, Y = quant_seq[t, :2] - W, r = price_seq[t, :] - r_next = price_seq[t+1, 1] - τ, D, G = policy_seq[t, :] - τ_next, D_next, G_next = policy_seq[t+1, :] - δy, δo = δy_seq[t], δo_seq[t] - δy_next, δo_next = δy_seq[t+1], δo_seq[t+1] - - # consumption for the old - Co = (1 + r * (1 - τ)) * (K + D) - δo - - # optimal consumption for the young - out = brent_max(Cy_val, 1e-6, W*(1-τ)-δy-1e-6, - args=(W, r_next, τ, τ_next, - δy, δo_next, β)) - Cy = out[0] - - quant_seq[t, 2:] = Cy, Co - τ_num = ((1 + r) * D + G - D_next - δy - δo) - τ_denom = (Y + r * D) - policy_seq[t, 0] = τ_num / τ_denom - - # saving of the young - A_next = W * (1 - τ) - δy - Cy - - # transition of K - K_next = A_next - D_next - Y_next = K_to_Y(K_next, α) - W_next, r_next = K_to_W(K_next, α), K_to_r(K_next, α) - - quant_seq[t+1, :2] = K_next, Y_next - price_seq[t+1, :] = W_next, r_next - - i_iter += 1 - - if (np.max(np.abs(price_seq_old - price_seq)) < tol) & \ - (np.max(np.abs(policy_seq_old - policy_seq)) < tol): - if verbose: - print(f"Converge using {i_iter} iterations") - break - - if i_iter > max_iter: - if verbose: - print(f"Fail to converge using {i_iter} iterations") - break - - self.quant_seq = quant_seq - self.price_seq = price_seq - self.policy_seq = policy_seq - - return quant_seq, price_seq, policy_seq - - def plot(self): - - quant_seq = self.quant_seq - price_seq = self.price_seq - policy_seq = self.policy_seq - - fig, axs = plt.subplots(3, 3, figsize=(14, 10)) - - # quantities - for i, name in enumerate(['K', 'Y', 'Cy', 'Co']): - ax = axs[i//3, i%3] - ax.plot(range(T+1), quant_seq[:T+1, i], label=name) - ax.hlines(init_ss[i], 0, T+1, color='r', linestyle='--') - ax.legend() - ax.set_xlabel('t') - - # prices - for i, name in enumerate(['W', 'r']): - ax = axs[(i+4)//3, (i+4)%3] - ax.plot(range(T+1), price_seq[:T+1, i], label=name) - ax.hlines(init_ss[i+4], 0, T+1, color='r', linestyle='--') - ax.legend() - ax.set_xlabel('t') - - # policies - for i, name in enumerate(['τ', 'D', 'G']): - ax = axs[(i+6)//3, (i+6)%3] - ax.plot(range(T+1), policy_seq[:T+1, i], label=name) - ax.hlines(init_ss[i+6], 0, T+1, color='r', linestyle='--') - ax.legend() - ax.set_xlabel('t') -``` - -We can initialize an instance of class `AK2` with model parameters $\{\alpha, \beta\}$ and then use it to conduct fiscal policy experiments. - -```{code-cell} ipython3 -ak2 = AK2(α, β) -``` - -We first examine that the "guess and verify" method leads to the same numerical results as we obtain with the closed form solution when lump sum taxes are muted - -```{code-cell} ipython3 -δy_seq = np.ones(T+2) * 0. -δo_seq = np.ones(T+2) * 0. - -D_pol = np.zeros(T+2) -G_pol = np.ones(T+2) * G_hat - -# tax cut -τ0 = τ_hat * (1 - 1/3) -D1 = D_hat * (1 + r_hat * (1 - τ0)) + G_hat - τ0 * Y_hat - δy_seq[0] - δo_seq[0] -D_pol[0] = D_hat -D_pol[1:] = D1 -``` - -```{code-cell} ipython3 -quant_seq3, price_seq3, policy_seq3 = ak2.simulate(T, init_ss, - δy_seq, δo_seq, - D_pol=D_pol, G_pol=G_pol, - verbose=True) -``` - -```{code-cell} ipython3 -ak2.plot() -``` - -Next, we activate lump sum taxes. - -Let's alter our {ref}`exp-tax-cut` fiscal policy experiment by assuming that the government also increases lump sum taxes for both young and old people $\delta_{yt}=\delta_{ot}=0.005, t\geq0$. - -```{code-cell} ipython3 -δy_seq = np.ones(T+2) * 0.005 -δo_seq = np.ones(T+2) * 0.005 - -D1 = D_hat * (1 + r_hat * (1 - τ0)) + G_hat - τ0 * Y_hat - δy_seq[0] - δo_seq[0] -D_pol[1:] = D1 - -quant_seq4, price_seq4, policy_seq4 = ak2.simulate(T, init_ss, - δy_seq, δo_seq, - D_pol=D_pol, G_pol=G_pol) -``` - -Note how "crowding out" has been mitigated. - -```{code-cell} ipython3 -fig, axs = plt.subplots(3, 3, figsize=(14, 10)) - -# quantities -for i, name in enumerate(['K', 'Y', 'Cy', 'Co']): - ax = axs[i//3, i%3] - ax.plot(range(T+1), quant_seq3[:T+1, i], label=name+', $\delta$s=0') - ax.plot(range(T+1), quant_seq4[:T+1, i], label=name+', $\delta$s=0.005') - ax.hlines(init_ss[i], 0, T+1, color='r', linestyle='--') - ax.legend() - ax.set_xlabel('t') - -# prices -for i, name in enumerate(['W', 'r']): - ax = axs[(i+4)//3, (i+4)%3] - ax.plot(range(T+1), price_seq3[:T+1, i], label=name+', $\delta$s=0') - ax.plot(range(T+1), price_seq4[:T+1, i], label=name+', $\delta$s=0.005') - ax.hlines(init_ss[i+4], 0, T+1, color='r', linestyle='--') - ax.legend() - ax.set_xlabel('t') - -# policies -for i, name in enumerate(['τ', 'D', 'G']): - ax = axs[(i+6)//3, (i+6)%3] - ax.plot(range(T+1), policy_seq3[:T+1, i], label=name+', $\delta$s=0') - ax.plot(range(T+1), policy_seq4[:T+1, i], label=name+', $\delta$s=0.005') - ax.hlines(init_ss[i+6], 0, T+1, color='r', linestyle='--') - ax.legend() - ax.set_xlabel('t') -``` - -Comparing to {ref}`exp-tax-cut`, the government raises lump-sum taxes to finance the increasing debt interest payment, which is less distortionary comparing to raising the capital income tax rate. - - -### Experiment 4: Unfunded Social Security System - -In this experiment, lump-sum taxes are of equal magnitudes for old and the young, but of opposite signs. - -A negative lump-sum tax is a subsidy. - -Thus, in this experiment we tax the young and subsidize the old. - -We start the economy at the same initial steady state that we assumed in several earlier experiments. - -The government sets the lump sum taxes $\delta_{y,t}=-\delta_{o,t}=10\% \hat{C}_{y}$ starting from $t=0$. - -It keeps debt levels and expenditures at their steady state levels $\hat{D}$ and $\hat{G}$. - -In effect, this experiment amounts to launching an unfunded social security system. - -We can use our code to compute the transition ignited by launching this system. - -Let's compare the results to the {ref}`exp-tax-cut`. - -```{code-cell} ipython3 -δy_seq = np.ones(T+2) * Cy_hat * 0.1 -δo_seq = np.ones(T+2) * -Cy_hat * 0.1 - -D_pol[:] = D_hat - -quant_seq5, price_seq5, policy_seq5 = ak2.simulate(T, init_ss, - δy_seq, δo_seq, - D_pol=D_pol, G_pol=G_pol) -``` - -```{code-cell} ipython3 -fig, axs = plt.subplots(3, 3, figsize=(14, 10)) - -# quantities -for i, name in enumerate(['K', 'Y', 'Cy', 'Co']): - ax = axs[i//3, i%3] - ax.plot(range(T+1), quant_seq3[:T+1, i], label=name+', tax cut') - ax.plot(range(T+1), quant_seq5[:T+1, i], label=name+', transfer') - ax.hlines(init_ss[i], 0, T+1, color='r', linestyle='--') - ax.legend() - ax.set_xlabel('t') - -# prices -for i, name in enumerate(['W', 'r']): - ax = axs[(i+4)//3, (i+4)%3] - ax.plot(range(T+1), price_seq3[:T+1, i], label=name+', tax cut') - ax.plot(range(T+1), price_seq5[:T+1, i], label=name+', transfer') - ax.hlines(init_ss[i+4], 0, T+1, color='r', linestyle='--') - ax.legend() - ax.set_xlabel('t') - -# policies -for i, name in enumerate(['τ', 'D', 'G']): - ax = axs[(i+6)//3, (i+6)%3] - ax.plot(range(T+1), policy_seq3[:T+1, i], label=name+', tax cut') - ax.plot(range(T+1), policy_seq5[:T+1, i], label=name+', transfer') - ax.hlines(init_ss[i+6], 0, T+1, color='r', linestyle='--') - ax.legend() - ax.set_xlabel('t') -``` - -An initial old person benefits especially when the social security system is launched because he receives a transfer but pays nothing for it. - -But in the long run, consumption rates of both young and old people decrease because the the social security system decreases incentives to save. - -That lowers the stock of physical capital and consequently lowers output. - -The government must then raise tax rate in order to pay for its expenditures. - -The higher rate on capital income further distorts incentives to save. From 361f0b9d7e02f148ab128fc99b0344fa0146b6d9 Mon Sep 17 00:00:00 2001 From: thomassargent30 Date: Sat, 17 Aug 2024 14:56:11 -0600 Subject: [PATCH 14/17] Tom's Aug 17 edits of money_inflation_nonlinear lecture --- .../long_run_growth/tooze_ch1_graph.png | Bin 165138 -> 165144 bytes lectures/money_inflation_nonlinear.md | 127 ++++++++++-------- 2 files changed, 74 insertions(+), 53 deletions(-) diff --git a/lectures/_static/lecture_specific/long_run_growth/tooze_ch1_graph.png b/lectures/_static/lecture_specific/long_run_growth/tooze_ch1_graph.png index a3833f10307a67d173f8733e9625f8a90e478bda..3ae6891e3cc60585efed56938762ebd4a12bc0d9 100644 GIT binary patch delta 48895 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 z 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 Bf#v`J diff --git a/lectures/money_inflation_nonlinear.md b/lectures/money_inflation_nonlinear.md index e120bdf1..f716916f 100644 --- a/lectures/money_inflation_nonlinear.md +++ b/lectures/money_inflation_nonlinear.md @@ -45,7 +45,7 @@ That lecture will show that * it reverses the perverse dynamics by making the *lower* stationary inflation rate the one to which the system typically converges * a more plausible comparative dynamic outcome emerges in which now inflation can be *reduced* by running *lower* government deficits -## The model +## The Model Let @@ -70,56 +70,9 @@ where $g$ is the part of government expenditures financed by printing money. **Remark:** Please notice that while equation {eq}`eq:mdemand` is linear in logs of the money supply and price level, equation {eq}`eq:msupply` is linear in levels. This will require adapting the equilibrium computation methods that we deployed in {doc}`money_inflation`. -## Computing an equilibrium sequence -We'll deploy a method similar to *Method 2* used in {doc}`money_inflation`. - -We'll take the time $t$ state vector to be $m_t, p_t$. - -* we'll treat $m_t$ as a ''natural state variable'' and $p_t$ as a ''jump'' variable. - -Let - -$$ -\lambda \equiv \frac{\alpha}{1+ \alpha} -$$ - -Let's rewrite equation {eq}`eq:mdemand`, respectively, as - -$$ -p_t = (1-\lambda) m_{t+1} + \lambda p_{t+1} -$$ (eq:mdemand2) - -We'll summarize our algorithm with the following pseudo-code. - -**Pseudo-code** - -* start for $m_0, p_0$ at time $t =0$ - -* solve {eq}`eq:msupply` for $m_{t+1}$ - -* solve {eq}`eq:mdemand2` for $p_{t+1} = \lambda^{-1} p_t + (1 - \lambda^{-1}) m_{t+1}$ - -* compute the inflation rate $\pi_t = p_{t+1} - p_t$ and growth of money supply $\mu_t = m_{t+1} - m_t $ -* iterate on $t$ to convergence of $\pi_t \rightarrow \overline \pi$ and $\mu_t \rightarrow \overline \mu$ - -It will turn out that - -* if they exist, limiting values $\overline \pi$ and $\overline \mu$ will be equal - -* if limiting values exist, there are two possible limiting values, one high, one low - -* for almost all initial log price levels $p_0$, the limiting $\overline \pi = \overline \mu$ is -the higher value - -* for each of the two possible limiting values $\overline \pi$ ,there is a unique initial log price level $p_0$ that implies that $\pi_t = \mu_t = \overline \mu$ for all $t \geq 0$ - - * this unique initial log price level solves $\log(\exp(m_0) + g \exp(p_0)) - p_0 = - \alpha \overline \pi $ - - * the preceding equation for $p_0$ comes from $m_1 - p_0 = - \alpha \overline \pi$ - -## Limiting values of inflation rate +## Limiting Values of Inflation Rate We can compute the two prospective limiting values for $\overline \pi$ by studying the steady-state Laffer curve. @@ -203,7 +156,7 @@ print(f'The two steady state of π are: {π_l, π_u}') We find two steady state $\overline \pi$ values. -## Steady state Laffer curve +## Steady State Laffer curve The following figure plots the steady state Laffer curve together with the two stationary inflation rates. @@ -247,9 +200,16 @@ def plot_laffer(model, πs): plot_laffer(model, (π_l, π_u)) ``` -## Associated initial price levels +## Initial Price Levels + +Now that we have our hands on the two possible steady states, we can compute two functions $\underline p(m_0)$ and +$\overline p(m_0)$, which as initial conditions for $p_t$ at time $t$, imply that $\pi_t = \overline \pi $ for all $t \geq 0$. + +The function $\underline p(m_0)$ will be associated with $\pi_l$ the lower steady-state inflation rate. + +The function $\overline p(m_0)$ will be associated with $\pi_u$ the lower steady-state inflation rate. + -Now that we have our hands on the two possible steady states, we can compute two initial log price levels $p_0$, which as initial conditions, imply that $\pi_t = \overline \pi $ for all $t \geq 0$. ```{code-cell} ipython3 def solve_p0(p0, m0, α, g, π): @@ -312,7 +272,68 @@ eq_g = lambda x: np.exp(-model.α * x) - np.exp(-(1 + model.α) * x) print('eq_g == g:', np.isclose(eq_g(m_seq[-1] - m_seq[-2]), model.g)) ``` -## Slippery side of Laffer curve dynamics +## Computing an Equilibrium Sequence + +We'll deploy a method similar to *Method 2* used in {doc}`money_inflation`. + +We'll take the time $t$ state vector to be the pair $(m_t, p_t)$. + +We'll treat $m_t$ as a ``natural state variable`` and $p_t$ as a ``jump`` variable. + +Let + +$$ +\lambda \equiv \frac{\alpha}{1+ \alpha} +$$ + +Let's rewrite equation {eq}`eq:mdemand` as + +$$ +p_t = (1-\lambda) m_{t+1} + \lambda p_{t+1} +$$ (eq:mdemand2) + +We'll summarize our algorithm with the following pseudo-code. + +**Pseudo-code** + +The heart of the pseudo-code iterates on the following mapping from state vector $(m_t, p_t)$ at time $t$ +to state vector $(m_{t+1}, p_{t+1})$ at time $t+1$. + + +* starting from a given pair $(m_t, p_t)$ at time $t \geq 0$ + + * solve {eq}`eq:msupply` for $m_{t+1}$ + + * solve {eq}`eq:mdemand2` for $p_{t+1} = \lambda^{-1} p_t + (1 - \lambda^{-1}) m_{t+1}$ + + * compute the inflation rate $\pi_t = p_{t+1} - p_t$ and growth of money supply $\mu_t = m_{t+1} - m_t $ + +Next, compute the two functions $\underline p(m_0)$ and $\overline p(m_0)$ described above + +Now initiate the algorithm as follows. + + * set $m_0 >0$ + * set a value of $p_0 \in [\underline p(m_0), \overline p(m_0)]$ and form the pair $(m_0, p_0)$ at time $t =0$ + +Starting from $(m_0, p_0)$ iterate on $t$ to convergence of $\pi_t \rightarrow \overline \pi$ and $\mu_t \rightarrow \overline \mu$ + +It will turn out that + +* if they exist, limiting values $\overline \pi$ and $\overline \mu$ will be equal + +* if limiting values exist, there are two possible limiting values, one high, one low + +* for almost all initial log price levels $p_0$, the limiting $\overline \pi = \overline \mu$ is +the higher value + +* for each of the two possible limiting values $\overline \pi$ ,there is a unique initial log price level $p_0$ that implies that $\pi_t = \mu_t = \overline \mu$ for all $t \geq 0$ + + * this unique initial log price level solves $\log(\exp(m_0) + g \exp(p_0)) - p_0 = - \alpha \overline \pi $ + + * the preceding equation for $p_0$ comes from $m_1 - p_0 = - \alpha \overline \pi$ + + +## Slippery Side of Laffer Curve Dynamics We are now equipped to compute time series starting from different $p_0$ settings, like those in {doc}`money_inflation`. From cd80bfae94e782a8ec4960c69ed0beeecb8b90c6 Mon Sep 17 00:00:00 2001 From: Humphrey Yang <39026988+HumphreyYang@users.noreply.github.com> Date: Tue, 20 Aug 2024 10:10:51 +1000 Subject: [PATCH 15/17] [time_series_with_matrices] Address feedbacks (#534) * address feedbacks from reading group * update based on feedback * remove "for" --- lectures/time_series_with_matrices.md | 66 +++++++++++++++------------ 1 file changed, 36 insertions(+), 30 deletions(-) diff --git a/lectures/time_series_with_matrices.md b/lectures/time_series_with_matrices.md index 1e88336d..e73566ce 100644 --- a/lectures/time_series_with_matrices.md +++ b/lectures/time_series_with_matrices.md @@ -4,7 +4,7 @@ jupytext: extension: .md format_name: myst format_version: 0.13 - jupytext_version: 1.16.2 + jupytext_version: 1.16.1 kernelspec: display_name: Python 3 (ipykernel) language: python @@ -49,7 +49,12 @@ We will use the following imports: import numpy as np import matplotlib.pyplot as plt from matplotlib import cm -plt.rcParams["figure.figsize"] = (11, 5) #set default figure size + +# Custom figsize for this lecture +plt.rcParams["figure.figsize"] = (11, 5) + +# Set decimal printing to 3 decimal places +np.set_printoptions(precision=3, suppress=True) ``` ## Samuelson's model @@ -142,8 +147,8 @@ T = 80 α_1 = 1.53 α_2 = -.9 -y_neg1 = 28. # y_{-1} -y_0 = 24. +y_neg1 = 28.0 # y_{-1} +y_0 = 24.0 ``` Now we construct $A$ and $b$. @@ -197,6 +202,13 @@ point precision: np.allclose(y, y_second_method) ``` +$A$ is invertible as it is lower triangular and [its diagonal entries are non-zero](https://www.statlect.com/matrix-algebra/triangular-matrix) + +```{code-cell} ipython3 +# Check if A is lower triangular +np.allclose(A, np.tril(A)) +``` + ```{note} In general, `np.linalg.solve` is more numerically stable than using `np.linalg.inv` directly. @@ -392,7 +404,13 @@ class population_moments: Parameters: α_0, α_1, α_2, T, y_neg1, y_0 """ - def __init__(self, α_0, α_1, α_2, T, y_neg1, y_0, σ_u): + def __init__(self, α_0=10.0, + α_1=1.53, + α_2=-.9, + T=80, + y_neg1=28.0, + y_0=24.0, + σ_u=1): # compute A A = np.identity(T) @@ -437,8 +455,7 @@ class population_moments: return self.μ_y, self.Σ_y -series_process = population_moments( - α_0=10.0, α_1=1.53, α_2=-.9, T=80, y_neg1=28., y_0=24., σ_u=1) +series_process = population_moments() μ_y, Σ_y = series_process.get_moments() A_inv = series_process.A_inv @@ -483,12 +500,17 @@ Notice how the population variance increases and asymptotes. Let's print out the covariance matrix $\Sigma_y$ for a time series $y$. ```{code-cell} ipython3 -series_process = population_moments( - α_0=0, α_1=.8, α_2=0, T=6, y_neg1=0., y_0=0., σ_u=1) +series_process = population_moments(α_0=0, + α_1=.8, + α_2=0, + T=6, + y_neg1=0., + y_0=0., + σ_u=1) μ_y, Σ_y = series_process.get_moments() print("μ_y = ", μ_y) -print("Σ_y = ", Σ_y) +print("Σ_y = \n", Σ_y) ``` Notice that the covariance between $y_t$ and $y_{t-1}$ -- the elements on the superdiagonal -- are *not* identical. @@ -502,9 +524,9 @@ We describe how to do that in [Linear State Space Models](https://python.quantec But just to set the stage for that analysis, let's print out the bottom right corner of $\Sigma_y$. ```{code-cell} ipython3 -series_process = population_moments( - α_0=10.0, α_1=1.53, α_2=-.9, T=80, y_neg1=28., y_0=24., σ_u=1) +series_process = population_moments() μ_y, Σ_y = series_process.get_moments() + print("bottom right corner of Σ_y = \n", Σ_y[72:,72:]) ``` @@ -529,26 +551,13 @@ To study the structure of $A^{-1}$, we shall print just up to $3$ decimals. Let's begin by printing out just the upper left hand corner of $A^{-1}$. ```{code-cell} ipython3 -with np.printoptions(precision=3, suppress=True): - print(A_inv[0:7,0:7]) +print(A_inv[0:7,0:7]) ``` Evidently, $A^{-1}$ is a lower triangular matrix. - -Let's print out the lower right hand corner of $A^{-1}$ and stare at it. - -```{code-cell} ipython3 -with np.printoptions(precision=3, suppress=True): - print(A_inv[72:,72:]) -``` - Notice how every row ends with the previous row's pre-diagonal entries. - - - - Since $A^{-1}$ is lower triangular, each row represents $ y_t$ for a particular $t$ as the sum of - a time-dependent function $A^{-1} b$ of the initial conditions incorporated in $b$, and - a weighted sum of current and past values of the IID shocks $\{u_t\}$. @@ -566,9 +575,6 @@ This is a **moving average** representation with time-varying coefficients. Just as system {eq}`eq:eqma` constitutes a **moving average** representation for $y$, system {eq}`eq:eqar` constitutes an **autoregressive** representation for $y$. - - - ## A forward looking model Samuelson’s model is *backward looking* in the sense that we give it *initial conditions* and let it @@ -638,7 +644,7 @@ for i in range(T): ``` ```{code-cell} ipython3 -B +print(B) ``` ```{code-cell} ipython3 From 1e15713ec62ff0a3e98190aa7873f7612df3194e Mon Sep 17 00:00:00 2001 From: Matt McKay Date: Wed, 25 Sep 2024 14:40:46 +1000 Subject: [PATCH 16/17] ENH: remove binder and default to colab (#550) --- lectures/_config.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/lectures/_config.yml b/lectures/_config.yml index d16319ad..84d407d7 100644 --- a/lectures/_config.yml +++ b/lectures/_config.yml @@ -70,8 +70,6 @@ sphinx: analytics: google_analytics_id: G-QDS1YRJNGM launch_buttons: - notebook_interface : classic # The interface interactive links will activate ["classic", "jupyterlab"] - binderhub_url : https://mybinder.org # The URL of the BinderHub (e.g., https://mybinder.org) colab_url : https://colab.research.google.com thebe : false # Add a thebe button to pages (requires the repository to run on Binder) intersphinx_mapping: From 905b7f9b507f38b917df5eaf60eac0a5d3e57bb1 Mon Sep 17 00:00:00 2001 From: Longye Tian <133612246+longye-tian@users.noreply.github.com> Date: Wed, 25 Sep 2024 14:45:20 +1000 Subject: [PATCH 17/17] [general] remark_admonition + upgrade sphinx-proof and quantecon-book-theme (#493) * [geom_series] remark_admonition Dear John, This pull request is for #442. I use the geom_series.md lecture as an example to test the current admonition style. Best, Longye * TST: install main branch version of sphinx-proof * test with new css definition * test the new css styling for remark * test updated quantecon-book-theme * upgrade quantecon-book-theme==0.7.2 * update branch until released for sphinx-proof * enable sphinx-proof==0.2.0 * update software for collab testing * remark_money_inflation Add remark admonition for money_inflation.md * remark_unpleasent Add remark admonition to unpleasent.md * remark_money_inflation_nonlinear Add remark admonition for money_inflation_nonlinear.md --------- Co-authored-by: mmcky Co-authored-by: Matt McKay --- .github/workflows/collab.yml | 2 +- environment.yml | 4 ++-- lectures/_config.yml | 1 + lectures/geom_series.md | 5 ++++- lectures/money_inflation.md | 16 ++++++++++++---- lectures/money_inflation_nonlinear.md | 5 ++++- lectures/unpleasant.md | 1 + 7 files changed, 25 insertions(+), 9 deletions(-) diff --git a/.github/workflows/collab.yml b/.github/workflows/collab.yml index 90595060..7a3284d4 100644 --- a/.github/workflows/collab.yml +++ b/.github/workflows/collab.yml @@ -30,7 +30,7 @@ jobs: - name: Install Build Software shell: bash -l {0} run: | - pip install jupyter-book==0.15.1 docutils==0.17.1 quantecon-book-theme==0.7.1 sphinx-tojupyter==0.3.0 sphinxext-rediraffe==0.2.7 sphinx-exercise==0.4.1 sphinxcontrib-youtube==1.1.0 sphinx-togglebutton==0.3.1 arviz==0.13.0 sphinx_proof==0.1.3 sphinx_reredirects==0.1.3 + pip install jupyter-book==0.15.1 docutils==0.17.1 quantecon-book-theme==0.7.2 sphinx-tojupyter==0.3.0 sphinxext-rediraffe==0.2.7 sphinx-exercise==0.4.1 sphinxcontrib-youtube==1.1.0 sphinx-togglebutton==0.3.1 arviz==0.13.0 sphinx_proof==0.2.0 sphinx_reredirects==0.1.3 # Build of HTML (Execution Testing) - name: Build HTML shell: bash -l {0} diff --git a/environment.yml b/environment.yml index d9b55519..f60099b5 100644 --- a/environment.yml +++ b/environment.yml @@ -9,11 +9,11 @@ dependencies: - pip: - jupyter-book==0.15.1 - docutils==0.17.1 - - quantecon-book-theme==0.7.1 + - quantecon-book-theme==0.7.2 - sphinx-tojupyter==0.3.0 - sphinxext-rediraffe==0.2.7 - sphinx-exercise==0.4.1 - - sphinx-proof==0.1.3 + - sphinx-proof==0.2.0 - ghp-import==1.1.0 - sphinxcontrib-youtube==1.1.0 - sphinx-togglebutton==0.3.1 diff --git a/lectures/_config.yml b/lectures/_config.yml index 84d407d7..ecd808f0 100644 --- a/lectures/_config.yml +++ b/lectures/_config.yml @@ -45,6 +45,7 @@ sphinx: width: 80% nb_code_prompt_show: "Show {type}" suppress_warnings: [mystnb.unknown_mime_type, myst.domains] + proof_minimal_theme: true # ------------- html_js_files: - https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js diff --git a/lectures/geom_series.md b/lectures/geom_series.md index be698d01..0ea97279 100644 --- a/lectures/geom_series.md +++ b/lectures/geom_series.md @@ -105,9 +105,12 @@ $$ 1 + c + c^2 + c^3 + \cdots + c^T = \frac{1 - c^{T+1}}{1-c} $$ -**Remark:** The above formula works for any value of the scalar +```{prf:remark} +:label: geom_formula +The above formula works for any value of the scalar $c$. We don't have to restrict $c$ to be in the set $(-1,1)$. +``` We now move on to describe some famous economic applications of geometric series. diff --git a/lectures/money_inflation.md b/lectures/money_inflation.md index 216a9a63..d7e37ecd 100644 --- a/lectures/money_inflation.md +++ b/lectures/money_inflation.md @@ -385,13 +385,21 @@ m_t & = b_{t-1} p_t \end{aligned} $$ (eq:method1) -**Remark 1:** method 1 uses an indirect approach to computing an equilibrium by first computing an equilibrium $\{R_t, b_t\}_{t=0}^\infty$ sequence and then using it to back out an equilibrium $\{p_t, m_t\}_{t=0}^\infty$ sequence. - +```{prf:remark} +:label: method_1 +Method 1 uses an indirect approach to computing an equilibrium by first computing an equilibrium $\{R_t, b_t\}_{t=0}^\infty$ sequence and then using it to back out an equilibrium $\{p_t, m_t\}_{t=0}^\infty$ sequence. +``` -**Remark 2:** notice that method 1 starts by picking an **initial condition** $R_0$ from a set $[\frac{\gamma_2}{\gamma_1}, R_u]$. Equilibrium $\{p_t, m_t\}_{t=0}^\infty$ sequences are not unique. There is actually a continuum of equilibria indexed by a choice of $R_0$ from the set $[\frac{\gamma_2}{\gamma_1}, R_u]$. +```{prf:remark} +:label: initial_condition +Notice that method 1 starts by picking an **initial condition** $R_0$ from a set $[\frac{\gamma_2}{\gamma_1}, R_u]$. Equilibrium $\{p_t, m_t\}_{t=0}^\infty$ sequences are not unique. There is actually a continuum of equilibria indexed by a choice of $R_0$ from the set $[\frac{\gamma_2}{\gamma_1}, R_u]$. +``` -**Remark 3:** associated with each selection of $R_0$ there is a unique $p_0$ described by +```{prf:remark} +:label: unique_selection +Associated with each selection of $R_0$ there is a unique $p_0$ described by equation {eq}`eq:p0fromR0`. +``` ### Method 2 diff --git a/lectures/money_inflation_nonlinear.md b/lectures/money_inflation_nonlinear.md index f716916f..07922373 100644 --- a/lectures/money_inflation_nonlinear.md +++ b/lectures/money_inflation_nonlinear.md @@ -68,7 +68,10 @@ $$ (eq:msupply) where $g$ is the part of government expenditures financed by printing money. -**Remark:** Please notice that while equation {eq}`eq:mdemand` is linear in logs of the money supply and price level, equation {eq}`eq:msupply` is linear in levels. This will require adapting the equilibrium computation methods that we deployed in {doc}`money_inflation`. +```{prf:remark} +:label: linear_log +Please notice that while equation {eq}`eq:mdemand` is linear in logs of the money supply and price level, equation {eq}`eq:msupply` is linear in levels. This will require adapting the equilibrium computation methods that we deployed in {doc}`money_inflation`. +``` diff --git a/lectures/unpleasant.md b/lectures/unpleasant.md index 676edfa1..5eb80e31 100644 --- a/lectures/unpleasant.md +++ b/lectures/unpleasant.md @@ -241,6 +241,7 @@ p_T = \frac{m_0}{\gamma_1 - \overline g - \gamma_2 R_u^{-1}} = \gamma_1^{-1} $$ (eq:pTformula) ```{prf:remark} +:label: equivalence We can verify the equivalence of the two formulas on the right sides of {eq}`eq:pTformula` by recalling that $R_u$ is a root of the quadratic equation {eq}`eq:up_steadyquadratic` that determines steady state rates of return on currency. ```