Bookmark and Share

Notice: On March 31, it was announced that Statalist is moving from an email list to a forum. The old list will shut down on April 23, and its replacement, statalist.org is already up and running.


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: st: Errors "out of range" for a simple Mata function


From   Nick Cox <njcoxstata@gmail.com>
To   statalist@hsphsun2.harvard.edu
Subject   Re: st: Errors "out of range" for a simple Mata function
Date   Tue, 20 Nov 2012 10:26:50 +0000

Thanks for the correction. The word "wrong" was itself wrong. I was
elevating my personal preference only to use views for data Ithat I
won't change to an implication that you can't do it, which was
incorrect.

Given

local macro generate
local macro varlist
local macro touse

as discussed to date in the thread

. mata : st_store(., "`generate'", "``touse''", rowsum(st_data(.,
tokens("`varlist'"), "``touse''")))

is I think a complete solution. However, I'd sympathise with anyone
who thought that overvalues conciseness. Also, using Mata as a
calculator in this way undermines Ly Tran's major purpose of using the
row sum problem as a vehicle for learning Mata.

Nick

On Tue, Nov 20, 2012 at 2:01 AM, Christopher Baum <kit.baum@bc.edu> wrote:

> Ly Tran:
>
> Nick Cox is correct in pointing out that you need to pass `generate' to your Mata function. But it is not necessary to use st_store() as he suggests. Your Mata code works with one small change:
>
> capture program drop testsum
> program testsum, rclass
> syntax varlist(numeric) [if] [in], GENerate(string) [FLOAT]
> qui generate `float' `generate' = .
> mata: tsum( "`varlist'", "`generate'")
> end
>
> mata
> void function tsum (string scalar varlist, string scalar newvar)
> {
> real matrix X, Z
> st_view(X = .,., tokens(varlist))
> st_view(Z =., ., newvar)
> Z[.,.] = rowsum(X)
> }
> end
>
> When an entire view matrix is the LHS of a statement, you must use the syntax shown, rather than the name of the view matrix, for the statement to update the view matrix (and the Stata variable(s)) and not create a new Mata object. In the help for st_view(), read the section "Cautions when using views 2:  Assignment" to see this point illustrated. It is also mentioned in the Mata chapter of ITSP below.
>
> . sysuse auto,clear
> (1978 Automobile Data)
>
> . testsum price mpg turn, gen(junk)
>
> . egen junk2=rowtotal(price mpg turn)
>
> . su junk*
>
>     Variable |       Obs        Mean    Std. Dev.       Min        Max
> -------------+--------------------------------------------------------
>         junk |        74    6226.203    2948.149       3354      15972
>        junk2 |        74    6226.203    2948.149       3354      15972
>
>
> One other thing: if you allow [if] and [in] in your ado-file, you should -marksample touse- and pass `touse' to Mata so that it can limit the observations being used in the Mata routine. Again, example code in ITSP.

*
*   For searches and help try:
*   http://www.stata.com/help.cgi?search
*   http://www.stata.com/support/faqs/resources/statalist-faq/
*   http://www.ats.ucla.edu/stat/stata/


© Copyright 1996–2014 StataCorp LP   |   Terms of use   |   Privacy   |   Contact us   |   Site index