Notice: On April 23, 2014, Statalist moved from an email list to a forum, based at statalist.org.
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: st: Errors "out of range" for a simple Mata function
From
Christophe Kolodziejczyk <[email protected]>
To
[email protected]
Subject
Re: st: Errors "out of range" for a simple Mata function
Date
Wed, 21 Nov 2012 09:17:21 +0100
Just a minor point on the use of the token() function together with
st_data() and st_view() (or even st_store()).
Token() creates a vector which elements contain the different words of
a string and is no longer necessary since Stata 11. It may be
necessary with st_sdata() and st_sview() with Stata 11 though. You can
write
st_view(X = .,.,varlist) instead.
See help whatsnew for more details
Christophe
2012/11/20 Nick Cox <[email protected]>:
> 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 <[email protected]> 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/
--
Christophe Kolodziejczyk
Research Fellow
AKF, Anvendt KommunalForskning
Danish Institute of Governmental Research
Købmagergade 22
DK-1150 København K
*
* 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/