Mata Matters

Dynamic documents with Markdown and Stata may include Mata code as part of a Stata block using the simple or strict syntax. It is even possible to start a Mata session in one block, add a few comments or annotations, and end the session in another block.

Version 1.6 of markstat makes this even easier by extending the strict syntax to allow Mata blocks as well as inline Mata code. In both cases you simply use an m instead of an s in the code fence or inline code.

I thought it would be fun to try to reproduce part of one of Bill Gould's Mata Matters columns, and I picked an excerpt from his column on subscripts. Here is the code. We start with a quiet block to enter the matrix X, and then take up the narrative from the article.

# Matta Matters (excerpt)

From W. Gould (2007). Mata Matters: Subscripting. *The Stata Journal*,
__7__(1):106-116. <>.

    clear mata
    version 11
        X = 4,  7, 9 \   
            2, 12, 3 \ 
            8,  8, 7 \  
            3,  4, 1 \  
            1,  7, 9 

This is a case of something difficult to program in Stata being trivial
in Mata.  The following example is well worth understanding.

    o = ceil(5*uniform(5,1))
    Z = X[o,]

Below I use these ideas to perform a bootstrap of the regression of mpg on weight
and foreign, using the automobile data:

    sysuse auto, clear
        st_view(datay=., ., "mpg")
        st_view(dataX=., ., tokens("weight foreign"))
        n = rows(datay)
        dataX = dataX, J(n, 1, 1)
        N = 10000 // number of replications
        b = J(N, 3, .)
        for (i = 1; i <= N; i++) {
            o = ceil(n*uniform(n,1))
            y = datay[o,]
            X = dataX[o,]
            b[i,] = (invsym(X'X)*X'y)'

These results are similar to those that would be produced in Stata by typing 
`estat vce` after `bootstrap, reps(10000): regress mpg weight foreign`.

You can see the corresponding HTML and PDF output, or even better, you could run it yourself using the commands:

copy mata.stmd
markstat using mata, strict

You may want to compare the output with the original Stata Journal article available here.

When I first ran this script the results differed from the published output, even though the seed was the same. I thought something might have changed with Stata since the paper was written, and added a version 11 statement to the script. The results then matched exactly. And of course, the document was updated without the need to cut and paste anything.

Note: do not set version 11 before running markstat, as the command requires version 14 or higher and therefore will not run. Setting the version inside the script, however, works fine, as long as the script does not rely on later features.