Skip to article frontmatterSkip to article content

Goods Market

by Professor Throckmorton
for Intermediate Macro
W&M ECON 304
Slides

Introduction

  • In Part 1, we looked at different ways of accounting for GDP and comparing GDP per capita and its growth rate across countries.

  • The Solow growth model made dynamic predictions about income per worker given assumptions about the nature of production, capital, and investment.

  • In that model, we focused on the effects of capital accumulation, technological growth, and the savings rate on income per worker over the long run.

  • While Y=C+IY = C + I, the growth model was about explaining investment, not consumption.

  • In Part 2, we will abstract from capital accumulation and turn our attention to the short run, first focusing on household consumption.

Q: Why Consumption?

BEA, National Data, NIPA, Table 1.1.5
  • The consumption share of GDP is the largest component, larger than investment, government spending, and net exports.

  • The consumption share of GDP has increased over time.

  • Of course this is quite different between high and low income countries, but high income countries generally have a large share of consumption to GDP.

Consumption Function

  • Assume that aggregate consumption is a function of disposable income

C=c0+c1×(YT)C = c_0 + c_1 \times (Y - T)
  • YY is income, while TT is net tax revenue. Thus, YTY-T is disposable income available to households.

  • Note: TT is net tax revenue because some households receive transfers from the government, e.g., Social Security payments and medical expenses paid via Medicare

Parameters

  • c1c_1 quantifies the fraction of current disposable income consumed by households

    • In the language of micro, we might call it the “consumption elasticity of disposable income”

    • In the language of macro, most people call it the “marginal propensity to consume” (MPC)

    • If there were low and high income households in the model, which do you think would have a higher average MPC?

  • c0c_0 is all consumption that is independent of current disposable income. Imagine if YT=0Y-T = 0, then

    • households could dissave and consume out of their wealth, or

    • households could borrow against their wealth or future income to consume.

Aggregate Expenditure

  • In Ch. 2, the expenditure approach to GDP is Y=C+I+G+NXY = C + I + G + NX

  • In the Solow growth model, we abstract from GG and NXNX and just had Y=C+IY = C + I

  • In Part 2, we’ll work with a closed economy but consider changes in government spending, so Y=C+I+GY = C + I + G

  • But we need to separate the expenditure (i.e., demand) side apart from the supply side, so let YY be aggregate supply/output and aggregate expenditure is

Z=C+I+GZ = C + I + G
  • In equilibrium, Y=ZY = Z, but there are disequilibria where YZY \neq Z

Disequilibrium \rightarrow Equilibrium

  • If Y>ZY > Z, there is excess supply

    • Inventories would accumulate

    • Firms would probably decrease production Y\downarrow Y

  • If Y<ZY < Z, there is excess expenditure

    • Inventories would deplete

    • Firms would probably increase production Y\uparrow Y

  • Either way, there is a tendency for YY to move toward ZZ, and thus Y=ZY = Z is an equilibrium.

Endogneous Variables

  • So far, the model has variables Y,C,I,G,TY, C, I, G, T

  • We’ve assumed CC is a function of YY and in equilibrium, Y=C+I+GY = C + I + G, i.e., YY is a function of CC. These are known as endogenous variables.

  • However, we have not assumed functions for I,G,TI,G,T (yet). They are variables and could change, but they do not explicitly depend on YY or CC (yet). These are known as exogenous variables.

  • We can also treat parameters as exogenous variables, e.g., in the growth model we considered the effects of an increasing in the savings rate (a parameter).

  • For example, we could consider a financial crisis that reduces asset prices a reduction in househould wealth that is reflected by a decrease in c0c_0. Another way to think of that is falling consumer confidence.

The Multiplier

  • The goods market in equilibrium has 3 equations

    1. C=c0+c1×(YT)C = c_0 + c_1 \times (Y - T) (a behavioral equation)

    2. Z=C+I+GZ = C + I + G (an accounting identity)

    3. Y=ZY = Z (an equilibrium condition)

  • The main prediction this model makes is that an exogenous change in expenditure is multiplied into a larger endogenous change in equilibrium income/output.

  • That result is known as Income Multiplication (or the Keynesian Multiplier).

Multiplier Example

  • Suppose an Infrastructure Spending Bill is passed, or GG \uparrow by ΔG\Delta G

  • Aggregate expenditure, ZZ, directly increases by ΔG\Delta G

  • Firms see higher demand for their outputs, e.g., increased orders for steel, cement, and construction equipment and vehicles, so they increase production, YY \uparrow also by ΔG\Delta G (on impact)

  • Households receive more income and they consume an additional c1ΔGc_1 \Delta G

  • But CC is part of ZZ, so the loop repeats, i.e, the initial change in government spending multiplies into additional income over time.

Multiplier StepΔY\Delta YΔC\Delta C
0ΔG\Delta Gc1ΔGc_1\Delta G
1c1ΔGc_1\Delta Gc12ΔGc_1^2\Delta G
2c12ΔGc_1^2\Delta Gc13ΔGc_1^3\Delta G
3c13ΔGc_1^3\Delta Gc14ΔGc_1^4\Delta G
.........
  • Since we’ve assumed 0<c1<10 < c_1 < 1, each additional step is adding a smaller amount to income/output.

  • Add up the ΔY\Delta Y column and we get

    ΔY=ΔG+c1ΔG+c12ΔG+c13ΔG+=ΔG(1+c1+c12+c13+)=ΔG1c1\Delta Y = \Delta G + c_1\Delta G +c_1^2\Delta G +c_1^3\Delta G + \cdots \\ = \Delta G (1 + c_1 +c_1^2 +c_1^3 + \cdots) \\ = \frac{\Delta G}{1-c_1}
  • In other words, the multiplication process is represented by a geometric series (see the Wiki on that).

  • E.g., suppose ΔG=$1T\Delta G = \$1T and c1=0.25c_1 = 0.25, then

    ΔY=ΔG1c1=$1T0.75=$1.33T\Delta Y = \frac{\Delta G}{1-c_1} = \frac{\$1T}{0.75} = \$1.33T
  • 1/(1c1)1/(1-c_1) is known as the government spending multiplier in this model.

Equilibrium Output

  • The goods market makes predictions about output/income, YY.

  • Q: How do changes in exogenous variables affect YY?

  • Combining the goods markets equations (imposing that the model is in equilibrium)

    Y=c0+c1(YT)+I+GY = c_0 + c_1(Y-T) + I + G
  • Solving for equilibrium output, YY

    Y=11c1(c0c1T+I+G)Y = \frac{1}{1-c_1} \left(c_0 - c_1 T + I + G \right)
  • c1,c0,T,I,Gc_1, c_0, T, I, G are all exogenous parameters/variables at the moment.

Other Multipliers

  • From the solution for equilbrium output, we can see the government spending multiplier (which is the same as the earlier example)

    ΔY=11c1ΔG\Delta Y = \frac{1}{1-c_1} \Delta G
  • An exogenous change in investment has the same multiplier

    ΔY=11c1ΔI\Delta Y = \frac{1}{1-c_1} \Delta I
  • However, an exogenous change in net taxes has a different multiplier because households first choose consumption vs. savings and a change in net taxes has the opposite effect on consumption (than a change in governement spending).

    ΔY=c11c1ΔT\Delta Y = \frac{-c_1}{1-c_1} \Delta T

Goods Market Graph

  • The goods market graph will show output, YY, vs expenditure, ZZ.

  • Blanchard, Macroeconomics (9th Edition, 2025) introduces new notation for a graph of aggregate expenditure and calls it ZZZZ.

  • ZZZZ differentiates the aggregate expenditure function from particular realizations of aggregate expenditure that we label as just ZZ on the vertical axis.

Source
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 40, 100)
y = 10 + x/3
plt.figure(figsize=(6.5, 3.5))
plt.plot(x, y)
plt.xlim(0, 30)
plt.ylim(0, 30)
plt.xlabel('Output, Y', loc='right')
plt.ylabel('Agg. Exp., Z', loc='top')
plt.title('Goods Market')
plt.grid()
plt.axhline(0, color='black',linewidth=0.5, ls='--')
# add line for 45 degree line from origin
plt.plot(x, x, color='red', linewidth=0.5, ls='--')
# add label for 45 degree line that says Y=Z
plt.text(25, 23, 'Y=Z', color='black')
# add label for expenditure line that says ZZ=C+I+G
plt.text(25, 16.5, 'ZZ=C+I+G', color='black')
# label the equilibrium point on the graph
plt.plot(15, 15, marker='o', color='black')
plt.text(15, 16, 'Equilibrium', fontsize=8, verticalalignment='bottom', horizontalalignment='right')
# put Y* = 15 on horizontal axis
plt.text(15.2, -1, 'Y*', fontsize=12, verticalalignment='top', horizontalalignment='center')
# put dashed vertical line between horizon axis and equilibrium point
plt.axvline(15, ymin=0, ymax=0.5, color='black', linewidth=0.5, ls='--')
# put horizontal dashed line between vertical axis and equilibrium point
plt.axhline(15, xmin=0, xmax=0.5, color='black', linewidth=0.5, ls='--')
plt.text(-1, 15.9, 'Z*', fontsize=12, verticalalignment='top', horizontalalignment='center')
# remove x and y labels and ticks
plt.xticks([]); plt.yticks([]);
<Figure size 650x350 with 1 Axes>
Source
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 40, 100)
y = 10 + x/3
plt.figure(figsize=(6.5, 3.5))
plt.plot(x, y)
plt.xlim(0, 30)
plt.ylim(0, 30)
plt.xlabel('Output, Y', loc='right')
plt.ylabel('Agg. Exp., Z', loc='top')
plt.title('Goods Market')
plt.grid()
plt.axhline(0, color='black',linewidth=0.5, ls='--')
# add line for 45 degree line from origin
plt.plot(x, x, color='red', linewidth=0.5, ls='--')
# add label for 45 degree line that says Y=Z
plt.text(25, 23, 'Y=Z', color='black')
# add label for expenditure line that says ZZ=C+I+G
plt.text(25, 16, 'ZZ=C+I+G', color='black')
# label the equilibrium point on the graph
plt.plot(15, 15, marker='o', color='black')
# put Y* = 15 on horizontal axis
plt.text(15, -1, 'Y*', fontsize=12, verticalalignment='top', horizontalalignment='center')
# put dashed vertical line between horizon axis and equilibrium point
plt.axvline(15, ymin=0, ymax=0.5, color='black', linewidth=0.5, ls='--')
# put horizontal dashed line between vertical axis and equilibrium point
plt.axhline(15, xmin=0, xmax=0.5, color='black', linewidth=0.5, ls='--')
plt.text(-1, 15.5, 'Z*', fontsize=12, verticalalignment='top', horizontalalignment='center')
# Put dot on 45 degree line at (5,5)
plt.plot(5, 5, marker='o', color='black')
# put dashed vertical line between horizon axis and aggregate expenditure line
plt.axvline(5, ymin=0, ymax=0.39, color='black', linewidth=0.5, ls='--')
# label the point (5,5) with Y_low
plt.text(5, -1, '$Y_{low}$', fontsize=12, verticalalignment='top', horizontalalignment='center')
# put dashed horizontal line between vertical axis and (5,5)
plt.axhline(5, xmin=0, xmax=5/30, color='black', linewidth=0.5, ls='--')
# label the point (5,5) with Y_low on the vertical axis
plt.text(-0.5, 5, '$Y_{low}$', fontsize=12, verticalalignment='center', horizontalalignment='right')
# put dashed horizontal line between vertical axis and aggregate expenditure line at X=5
plt.axhline(11.7, xmin=0, xmax=5/30, color='black', linewidth=0.5, ls='--')
# label the point (5,11.7) with Z_low on the vertical axis
plt.text(-0.5, 11.7, '$Z_{low}$', fontsize=12, verticalalignment='center', horizontalalignment='right')
# put a dot on the expenditure line at (5,11.7)
plt.plot(5, 11.7, marker='o', color='black')
# put a vertical curly brace between (5,5) and (5,11.7)
plt.annotate('', xy=(5, 5.3), xytext=(5, 11.1), arrowprops={'arrowstyle': '<->', 'lw':1.5})
# label the vertical arrow with "shortage"
plt.text(5.5, 8.5, 'Shortage', fontsize=10, verticalalignment='center')
# remove x and y labels and ticks
plt.xticks([]); plt.yticks([]);
# add y label at 20
plt.text(-0.5, 16.7, '$Z_{high}$', fontsize=12, verticalalignment='center', horizontalalignment='right')  
# add x label at 20
plt.text(20, -1, '$Y_{high}$', fontsize=12, verticalalignment='top', horizontalalignment='center')  
# put dashed vertical line between horizon axis and aggregate expenditure line at X=20
plt.axvline(20, ymin=0, ymax=16.7/30, color='black', linewidth=0.5, ls='--')
# put dashed horizontal line between vertical axis and aggregate expenditure line at Y=20
plt.axhline(16.7, xmin=0, xmax=20/30, color='black', linewidth=0.5, ls='--')
# put a vertical curly brace between (20,12) and (20,20)
plt.annotate('', xy=(20, 16.5), xytext=(20, 20), arrowprops={'arrowstyle': '<->', 'lw':1.5})
# label the vertical arrow with "surplus"
plt.text(20.5, 18.5, 'Surplus', fontsize=10, verticalalignment='center');
<Figure size 650x350 with 1 Axes>
  • If output is below equilibrium, then expenditure exceeds output, Zlow>YlowZ_{low} > Y_{low}.

  • In micro language, we would call that a shortage. But in macro, excess expenditure could be met with inventories (i.e., past production).

  • Excess expenditure creates an unplanned decrease in inventories, which is an incentive for firms to increase output.

Experiment

  • Suppose GG\uparrow from G0G_0 to G1G_1.

  • An exogenous increase in GG will shift up the ZZZZ curve.

  • That creates excess expenditure, which depletes inventories.

  • Firms increase production until the new equilibrium is reached.

Source
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 40, 100)
y = 12 + x/3
plt.figure(figsize=(6.5, 3.5))
plt.plot(x, y)
# Shift aggregate expenditure line down by 7 units
plt.plot(x, y-8.8)
plt.xlim(0, 30)
plt.ylim(0, 30)
plt.xlabel('Output, Y', loc='right')
plt.ylabel('Agg. Exp., Z', loc='top')
plt.title('Goods Market')
plt.grid()
plt.axhline(0, color='black',linewidth=0.5, ls='--')
# add line for 45 degree line from origin
plt.plot(x, x, color='red', linewidth=0.5, ls='--')
# add label for 45 degree line that says Y=Z
plt.text(25, 23, 'Y=Z', color='black')
# add label for expenditure line that says ZZ(G_0)
plt.text(25, 9, '$ZZ(G_0)$', color='black')
# add label for expenditure line that says ZZ(G_1)
plt.text(25, 18, '$ZZ(G_1)$', color='black')
# label the equilibrium point on the graph
plt.plot(18, 18, marker='o', color='black')
# put Y* = 15 on horizontal axis
plt.text(18, -1, 'Y*', fontsize=12, verticalalignment='top', horizontalalignment='center')
# put dashed vertical line between horizon axis and equilibrium point
plt.axvline(18, ymin=0, ymax=18/30, color='black', linewidth=0.5, ls='--')
# put horizontal dashed line between vertical axis and equilibrium point
plt.axhline(18, xmin=0, xmax=18/30, color='black', linewidth=0.5, ls='--')
plt.text(-1, 19, 'Z*', fontsize=12, verticalalignment='top', horizontalalignment='center')
# Put dot on 45 degree line at (5,5)
plt.plot(5, 5, marker='o', color='black')
# put dashed vertical line between horizon axis and aggregate expenditure line
plt.axvline(5, ymin=0, ymax=5/30, color='black', linewidth=0.5, ls='--')
# label the point (5,5) with Y_low
plt.text(5, -1, '$Y_0$', fontsize=12, verticalalignment='top', horizontalalignment='center')
# put dashed horizontal line between vertical axis and (5,5)
plt.axhline(5, xmin=0, xmax=5/30, color='black', linewidth=0.5, ls='--')
# label the point (5,5) with Y_low on the vertical axis
plt.text(-0.5, 5, '$Y_0$', fontsize=12, verticalalignment='center', horizontalalignment='right')
# put dashed horizontal line between vertical axis and aggregate expenditure line at X=5
plt.axhline(13.7, xmin=0, xmax=5/30, color='black', linewidth=0.5, ls='--')
# label the point (5,11.7) with Z_low on the vertical axis
plt.text(-0.5, 13.7, '$Z_1$', fontsize=12, verticalalignment='center', horizontalalignment='right')
# put a dot on the expenditure line at (5,11.7)
plt.plot(5, 13.7, marker='o', color='black')
# put a vertical curly brace between (5,5) and (5,11.7)
plt.annotate('', xy=(5, 5.5), xytext=(5, 13.1), arrowprops={'arrowstyle': '<->', 'lw':1.5})
# label the vertical arrow with "shortage"
plt.text(5.5, 9.5, 'Shortage', fontsize=10, verticalalignment='center')
# remove x and y labels and ticks
plt.xticks([]); plt.yticks([]);
# label horizontal axis at 10 Y_1
plt.text(10, -1, '$Y_1$', fontsize=12, verticalalignment='top', horizontalalignment='center')
# add vertical dashed line at Y_1
plt.axvline(10, ymin=0, ymax=15.5/30, color='black', linewidth=0.5, ls='--')
# add dot at (10,15) on the expenditure line
plt.plot(10, 15.5, marker='o', color='black')
# add vertical axis label at 15.5 Z_2
plt.text(-0.5, 17, '$Z_2$', fontsize=12, verticalalignment='top', horizontalalignment='right')
# add horizontal dashed line at Z_2
plt.axhline(15.5, xmin=0, xmax=10/30, color='black', linewidth=0.5, ls='--')
# add right arrrow between 5 and 11 on just above the horizontal axis
plt.annotate('', xy=(5.3, 2), xytext=(9.7, 2), arrowprops={'arrowstyle': '<-', 'lw':1.5})
# add right arrrow between 5 and 11 on just above the horizontal axis
plt.annotate('', xy=(10.3, 2), xytext=(17.7, 2), arrowprops={'arrowstyle': '<-', 'lw':1.5})
# put a vertical curly brace between (5,5) and (5,11.7)
plt.annotate('', xy=(10, 10.3), xytext=(10, 15), arrowprops={'arrowstyle': '<->', 'lw':1.5})
# label the vertical arrow with "shortage"
plt.text(10.5, 12.5, 'Shortage', fontsize=10, verticalalignment='center');
# add a big up arrow on the right side between the two aggregate expenditure lines
plt.annotate('', xy=(23, 11.5), xytext=(23, 19), arrowprops={'arrowstyle': '<-', 'lw':3});
<Figure size 650x350 with 1 Axes>

Savings

  • Define private saving as disposable income not consumed, SprivateYTCS_{private} \equiv Y - T - C.

  • Define public saving as net tax revenue minus government spending, SpublicTGS_{public} \equiv T - G

  • Note that in a goods market equilibrium Y=C+I+GY = C + I + G.

  • Subtract TT from both sides and move CC to the left hand side

YTC=I+GTSprivate=I(TG)I=Sprivate+SpublicSnationalY - T - C = I + G - T \\ \rightarrow S_{private} = I - (T - G) \\ \rightarrow I = S_{private} + S_{public} \equiv S_{national}
  • Thus, in equilibrium investment equals saving.