Announcement

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

  • How to compute simultaneous confidence intervals for multinomial proportions?

    Hello everybody,

    I would like to use a multinomial variable in one sample of subjects to make inferences about the proportion of the population in each category, with confidence intervals.
    Apparently there is a 'Multinomial CI' package in R (http://cran.at.r-project.org/web/pac...tinomialCI.pdf).
    Do you know how to do the same in STATA?

    Thank you very much in advance.

    Thomas
    Last edited by tsimonso; 07 Aug 2014, 03:20.

  • #2
    I'm resurrecting this old thread because I have the same question: Does anyone know of a Stata program to compute simultaneous confidence intervals for multinomial proportions?

    Thanks,
    Bruce
    --
    Bruce Weaver
    Email: [email protected]
    Version: Stata/MP 19.5 (Windows)
    Crypticity belongs in crosswords, not code! 🀨

    Comment


    • #3
      Another polite "bump" from me.
      I would also like to use simultaneous CIs for multinomial proportions without asking someone to do it in SAS or R for me.
      I looked at the help section to find out if there were any packages/utilities I could use but the search only returned mlogit.
      Unless I am missing something obvious like an option from a contingency table convenience command?

      Thanks in advance for your help.
      Gaby
      Stata BE ver 17
      MacOS Ventura

      Comment


      • #4
        Here's one hack that *might* help: You can run -mlogit y- without any predictors. Then, you can use -margins, predict- to get CIs based on parameters and standard errors estimated simultaneously. I can't figure out how to get -margins- to generate the prediction and CI for more than one outcome at a time, but you can do them serially:
        Code:
        sysuse auto
        mlogit rep78
        margins, predict(pr outcome(1))
        margins, predict(pr outcome(2))
        I don't know if this will give a correct result, as I don't have anything with which to compare. And, at this small sample size, I wouldn't trust these results.

        Comment


        • #5
          Hello Mike,
          Thanks for the advice - I tried it but up to now I haven't been able to find a way to verify the reliability of the results so I ended up using the procedure in SAS that Bruce Weaver suggested.
          I am surprised that this has not been dealth with by Stata yet.
          I think some people are creating indicator variables for each level of a category and calculating binomial CIs from each of these indicator variables.
          I am hoping that this thread might come to the attention of the luminaries of Statalist!
          Thanks again
          Gaby
          Stata BE ver 17
          MacOS Ventura

          Comment


          • #6
            Mike, I think that what you are looking for is
            Code:
            margins, predict()
            As you can see, the lower bound of the confidence interval for the first category is negative (which does not make sense). This is circumvented by the proportion command since it applies the logit transformation to the confidence intervals (and then transfoms it back to the original metric).

            What I am curious is the following. We know that, given a multinomial variable, the outcome given by proportion for a given category k is exactly the same as what we would get by applying proportion to a binomial variable which is 1 if the observation is in the category k and 0 otherwise. E.g. for the category 2 of rep78 in the auto dataset we get
            Code:
            sysuse auto, clear
            gen rep78_2=(rep78==2) if !missing(rep78)
            proportion rep78, citype(logit)
            proportion rep78_2, citype(logit)
            However, as some discussion suggests (see for example https://www.stata.com/statalist/arch.../msg00483.html), more acceptable confidence interval for binomial variables can be found by using ci instead (e.g. those under the wilson and agresti options which provide better coverage than that one using the exact formula for the binomial distribution). Hence, to the extent that the confidence intervals for each category of a multinomial variable reported by proportion command are the same that result running the command for each (binomial) category, and given that these later confidence intervals should be corrected, do the confidence intervals provided by proportion make sense at all? I have seen Gaby's suggestion floating around the internet, namely treating every category of the multinomial variable as a binomial variable per se and use the ci command with the desired method, but without making any reference to a paper or theory that says why this should be the a reasonable procedure (in the case it is reasonable). I hope someone from the Stata team can help us out on this one!

            Thank you
            Last edited by Juan del Pozo; 04 Sep 2018, 05:34. Reason: typo

            Comment


            • #7
              I am resurrecting this old thread again, because AFAICT, there is still no (easy) way to get simultaneous confidence intervals for multinomial proportions. The words simultaneous and multinomial appear nowhere in the documentation for -proportion-, for example. And the main resource that is cited appears to discuss binomial proportions only.

              I also wanted to follow up on the example Juan del Pozo posted in #6 and to try Mike Lacy's -mlogit- suggestion in #4. Here's a summary of what I did.
              • Using the auto dataset, I generated CIs for each level of rep78 by 3 different methods: -ci proportions-, -proportion-, and -mlogit-.
              • I assumed -mlogit- + -margins- would produce a Wald CI, so used the wald option for both -ci proportions- and -proportion-.
              • I compared the proportions, SEs, and confidence bounds for the 3 methods.
              My (somewhat clunky) code can be found at the end of this post. I ran it under v18, but it should work for v15 or later. Here are the main results and my summary of what they show.

              Code:
              . * Compare the estimated proportions  
              . * p  = proportion from -ci proportions-
              . * p1 = proportion from -proportion-
              . * m1 = proportion from -mlogit- plus -margins-
              . list p p1 m1 prange in 1/5
              
                   +-----------------------------------------+
                   |        p         p1         m1   prange |
                   |-----------------------------------------|
                1. | .0289855   .0289855   .0289855        0 |
                2. |  .115942    .115942    .115942        0 |
                3. | .4347826   .4347826   .4347826        0 |
                4. | .2608696   .2608696   .2608696        0 |
                5. | .1594203   .1594203   .1594203        0 |
                   +-----------------------------------------+
              
              . * Compare the estimated SEs
              . * se = SE from -ci proportions-
              . * p2 = SE from -proportion-
              . * m2 = SE from -mlogit- plus -margins-
              . list se p2 m2 serange in 1/5
              
                   +------------------------------------------+
                   |       se         p2         m2   serange |
                   |------------------------------------------|
                1. | .0201966   .0201966   .0201966         0 |
                2. | .0385422   .0385422   .0385422         0 |
                3. | .0596787   .0596787   .0596787         0 |
                4. | .0528625   .0528625   .0528625         0 |
                5. | .0440694   .0440694   .0440694         0 |
                   +------------------------------------------+
              
              . * Compare the estimated lower bounds  
              . * lb = lower bound from -ci proportions-
              . * p5 = lower bound from -proportion-
              . * m5 = lower bound from -mlogit- plus -margins-
              . list lb p5 m5 lb1v2 lb1v3 lb2v3 in 1/5
              
                   +--------------------------------------------------------------------+
                   |       lb          p5          m5      lb1v2      lb1v3       lb2v3 |
                   |--------------------------------------------------------------------|
                1. |        0   -.0113162   -.0105991   .0113162   .0105991   -.0007171 |
                2. | .0404007    .0390323    .0404007   .0013684          0   -.0013684 |
                3. | .3178145    .3156956    .3178145   .0021189          0   -.0021189 |
                4. |  .157261    .1553841     .157261   .0018769          0   -.0018769 |
                5. | .0730459    .0714813    .0730459   .0015647          0   -.0015647 |
                   +--------------------------------------------------------------------+
              
              . * Compare the estimated upper bounds  
              . * ub = upper bound from -ci proportions-
              . * p6 = upper bound from -proportion-
              . * m6 = upper bound from -mlogit- plus -margins-
              . list ub p6 m6 ub1v2 ub1v3 ub2v3 in 1/5
              
                   +---------------------------------------------------------------+
                   |       ub         p6         m6       ub1v2   ub1v3      ub2v3 |
                   |---------------------------------------------------------------|
                1. | .0685702   .0692872   .0685702   -.0007171       0   .0007171 |
                2. | .1914833   .1928518   .1914833   -.0013684       0   .0013684 |
                3. | .5517507   .5538696   .5517507   -.0021189       0   .0021189 |
                4. | .3644782    .366355   .3644782   -.0018769       0   .0018769 |
                5. | .2457946   .2473593   .2457946   -.0015647       0   .0015647 |
                   +---------------------------------------------------------------+
              
              .
              . * SUMMARY
              . * All 3 methods return exactly the same
              . * estimated proportions and SEs.
              . * Regarding CIs, -ci proportions-
              . * and -mlogit- with -margins- return
              . * the same CIs EXCEPT that -mlogit-
              . * reports a lower bound < 0 for
              . * rep78 = 1.  -proportions- returns
              . * different limits.

              Here is the code, in case anyone else wants to tinker.

              Code:
              * Follow up on Juan del Pozo's example in #6 here:
              * https://www.statalist.org/forums/forum/general-stata-discussion/general/134445-how-to-compute-simultaneous-confidence-intervals-for-multinomial-proportions
              
              * Code was generated using Stata 18.0,
              * but should work with Stata 15 or higher
              version 15
              cls
              sysuse auto, clear
              keep foreign rep78
              keep if !missing(foreign, rep78)
              generate x = .
              generate p = .
              generate se = .
              generate lb = .
              generate ub = .
              forvalues i = 1/5 {
               quietly {
               replace x = rep78==`i'
               ci proportions x, wald
               replace p = r(proportion) if _n==`i'
               replace se = r(se) if _n==`i'
               replace lb = r(lb) if _n==`i'
               replace ub = r(ub) if _n==`i'
               }
              }
              proportion rep78, citype(wald)
              matrix p = r(table)'
              svmat p
              
              * Use -mlogit- as suggested by M Lacy
              quietly mlogit rep78
              margins, predict()
              matrix m = r(table)'
              svmat m
              
              drop p3 p4 p7 p8 p9 m3 m4 m7 m8 m9
              
              generate prange = max(p, p1, m1) - min(p, p1, m1)
              generate serange = max(se, p2, m2) - min(se, p2, m2)
              generate lbrange = max(lb, p5, m5) - min(lb, p5, m5)
              generate ubrange = max(ub, p6, m6) - min(ub, p6, m6)
              
              generate lb1v2 = lb-p5
              generate lb1v3 = lb-m5
              generate lb2v3 = p5-m5
              
              generate ub1v2 = ub-p6
              generate ub1v3 = ub-m6
              generate ub2v3 = p6-m6
              
              * Compare the estimated proportions  
              * p  = proportion from -ci proportions-
              * p1 = proportion from -proportion-
              * m1 = proportion from -mlogit- plus -margins-
              list p p1 m1 prange in 1/5
              * Compare the estimated SEs
              * se = SE from -ci proportions-
              * p2 = SE from -proportion-
              * m2 = SE from -mlogit- plus -margins-
              list se p2 m2 serange in 1/5
              * Compare the estimated lower bounds  
              * lb = lower bound from -ci proportions-
              * p5 = lower bound from -proportion-
              * m5 = lower bound from -mlogit- plus -margins-
              list lb p5 m5 lb1v2 lb1v3 lb2v3 in 1/5
              * Compare the estimated upper bounds  
              * ub = upper bound from -ci proportions-
              * p6 = upper bound from -proportion-
              * m6 = upper bound from -mlogit- plus -margins-
              list ub p6 m6 ub1v2 ub1v3 ub2v3 in 1/5
              
              * SUMMARY
              * All 3 methods return exactly the same
              * estimated proportions and SEs.
              * Regarding CIs, -ci proportions-
              * and -mlogit- with -margins- return
              * the same CIs EXCEPT that -mlogit-
              * reports a lower bound < 0 for
              * rep78 = 1.  -proportions- returns
              * different limits.
              --
              Bruce Weaver
              Email: [email protected]
              Version: Stata/MP 19.5 (Windows)
              Crypticity belongs in crosswords, not code! 🀨

              Comment


              • #8
                Hi Bruce
                i have a suggestion based on simulations
                see it here
                https://friosavila.github.io/stata_do/stata_do5.html

                Comment


                • #9
                  Originally posted by Bruce Weaver View Post
                  I am resurrecting this old thread again, because AFAICT, there is still no (easy) way to get simultaneous confidence intervals for multinomial proportions.
                  Try the attached ado-file.

                  It implements the two methods that the SAS blogger, Rick Wicklin, calls β€œGoodman (1965)” and β€œQuesenberry and Hurst (1964)” in his post of an updated SAS algorithm for computing confidence intervals for multinomial proportions. He mentions that an earlier investigation indicates that the first of these methods be favored for the purpose in most cases.

                  There's no helpfile, but its syntax is
                  Code:
                  mpci varname [if] [in] [fweight], options
                  where options are
                  Code:
                  method( goodman | qandh ) level(#)
                  For this version the variable needs to be numeric, but remedying that wouldn't be difficult in a future version. The output could be prettied, too, although it does deliver the results in a return matrix, r(table) if you want to use them further.

                  It's an exercise in Mata class programming and so the code is a bit verbose, and it uses (simple) inheritance for the two methods when a template method pattern (composition) would have been cuter.

                  Here it is in action where it matches the SAS results for Goodman's method shown in the first link above. (I've also attached a rudimentary test do-file.)

                  .ΓΏ
                  .ΓΏversionΓΏ18.0

                  .ΓΏ
                  .ΓΏclearΓΏ*

                  .ΓΏ
                  .ΓΏinputΓΏstr20ΓΏcategoryΓΏintΓΏcount

                  ΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏcategoryΓΏΓΏΓΏΓΏΓΏcount
                  ΓΏΓΏ1.ΓΏNeuroticΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏ91
                  ΓΏΓΏ2.ΓΏDepressedΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏ49
                  ΓΏΓΏ3.ΓΏSchizophrenicΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏ37
                  ΓΏΓΏ4.ΓΏ"PersonalityΓΏdisorder"ΓΏΓΏ43
                  ΓΏΓΏ5.ΓΏend

                  .ΓΏ
                  .ΓΏencodeΓΏcategory,ΓΏgenerate(cat)ΓΏlabel(Diagnoses)

                  .ΓΏlist,ΓΏnoobs

                  ΓΏΓΏ+-----------------------------------------------------+
                  ΓΏΓΏ|ΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏcategoryΓΏΓΏΓΏcountΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏcatΓΏ|
                  ΓΏΓΏ|-----------------------------------------------------|
                  ΓΏΓΏ|ΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏNeuroticΓΏΓΏΓΏΓΏΓΏΓΏ91ΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏNeuroticΓΏ|
                  ΓΏΓΏ|ΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏDepressedΓΏΓΏΓΏΓΏΓΏΓΏ49ΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏDepressedΓΏ|
                  ΓΏΓΏ|ΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏSchizophrenicΓΏΓΏΓΏΓΏΓΏΓΏ37ΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏSchizophrenicΓΏ|
                  ΓΏΓΏ|ΓΏPersonalityΓΏdisorderΓΏΓΏΓΏΓΏΓΏΓΏ43ΓΏΓΏΓΏPersonalityΓΏdisorderΓΏ|
                  ΓΏΓΏ+-----------------------------------------------------+

                  .ΓΏ
                  .ΓΏ//ΓΏGoodman'sΓΏmethodΓΏ(theΓΏdefault)
                  .ΓΏmpciΓΏcatΓΏ[fweight=count]
                  ΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏProp.ΓΏΓΏLBΓΏΓΏΓΏΓΏUB
                  ΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏDepressedΓΏ0.2227ΓΏ0.1609ΓΏ0.2999
                  ΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏNeuroticΓΏ0.4136ΓΏ0.3342ΓΏ0.4978
                  PersonalityΓΏdisorderΓΏ0.1955ΓΏ0.1375ΓΏ0.2702
                  ΓΏΓΏΓΏΓΏΓΏΓΏΓΏSchizophrenicΓΏ0.1682ΓΏ0.1146ΓΏ0.2401

                  .ΓΏreturnΓΏlist

                  scalars:
                  ΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏr(N)ΓΏ=ΓΏΓΏ220
                  ΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏr(r)ΓΏ=ΓΏΓΏ4

                  matrices:
                  ΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏr(table)ΓΏ:ΓΏΓΏ4ΓΏxΓΏ3

                  .ΓΏmatrixΓΏlistΓΏr(table)

                  r(table)[4,3]
                  ΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏProportionΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏlbΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏub
                  ΓΏΓΏΓΏDepressedΓΏΓΏΓΏ.22272727ΓΏΓΏΓΏ.16085875ΓΏΓΏΓΏΓΏ.2998874
                  ΓΏΓΏΓΏΓΏNeuroticΓΏΓΏΓΏ.41363636ΓΏΓΏΓΏ.33420248ΓΏΓΏΓΏ.49783321
                  Personalit~rΓΏΓΏΓΏ.19545455ΓΏΓΏΓΏ.13746901ΓΏΓΏΓΏ.27023577
                  Schizophre~cΓΏΓΏΓΏ.16818182ΓΏΓΏΓΏ.11455134ΓΏΓΏΓΏ.24011208

                  .ΓΏ
                  .ΓΏ//ΓΏAlthernativeΓΏQuesenberryΓΏandΓΏHurstΓΏmethod
                  .ΓΏmpciΓΏcatΓΏ[fweight=count],ΓΏm(q)
                  ΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏProp.ΓΏΓΏLBΓΏΓΏΓΏΓΏUB
                  ΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏDepressedΓΏ0.2227ΓΏ0.1546ΓΏ0.3099
                  ΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏΓΏNeuroticΓΏ0.4136ΓΏ0.3253ΓΏ0.5079
                  PersonalityΓΏdisorderΓΏ0.1955ΓΏ0.1317ΓΏ0.2801
                  ΓΏΓΏΓΏΓΏΓΏΓΏΓΏSchizophrenicΓΏ0.1682ΓΏ0.1094ΓΏ0.2498

                  .ΓΏ
                  .ΓΏ//ΓΏAnotherΓΏexample
                  .ΓΏquietlyΓΏsysuseΓΏauto,ΓΏclear

                  .ΓΏ
                  .ΓΏmpciΓΏrep78
                  ΓΏΓΏProp.ΓΏΓΏLBΓΏΓΏΓΏΓΏUB
                  1ΓΏ0.0290ΓΏ0.0057ΓΏ0.1349
                  2ΓΏ0.1159ΓΏ0.0490ΓΏ0.2503
                  3ΓΏ0.4348ΓΏ0.2936ΓΏ0.5874
                  4ΓΏ0.2609ΓΏ0.1501ΓΏ0.4136
                  5ΓΏ0.1594ΓΏ0.0768ΓΏ0.3018

                  .ΓΏ
                  .ΓΏexit

                  endΓΏofΓΏdo-file


                  .
                  Attached Files
                  Last edited by Joseph Coveney; 03 Jun 2023, 18:59.

                  Comment


                  • #10
                    Thanks FernandoRios and Joseph Coveney.
                    --
                    Bruce Weaver
                    Email: [email protected]
                    Version: Stata/MP 19.5 (Windows)
                    Crypticity belongs in crosswords, not code! 🀨

                    Comment


                    • #11
                      Hi:

                      The difference between -ci proportions- and -proportion- is because the former uses normal distribution for the critical value whereas the later uses Student's t distribution.

                      Comment

                      Working...
                      X