Announcement

Collapse
No announcement yet.
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • mosave classes

    Dear Stata users,

    I would like to ask a question on the mosave command. Below you can find the code that creates a matrix containing the ranks of the numbers in a real matrix that is given as argument (the functions are rowrank() and colrank() respectively). To account for possible ties, and also to exercise object-oriented programming, I programmed a class. The code is not very efficient I'm afraid, but it works out perfectly, at least for my purposes. Having said this, it works with one exception: everytime I try to store the ties() class by typing

    mata mosave ties(), dir(PERSONAL) replace complete

    Stata freezes. Mysteriously (only for me I guess) that happens only in Stata 13, while the same code works fine in Stata 11. Still I suspect there's a problem with the code, since when I restart Stata 11 and type

    mata describe ties()

    the class seems to be empty. In the mata help file it states that the entire class definition, including all compiled member functions, should be stored by the mosave class() command, so I am confused of what I did wrong.


    This is the code which can just be copied and run in Stata as it is. The sercond-to-last line (which is now commented out) is the problematic one

    Code:
    capture mata mata drop ties()
    capture mata mata drop rowrank()
    capture mata mata drop colrank()
    
    mata:
        class ties {
            /* Take care of ties while creating colrank or rowrank matrix */
            real vector rank_me        /* vector of interest (to be ranked) */
            real vector k, m, v        /* determined by function ::range_ties() */
            real vector range_ties()
            real scalar t, s, u
        }
    
        real vector ties::range_ties()
        {
            minindex(rank_me,.,k,m)
            if (!allof(m[,2], 1)) { /* perform only if there are any ties in vector rank_me */
                t=s=1
                v=J(length(rank_me),1,.)
                while (t<=length(v)) {
                    u=m[s,2]     /* u = how many rows to fill in v ( equalling the # of tied numbers). u >= 1 */
                    v[t::(t+u-1)] = J(u,1,m[s,1])
                    t=t+u; s=s+1 
                }
            }
            else v = 1::length(rank_me)
            return(v)
        }
    
        real matrix colrank (real matrix a)
        {
            real matrix b
            real scalar j
            class ties scalar c
            
            b=J(rows(a),cols(a),.)
            
            for (j=1; j<=cols(a); j++) {
                c.rank_me = a[.,j]
                b[,j] = sort( (order(a,j),c.range_ties() ), 1)[.,2]
            }
            return(b)
        }
    
    
        real matrix rowrank (real matrix a)
        {
            real matrix b
            real scalar j
            pointer scalar atrans
            class ties scalar d
            
            /* Transpose vector since sort() fn can only sort columns */
            atrans = &(a')
            b=J(rows(*atrans),cols(*atrans),.)
            
            for (j=1; j<=cols(*atrans); j++) {
                d.rank_me = (*atrans)[.,j]
                b[,j] = sort( (order(*atrans,j),d.range_ties() ), 1)[.,2]
            }
            
            b=b'
            return(b)
        }
    
        mata mosave rowrank(), dir(PERSONAL) replace
        mata mosave colrank(), dir(PERSONAL) replace
        //mata mosave ties(), dir(PERSONAL) replace complete    /* Causes Stata to freeze */
    end
    As an example, try

    Code:
    a=(1,5,3,120,5)
    rowrank(a)

    Any suggestion is highly appreciated! Not only for this particular problem, but also for general education Thanks a lot!

    Regards
    Jann


  • #2
    Strange behavior. Actually I have had the same problem at some point. I solved it by creating a library with the complete option and it worked. As expected if you omit to code the range_ties() function, then you get an error message telling you that the function is defined in the class but the method does not exist. I also tried the coord() example from the manual and saved it with mosave and the complete option (as specified in the manual). I had the same result as you. Looks like a bug to me. Stata is actually still frozen .

    Comment


    • #3
      If this is can be replicated, Stata tech-support should be notified.

      Best
      Daniel

      Comment


      • #4
        Thanks Daniel for your suggestion. I forgot to mention that I use Stata SE 13.1 on Windows.

        Comment


        • #5
          Thanks Christophe! Storing it in the library is a good workaround of course.

          Jann

          Comment

          Working...
          X