State Space Models

All state space models are written and estimated in the R programming language. The models are available here with instructions and R procedures for manipulating the models here here.

Saturday, June 13, 2026

The Many Malthusian Models

 

You might conclude from casual reading or if your research stopped in 1798 when Thomas Robert Malthus published an Essay on the Principle of Population, that there is only one Malthusian Model, the one picture above as a Directed Graph. In the original model, Population (N) increases geometrically and Agricultural Production (QA) increases linearly. Eventually a Malthusian Crisis is created when S=(N > QA). The crisis is inevitable.

You might also conclude from casual empiricism that the model is wrong because technological change in Agriculture has made sure that growth in QA is not linear. So why should we bother with the Malthusian model and why does anyone even continue talking about it: (1) The model is easy to teach and supposedly easy to disprove. (2) The Neoclassical Economic Growth model (the Solow-Swan model) assumes that population growth is simply exogenous, along with technological change, and really offers no demographic theory. (3) Unified Growth Theory puts the Malthusian and Neoclassical models together in one frame work. (4) Malthusian Theory has never convincingly been tested statistically. (5) The data to test Malthusian Theory only exists from 0 AD forward (see the work of Angus Maddison). And, (6) the two single equation theory (one for population and one for production) is better formulated as a systems model.


The systems theory version of the Malthusian model was first formulated by Kenneth Boulding in 1955. I'm going to take Boulding's work one step further and develop the Malthusian Model as a State-Space system (see the R-code below that can be run on line using https://rdrr.io/snippets/ using the program dse. When the model is run in the R programming language, the graph above is produced. In the right frame, you can see that QA increases linearly and N increases geometrically (exponentially) as called for by the original Malthusian model. 

The shock decomposition diagram in the left frame shows that (1) a positive shock to population (N, the first row) increase QA which peaks after six years and then begins declining and (2) a positive shock to agricultural production (QA, second row) increases population which also peaks after about six years. All the data are standardize, dimensionless and purely theoretical.

There is a lot of experimenting you (and I) can (and should) do with this model to convince yourself of its generality. You can experiment by changing values in the System Matrix (F).   Here are some experiments to try:
  1. Set f[1,1] = f[2,2] =1 and set f[1,2] = f[2,1]=0 to create a Random Walk hypothesized to be the original Malthusian Trap by Unified Growth Theory.
  2. Try reading Malthus' original statement (few people do here). Can you find any feedback and feedforward effects?
  3. Add some feedback effects to the original model f[1,2] <- -.5 ; f[2,1] <- .5. We expect Population to increase with decrease (maybe) with increases in QA (f[1,2] is a feedback effect) and we expect Population to increase QA as more people are farming (a feedforward effect).




Code

Models have a compact R-code in dse and can be run easily https://rdrr.io/snippets/. Cut-and-paste the following code into the Snippets editor window. When you run it, it should produce the shock decomposition diagram and the forecast in the graphic above.

#
#    MALTHUS
#
require(dse)
require(matlab)
f <- matrix( c(   1.070143e+00, 0, 0.09478143,
               0,  1.00000000, 0.09238426,
                      0.000000000, 0.00000000,  1.000000000
),byrow=TRUE,nrow=3,ncol=3)
h <- eye(2,3)
k <- f[1:3,1:2,drop=FALSE]
TRM <- SS(F=f,H=h,K=k,
z0=c(0.09478143, 0.09238426, 1.00000000),
              output.names=c("N","QA"))
stability(TRM)
TRM <- SS(F=f,H=h,K=k,
z0=c(0.09479164, 1, 1.00000000),
              output.names=c("N","QA"))
TRM
TRM.data <- simulate(TRM,sampleT=20,
,start=1,freq=1,noise=matrix(0,20,2))
TRM.model <- l(TRM,TRM.data)
#tfplot(TRM.model)
shockDecomposition(toSSChol(TRM))
tfplot(forecast(TRM.model,horizon=20))

No comments:

Post a Comment