Quantcast
Channel: Statalist
Viewing all articles
Browse latest Browse all 72772

Mata fine in .do file, not fine when in program / .ado file

$
0
0
With acknowledgement to this post (http://stackoverflow.com/questions/1...ith-zeros?lq=1), without which I would never have gotten this far, I ask for help. I am new to the Mata side of Stata and, honestly, am sort of bumbling my way through.

I need to adapt the code from the above linked post in a loop. (Looping through levels of a variable indicating group membership). Short description--the post shows a solution to populate a matrix in cases where there are 0 observations for one of the response options when using svy, drawing on the results of estpost svy, tab: (estpost from SSC). For my purposes, I will eventually put the contents of the matrix into an Excel file. (The putexcel code is not an issue, thus I did not include it below).

I can get the Mata code to run when included in the do file (minus "matrixtabzero, cat(4) and not in a loop). Once I move it into the .ado file and a program, I start having problems. Among the many errors I've seen as I have tried things to work out the problem--the argument value (4 in the code below) isn't making it to Mata. Subsequently, there is no matrix for st_matrix to send back to Stata.

After many google searches, consultations with Intro to Stata Programming, etc., where is my mistake? Alternate suggestions to get to the same end? I should add that people in my office who are beginning Stata users will need to use this, thus I am trying to get to a solution that will be the least confusing for them to run.

Thank you,
Julie

.do file:
:
estpost svy: tab Q27_15 if DistrictID==4,  se

matrixtabzero, cat(4)

// code for putexcel not shown
.ado file
:
program matrixtabzero
    version 14
    syntax , cat(integer)
    mata: mf_matrixtabzero(`cat')
    mata: st_matrix("totmat", d)

end

mata:

    real matrix mf_matrixtabzero(real scalar cat) {

    real matrix d
    real matrix d1
    real matrix d2
    
    /* count rows, add one for totals row
    assign the category for that row as .a */
    r = (st_matrix("e(Row)"), .a)'
    ct = st_matrix("e(count)")'
    obs = st_matrix("e(obs)")'
    b = st_matrix("e(b)")'
    serr = st_matrix("e(se)")'
    lb = st_matrix("e(lb)")'
    ub = st_matrix("e(ub)")'

    d1 = (r , obs, ct, b, serr, lb, ub)

    /*  Where there are no totals, use a standard missing value */
    d1[rows(d1),5::7] = J(1,3, .)

    /* Check if there are no missing rows.
    If so, output the original returned matrices */
    if (`e(r)' ==cat) d = d1
 
    /* Else create a zero matrix and populate it
    with statistics for the non-missing categories*/
    else {
        d2= J(cat,7,0)
        d2[.,1] =(1::cat)
            for (j = 1; j<=`e(r)'; j++) {
                for (k = 1; k<=r[j,1]; k++) {
                    if (r[j,1]== k) {
                    d2[k,2] = obs[j,1]
                    d2[k,3] = ct[j,1]
                    d2[k,4] = b[j,1]
                    d2[k,5] = serr[j,1]
                    d2[k,6] = lb[j,1]
                    d2[k,7] = ub[j,1]
                    }
                }
            }
 
 /* If rows are missing set SE-realated stats to missing     */
                for (k = 1; k<=cat; k++) {
                    if (d2[k,5] == 0)  d2[k,5..7] =J(1,3,.)
                }
 /* Now add the totals row  */
        d = d2 \ d1[rows(d1),.]
        st_matrix("totmat", d)

    }
}


end

mata: mata mosave mf_matrixtabzero(), dir(PERSONAL) replace

Viewing all articles
Browse latest Browse all 72772

Trending Articles