Announcement

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

  • Generate new variable based on values of other variables

    Hi!

    I am trying to construct a new variable which will equal 1 if any 3 of 4 variables (below) equal 1 or .m. I could painstakingly write out all the different combinations but trying to figure out if there is an easier way. Data below:
    Code:
    * Example generated by -dataex-. For more info, type help dataex
    clear
    input byte(xvx_p0_cov xvx_p1_cov xvx_p2_cov xvx_p3_cov)
    .z .z .z .z
    .m .m .m  0
     1 .m .m .m
     0  1  1  1
    .z .z .z .z
    .z .z .z .z
     1  1  1  1
    .z .z .z .z
     1  1  1  0
    .z .z .z .z
     1  1  1  1
    .z .z .z .z
     1  1  1  1
    .z .z .z .z
    .z .z .z .z
    .z .z .z .z
     1  1  1  1
     1  1  1  1
     1  1  1  1
     0  1  1  1
     0  1  1  1
    .z .z .z .z
     1  1  1  1
     1  1  1  1
     1  1  1  1
     1  1  1  1
    .z .z .z .z
    .z .z .z .z
     0  1  1  1
     0  0  0  0
     0  1  1  0
    .z .z .z .z
     0  1  0 .i
    .z .z .z .z
    .z .z .z .z
    .z .z .z .z
     0  1  1 .d
     1  1  1  1
     1  1  1  1
    .m .m .m  0
    .z .z .z .z
     1  1  1  1
    .z .z .z .z
    .z .z .z .z
    .z .z .z .z
    .z .z .z .z
     1  1  1  1
     0  1  1  0
    .z .z .z .z
     1  1  1  1
     1  1  1  1
    .z .z .z .z
    .z .z .z .z
     0  1  1  1
     1  1  1  1
    .z .z .z .z
     1  1  1  1
     1  1  1  1
     0  1  1  1
    .z .z .z .z
     0  0  0  0
    .z .z .z .z
    .z .z .z .z
    .z .z .z .z
     1  1  1  0
     1  1  1  1
    .z .z .z .z
    .z .z .z .z
     1  1  1  1
     1  1  1  1
     1  1  1  1
     1  1  1  1
    .z .z .z .z
     0  0  0  0
    .z .z .z .z
    .m .m  0  0
    .z .z .z .z
    .z .z .z .z
     1  1  1  0
     0  1  1  1
    .z .z .z .z
    .m  1  1  1
    .z .z .z .z
    .z .z .z .z
     1  1  0  0
    .z .z .z .z
    .z .z .z .z
     1  1  1  1
    .z .z .z .z
    .z .z .z .z
    .z .z .z .z
     1  1  1  1
    .z .z .z .z
    .z .z .z .z
     1  1  1  0
     0  1  1  0
     0  0  0  0
    .z .z .z .z
    .z .z .z .z
     1  1  1  1
    end
    label values xvx_p0_cov vx_p0_cov
    label def vx_p0_cov 0 "No vaccination", modify
    label def vx_p0_cov 1 "Vaccination received", modify
    label def vx_p0_cov .m "Mother report", modify
    label def vx_p0_cov .z "No information for child", modify
    label values xvx_p1_cov vx_p1_cov
    label def vx_p1_cov 0 "No vaccination", modify
    label def vx_p1_cov 1 "Vaccination received", modify
    label def vx_p1_cov .m "Mother report", modify
    label values xvx_p2_cov vx_p2_cov
    label def vx_p2_cov 0 "No vaccination", modify
    label def vx_p2_cov 1 "Vaccination received", modify
    label def vx_p2_cov .m "Mother report", modify
    label values xvx_p3_cov vx_p3_cov
    label def vx_p3_cov 0 "No vaccination", modify
    label def vx_p3_cov 1 "Vaccination received", modify
    label def vx_p3_cov .d "No vaccination date", modify
    label def vx_p3_cov .i "Impossible date", modify
    label def vx_p3_cov .m "Mother report", modify

  • #2
    the following requires a function from the -egenmore- package which can be downloaded from SSC:
    Code:
    ssc install egenmore
    and then you can use the following:
    Code:
    egen newvar=rcount(xvx*), cond(@==1 | @==.m)
    this will give you a variable that is the count of the number of occurrences of either 1 or .m; this is what I get from your data example:
    Code:
    . ta newvar
    
         newvar |      Freq.     Percent        Cum.
    ------------+-----------------------------------
              0 |          4        4.00        4.00
              2 |          6        6.00       10.00
              3 |         14       14.00       24.00
              4 |         76       76.00      100.00
    ------------+-----------------------------------
          Total |        100      100.00
    and you can go from there

    obviously, you can name the new variable whatever name you want

    Comment


    • #3
      If you are working on a computer where you are not able to install -egenmore-, this can also be done with a native Stata -egen- function, -anycount()-. It is a little big awkward, because -anycount()- doesn't play with missing values. But we can get around that by temporarily encoding .m with a magic number (I used 99), and then restoring the original .m's afterward.
      Code:
      mvencode xvx_p*_cov, mv(.m = 99)
      egen counter = anycount(xvx_p*_cov), values(1 99)
      gen byte wanted = counter >= 3
      mvdecode xvx_p*_cov, mv(99 = .m)
      Note: You said you wanted the variable to identify when any three of the four are 1 or .m. That language is a bit ambiguous: you might or might not want the result to be 1 if all four of them are 1 or 99--either way would be compatible with the normal understanding of that phrase. I'm assuming that you meant any three or more, not any three but only three. If you meant any three but only three, then change >= 3 to == 3.

      Comment


      • #4
        Here, partly for fun, is a third way to do it. One loop, but no download, no recoding. I removed duplicates from your data example (excellent) with duplicates.


        Code:
        * Example generated by -dataex-. For more info, type help dataex
        clear
        input byte(xvx_p0_cov xvx_p1_cov xvx_p2_cov xvx_p3_cov)
        .z .z .z .z
        .m .m .m  0
         1 .m .m .m
         0  1  1  1
         1  1  1  1
         1  1  1  0
         0  0  0  0
         0  1  1  0
         0  1  0 .i
         0  1  1 .d
        .m .m  0  0
        .m  1  1  1
         1  1  0  0
        end
        label values xvx_p0_cov vx_p0_cov
        label def vx_p0_cov 0 "No vaccination", modify
        label def vx_p0_cov 1 "Vaccination received", modify
        label def vx_p0_cov .m "Mother report", modify
        label def vx_p0_cov .z "No information for child", modify
        label values xvx_p1_cov vx_p1_cov
        label def vx_p1_cov 0 "No vaccination", modify
        label def vx_p1_cov 1 "Vaccination received", modify
        label def vx_p1_cov .m "Mother report", modify
        label values xvx_p2_cov vx_p2_cov
        label def vx_p2_cov 0 "No vaccination", modify
        label def vx_p2_cov 1 "Vaccination received", modify
        label def vx_p2_cov .m "Mother report", modify
        label values xvx_p3_cov vx_p3_cov
        label def vx_p3_cov 0 "No vaccination", modify
        label def vx_p3_cov 1 "Vaccination received", modify
        label def vx_p3_cov .d "No vaccination date", modify
        label def vx_p3_cov .i "Impossible date", modify
        label def vx_p3_cov .m "Mother report", modify
        
        gen count = 0  
        
        forval j = 0/3 { 
            replace count = count + inlist(xvx_p`j'_cov, 1, .m)
        }
        
        gen wanted = count >= 3 
        
        sort count xvx_p?_cov 
        
        list, sepby(count)
        
             +----------------------------------------------------------------------------------------------------------------+
             |               xvx_p0_cov             xvx_p1_cov             xvx_p2_cov             xvx_p3_cov   count   wanted |
             |----------------------------------------------------------------------------------------------------------------|
          1. |           No vaccination         No vaccination         No vaccination         No vaccination       0        0 |
          2. | No information for child                     .z                     .z                     .z       0        0 |
             |----------------------------------------------------------------------------------------------------------------|
          3. |           No vaccination   Vaccination received         No vaccination        Impossible date       1        0 |
             |----------------------------------------------------------------------------------------------------------------|
          4. |           No vaccination   Vaccination received   Vaccination received         No vaccination       2        0 |
          5. |           No vaccination   Vaccination received   Vaccination received    No vaccination date       2        0 |
          6. |     Vaccination received   Vaccination received         No vaccination         No vaccination       2        0 |
          7. |            Mother report          Mother report         No vaccination         No vaccination       2        0 |
             |----------------------------------------------------------------------------------------------------------------|
          8. |           No vaccination   Vaccination received   Vaccination received   Vaccination received       3        1 |
          9. |     Vaccination received   Vaccination received   Vaccination received         No vaccination       3        1 |
         10. |            Mother report          Mother report          Mother report         No vaccination       3        1 |
             |----------------------------------------------------------------------------------------------------------------|
         11. |     Vaccination received   Vaccination received   Vaccination received   Vaccination received       4        1 |
         12. |     Vaccination received          Mother report          Mother report          Mother report       4        1 |
         13. |            Mother report   Vaccination received   Vaccination received   Vaccination received       4        1 |
             +----------------------------------------------------------------------------------------------------------------+

        Comment

        Working...
        X