Announcement

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

  • Constraining the X-Axis within a range

    I'm studying the causal impact of Puerto Rico's VacuTour policy with my event-study synthetic control estimator. I want to give myself and other users of my command the ability to average and graph their pointwise effects within whatever temporal window they choose. This is partly so folks can see the causal effect better, but also since some policies may not have very long term effects (i.e., until the end of the time series). In my case, I want to force the x-axis, the relative time axis, to be within 28 periods before the intervention and 28 periods afterwards.


    I figured we'd naturally use the -if- option since that'll restrict our sample however we choose. However, when I try this, Stata returns to me the graph I desire, but the x-axis extends from 40 days before to 40 days after, which could give readers and others the wrong impression. All I want, is to force the x-axis to be within -28/28. Here's my code.

    Code:
    * Example generated by -dataex-. For more info, type help dataex
    clear
    input float(relative_ diff_ lowbound_ upbound_)
    -28 -.23405184  -40.92885   40.46075
    -27 -.21228437  -40.90708   40.48251
    -26 -2.8375804  -43.53238  37.857216
    -25  1.6115553  -39.08324   42.30635
    -24   .4068981   -40.2879    41.1017
    -23   .4525818  -40.24222   41.14738
    -22  -1.950658  -42.64546   38.74414
    -21 -1.7958262  -42.49063   38.89898
    -20  -.4942572  -41.18906   40.20054
    -19  -3.309373  -44.00417  37.385426
    -18 -.57243955  -41.26724   40.12236
    -17   2.569238  -38.12556   43.26404
    -16   2.427209  -38.26759   43.12201
    -15  1.0074625  -39.68734   41.70226
    -14  1.0761077  -39.61869   41.77091
    -13  -1.523999   -42.2188    39.1708
    -12  -.9060938  -41.60089   39.78871
    -11   .6814575  -40.01334   41.37626
    -10  2.1758146  -38.51898   42.87061
     -9   3.407859  -37.28694   44.10266
     -8   4.730154 -35.964645   45.42495
     -7  -1.399982  -42.09478   39.29482
     -6  .13326946  -40.56153   40.82807
     -5  1.9785467  -38.71625   42.67334
     -4   2.253932  -38.44086   42.94873
     -3   5.074914 -35.619884   45.76971
     -2  4.2422204  -36.45258   44.93702
     -1   5.072356 -35.622444   45.76715
      0  -8.734286  -49.42908   31.96051
      1  1.1307629  -39.56403   41.82556
      2   7.365439  -33.32936   48.06024
      3     6.7859 -33.908897    47.4807
      4   10.42575  -30.26905   51.12055
      5   9.159128  -31.53567   49.85393
      6   8.031276  -32.66352   48.72607
      7  11.757857  -28.93694   52.45266
      8  -6.303397  -46.99819  34.391403
      9 -11.902307  -52.59711   28.79249
     10  -8.759895  -49.45469    31.9349
     11  -26.40079  -67.09559  14.294008
     12  -32.28964 -72.984436   8.405159
     13  -31.45153 -72.146324   9.243271
     14  -35.57741  -76.27221   5.117386
     15 -32.969852  -73.66465   7.724947
     16  -38.73798  -79.43278   1.956817
     17  -47.03251  -87.72731  -6.337713
     18  -59.44791  -100.1427  -18.75311
     19  -59.10678  -99.80157  -18.41198
     20   -74.3221  -115.0169 -33.627296
     21  -77.36971  -118.0645 -36.674904
     22  -88.54966 -129.24446  -47.85486
     23  -90.35377 -131.04857  -49.65897
     24  -94.14935 -134.84416  -53.45456
     25  -97.99923 -138.69403  -57.30443
     26  -99.54365 -140.23845  -58.84885
     27 -108.90373 -149.59853  -68.20893
     28 -105.69733 -146.39214  -65.00253
    end
    
    qui su diff if rel >= 0, mean
    
    loc ATT: disp %6.4g `r(mean)'
    
    loc before = 28
    
    loc after = 28
    
    loc intname "Vacutour"
    
    tw ///
        (connected diff_ relative_, /// Plot 1, Average Lines
            mcolor("0 142 234") msize(medium) ///
            msymbol(circle) lcolor("0 142 234") lwidth(medium)) ///
        (rarea lowbound_ upbound_ relative_, /// plot 2, 95% CIs
            fcolor("252 201 185 %40") lcolor("252 201 185 %40")) if inrange(rel,-`before',`after'), ///
                legend(order(1 "ATT" 2 "Confidence Interval") pos(7) ring(0)) /// other graph options
                note("ATT = `ATT', adjusted for imbalances in event-time.") ///
                xti("Time Relative to `intname'") name(eventplot, replace) scheme(`scheme') ///
                yti("Pointwise ATT") xli(0, lcol(blue) lwidth(thick)) ///
                ti("SCUL, Event-Study")
    I know Stata under the hood has her own rules about axis making, so if there's no easy way to do this it isn't the end of the world, I just wanted to see if it were possible. Oh, and note that my default scheme is gg_tableau, but I suspect this won't likely matter to my question.

  • #2
    It seems like your data are already limited to x-values between -28 and 28, so I don't understand why you're using an if condition. Regardless, adding an -xlabel- solves your problem:

    Code:
    * Example generated by -dataex-. For more info, type help dataex
    clear
    input float(relative_ diff_ lowbound_ upbound_)
    -28 -.23405184  -40.92885   40.46075
    -27 -.21228437  -40.90708   40.48251
    -26 -2.8375804  -43.53238  37.857216
    -25  1.6115553  -39.08324   42.30635
    -24   .4068981   -40.2879    41.1017
    -23   .4525818  -40.24222   41.14738
    -22  -1.950658  -42.64546   38.74414
    -21 -1.7958262  -42.49063   38.89898
    -20  -.4942572  -41.18906   40.20054
    -19  -3.309373  -44.00417  37.385426
    -18 -.57243955  -41.26724   40.12236
    -17   2.569238  -38.12556   43.26404
    -16   2.427209  -38.26759   43.12201
    -15  1.0074625  -39.68734   41.70226
    -14  1.0761077  -39.61869   41.77091
    -13  -1.523999   -42.2188    39.1708
    -12  -.9060938  -41.60089   39.78871
    -11   .6814575  -40.01334   41.37626
    -10  2.1758146  -38.51898   42.87061
     -9   3.407859  -37.28694   44.10266
     -8   4.730154 -35.964645   45.42495
     -7  -1.399982  -42.09478   39.29482
     -6  .13326946  -40.56153   40.82807
     -5  1.9785467  -38.71625   42.67334
     -4   2.253932  -38.44086   42.94873
     -3   5.074914 -35.619884   45.76971
     -2  4.2422204  -36.45258   44.93702
     -1   5.072356 -35.622444   45.76715
      0  -8.734286  -49.42908   31.96051
      1  1.1307629  -39.56403   41.82556
      2   7.365439  -33.32936   48.06024
      3     6.7859 -33.908897    47.4807
      4   10.42575  -30.26905   51.12055
      5   9.159128  -31.53567   49.85393
      6   8.031276  -32.66352   48.72607
      7  11.757857  -28.93694   52.45266
      8  -6.303397  -46.99819  34.391403
      9 -11.902307  -52.59711   28.79249
     10  -8.759895  -49.45469    31.9349
     11  -26.40079  -67.09559  14.294008
     12  -32.28964 -72.984436   8.405159
     13  -31.45153 -72.146324   9.243271
     14  -35.57741  -76.27221   5.117386
     15 -32.969852  -73.66465   7.724947
     16  -38.73798  -79.43278   1.956817
     17  -47.03251  -87.72731  -6.337713
     18  -59.44791  -100.1427  -18.75311
     19  -59.10678  -99.80157  -18.41198
     20   -74.3221  -115.0169 -33.627296
     21  -77.36971  -118.0645 -36.674904
     22  -88.54966 -129.24446  -47.85486
     23  -90.35377 -131.04857  -49.65897
     24  -94.14935 -134.84416  -53.45456
     25  -97.99923 -138.69403  -57.30443
     26  -99.54365 -140.23845  -58.84885
     27 -108.90373 -149.59853  -68.20893
     28 -105.69733 -146.39214  -65.00253
    end
    
    qui su diff if rel >= 0, mean
    
    loc ATT: disp %6.4g `r(mean)'
    
    loc before = 28
    
    loc after = 28
    
    loc intname "Vacutour"
    
    tw ///
        (connected diff_ relative_ , /// Plot 1, Average Lines
            mcolor("0 142 234") msize(medium) ///
            msymbol(circle) lcolor("0 142 234") lwidth(medium)) ///
        (rarea lowbound_ upbound_ relative_  , /// plot 2, 95% CIs
            fcolor("252 201 185 %40") lcolor("252 201 185 %40")) , ///
                legend(order(1 "ATT" 2 "Confidence Interval") pos(7) ring(0)) /// other graph options
                note("ATT = `ATT', adjusted for imbalances in event-time.") ///
                xti("Time Relative to `intname'") name(eventplot, replace) scheme(`scheme') ///
                yti("Pointwise ATT") xli(0, lcol(blue) lwidth(thick)) ///
                ti("SCUL, Event-Study")  xla(-28(8)28)
    Last edited by Ali Atia; 08 Apr 2022, 18:19.

    Comment


    • #3
      Yes, the principle is that the axis is always taken to be the longer of the width of the data and the span of the axis labels. When you don't specify an axis label, Stata has its way of choosing one that it thinks will look nice. Very often you will like that choice. Occasionally, as here, it will not please you. So you have to explicitly tell Stata in this case to bound the axis labels between -28 and 28. I think Stata does not do that on its own because its algorithm for labeling prefers round numbers in most situations.

      Added: Also, you would need to add the -if- condition to both the -connect- and -rarea- graphs. Just limiting one would not be sufficient if the data extended outside that -28 to 28 range.
      Last edited by Clyde Schechter; 08 Apr 2022, 18:50.

      Comment


      • #4
        The if option was an artifact from previous code now that I think about it, but this did the job, I just added it as an option for my command.

        Thanks so much!

        Comment

        Working...
        X