Announcement

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

  • marginsplot after running a multinomial logit: how to plot the cumulative probabilities as an area graph


    Hello, I have been using the marginsplot function plot predicted probabilities after mlogit estimations. I would like to know if anyone has a suggestion on how I could plot an area type of graph in which each point along the x-axis would add up to 1 in the y-axis. Any suggestions on how do do it could be most welcomed. Below follows an example code that replicates what I have been doing to do so far.
    Code:
     use https://stats.idre.ucla.edu/stat/data/hsbdemo, clear mlogit prog i.ses write, base(2) margins ses, atmeans predict() marginsplot, noci
    All the very best, JP

  • #2
    Code:
    version 16.1
    set scheme s1color
    use https://stats.idre.ucla.edu/stat/data/hsbdemo, clear
    mlogit prog i.ses write, base(2)
    
    frame copy default graphses, replace
    frame change graphses
    
    replace write = 50 // fix the other xs
    predict double pr*
    
    replace pr2 = pr1 + pr2
    
    replace pr3 = pr2 + pr3
    assert reldif(pr3,1) < 1e-6
    
    twoway bar pr3 ses, barw(.7) ||      ///
           bar pr2 ses, barw(.7) ||      ///
           bar pr1 ses, barw(.7)         ///
           ylab(0(.25)1, angle(0))       ///
           xlab(1/3, val)                ///
           legend(order(1 "vocational"   ///
                        2 "academic"     ///
                        3 "general")     ///
                  cols(3))               ///
           ytitle(predicted probability) ///
           name(ses, replace)
    
    frame change default    
    
    frame copy default graphwrite, replace
    frame change graphwrite
    
    replace ses = 2 // fix the other xs
    predict double pr*
    
    replace pr2 = pr2 + pr1
    replace pr3 = pr2 + pr3
    assert reldif(pr3,1) < 1e-6
    
    sort write
    twoway area pr3 write ||             ///
           area pr2 write ||             ///
           area pr1 write,               ///
           xlabel(35(5)65)               ///
           ylabel(0(.25)1, angle(0))     ///
           plotregion(margin(zero))      ///
           legend(order(1 "vocational"   ///
                        2 "academic"     ///
                        3 "general")     ///
                  cols(3))               ///       
           ytitle(predicted probability) ///
           name(write, replace)
    
    frame change default
    Click image for larger version

Name:	Graph.png
Views:	1
Size:	38.5 KB
ID:	1561555

    Click image for larger version

Name:	Graph.png
Views:	1
Size:	43.4 KB
ID:	1561556
    ---------------------------------
    Maarten L. Buis
    University of Konstanz
    Department of history and sociology
    box 40
    78457 Konstanz
    Germany
    http://www.maartenbuis.nl
    ---------------------------------

    Comment


    • #3
      Many thanks Maarten

      Comment


      • #4
        Originally posted by Maarten Buis View Post
        Code:
        version 16.1
        set scheme s1color
        use https://stats.idre.ucla.edu/stat/data/hsbdemo, clear
        mlogit prog i.ses write, base(2)
        
        frame copy default graphses, replace
        frame change graphses
        
        replace write = 50 // fix the other xs
        predict double pr*
        
        replace pr2 = pr1 + pr2
        
        replace pr3 = pr2 + pr3
        assert reldif(pr3,1) < 1e-6
        
        twoway bar pr3 ses, barw(.7) || ///
        bar pr2 ses, barw(.7) || ///
        bar pr1 ses, barw(.7) ///
        ylab(0(.25)1, angle(0)) ///
        xlab(1/3, val) ///
        legend(order(1 "vocational" ///
        2 "academic" ///
        3 "general") ///
        cols(3)) ///
        ytitle(predicted probability) ///
        name(ses, replace)
        
        frame change default
        
        frame copy default graphwrite, replace
        frame change graphwrite
        
        replace ses = 2 // fix the other xs
        predict double pr*
        
        replace pr2 = pr2 + pr1
        replace pr3 = pr2 + pr3
        assert reldif(pr3,1) < 1e-6
        
        sort write
        twoway area pr3 write || ///
        area pr2 write || ///
        area pr1 write, ///
        xlabel(35(5)65) ///
        ylabel(0(.25)1, angle(0)) ///
        plotregion(margin(zero)) ///
        legend(order(1 "vocational" ///
        2 "academic" ///
        3 "general") ///
        cols(3)) ///
        ytitle(predicted probability) ///
        name(write, replace)
        
        frame change default
        [ATTACH=CONFIG]n1561555[/ATTACH]
        [ATTACH=CONFIG]n1561556[/ATTACH]

        Hi Maarten (or anyone else),
        Could you explain what is going on in this coding in a little more detail? I have been trying to replicate the bottom figure, but it keeps returning an empty graph.
        Why do you fix ses (replace ses = 2 // fix the other xs)?

        What does this do? (It seems to me like you end up with pr3 having the same value as pr2 (and pr1))
        replace pr2 = pr2 + pr1
        replace pr3 = pr2 + pr3

        Comment

        Working...
        X