<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Regression discontinuity in Statistical Procedures</title>
    <link>https://communities.sas.com/t5/Statistical-Procedures/Regression-discontinuity/m-p/622019#M30007</link>
    <description>&lt;P&gt;Hi,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I was wondering if SAS had any automated feature for creating a Regression Discontinuity plot.&amp;nbsp; What I want is a function that will split the running variable by a given binwidth and then create a binned scatterplot.&amp;nbsp; The bins should be counted from the point of discontinuity so that each bin contains either all treatment or all control observations.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;For example, in the plot below, X is the running variable.&amp;nbsp; There is a threshold for treatment assignment at 120 represented by a red, dashed vertical line.&amp;nbsp; The binwidth is equal to 10.&amp;nbsp; Consequently, the bins are counted to the right and to the left of the threshold (e.g. 110-120, 100-110,... on the left and 120-130, 130-140... on the right.&amp;nbsp; The observations are binned into these categories and then plotted as points.&amp;nbsp; The y-value is determined by the mean for each bin.&amp;nbsp; As you can see from this example, ideally if a treatment is effective, we should see a discontinuity at the threshold, which we do in this case.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="rdplot_example.png" style="width: 599px;"&gt;&lt;img src="https://communities.sas.com/t5/image/serverpage/image-id/35837i6215E0550123B310/image-size/large?v=v2&amp;amp;px=999" role="button" title="rdplot_example.png" alt="rdplot_example.png" /&gt;&lt;/span&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I created the above plot using this code.&amp;nbsp;&amp;nbsp; However, I was wondering whether or not there was a procedure in SAS that does the same thing.&amp;nbsp; I believe there are functions in R and Stata that create similar plots.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;%MACRO BINSCATTER_TEST(DATA, X, Y, CENTER = 0.5, BINSIZE =10,&lt;BR /&gt;HIST = 1, BINSCATTER = 1,&lt;BR /&gt;X_TICK = 50, PRINT = 0);&lt;/P&gt;&lt;P&gt;/*FIND THE RANK FARTHEST AWAY FROM CUT SCORE*/&lt;BR /&gt;/*NOTE: PROBABLY CAN FIND WAY TO DO THIS INSIDE PROC IML STEP*/&lt;BR /&gt;PROC SQL NOPRINT;&lt;/P&gt;&lt;P&gt;SELECT MAX(ABS( &amp;amp;CENTER - MIN_&amp;amp;X), (MAX_&amp;amp;X - &amp;amp;CENTER)) INTO :FARTHEST_RNK&lt;BR /&gt;FROM (SELECT MIN(&amp;amp;X) AS MIN_&amp;amp;X,&lt;BR /&gt;MAX(&amp;amp;X) AS MAX_&amp;amp;X&lt;BR /&gt;FROM &amp;amp;DATA);&lt;BR /&gt;QUIT;&lt;BR /&gt;%PUT &amp;amp;=FARTHEST_RNK;&lt;/P&gt;&lt;P&gt;PROC IML;&lt;/P&gt;&lt;P&gt;/*MATRICES CREATED INSIDE PROC IML: */&lt;BR /&gt;/*NEG, POS, NEG_REV, CUTS, MIN_CUT, MAX_CUT, B, START_MIDS, END_MIDS, MIDS*/&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;USE &amp;amp;DATA;&lt;BR /&gt;READ ALL VAR {&amp;amp;X} INTO X;&lt;/P&gt;&lt;P&gt;CLOSE &amp;amp;DATA;&lt;/P&gt;&lt;P&gt;%LET MID_BIN = &amp;amp;BINSIZE / 2;&lt;BR /&gt;&lt;BR /&gt;POS = DO(&amp;amp;CENTER, &amp;amp;CENTER + &amp;amp;FARTHEST_RNK + &amp;amp;BINSIZE, &amp;amp;BINSIZE);&lt;BR /&gt;NEG = DO(&amp;amp;CENTER, &amp;amp;CENTER -&amp;amp;FARTHEST_RNK - &amp;amp;BINSIZE, -&amp;amp;BINSIZE);&lt;BR /&gt;&lt;BR /&gt;/*NOTE: NEED TO DROP CUT SCORE FROM ONE OF THESE VECTORS TO PREVENT OVERLAP*/&lt;BR /&gt;NEG = NEG[ , 2:NCOL(NEG)];&lt;/P&gt;&lt;P&gt;/*CREATE 'MINI-FUNCTION' TO REVERSE NEG VECTOR*/&lt;BR /&gt;START FLIPLR(A);&lt;BR /&gt;RETURN A[, NCOL(A):1];&lt;BR /&gt;FINISH;&lt;/P&gt;&lt;P&gt;NEG_REV = FLIPLR(NEG);&lt;/P&gt;&lt;P&gt;/*CONCATENATE REVESED NEG AND POS INTO ONE VECTOR CONTAINING ALL CUTPOINTS*/&lt;BR /&gt;CUTS = NEG_REV||POS;&lt;/P&gt;&lt;P&gt;/*CREATE VECTOR CONTAINING BIN ASSIGNMENT FOR EACH OBSERVATION IN DATASET*/&lt;BR /&gt;B = BIN(X, CUTS);&lt;/P&gt;&lt;P&gt;/*FIND MIDPOINTS OF BINS TO PLOT POINTS INTO SCATTER PLOTS*/&lt;BR /&gt;START_MIDS = MIN(CUTS) + (&amp;amp;MID_BIN);&lt;BR /&gt;END_MIDS = MAX(CUTS) - (&amp;amp;MID_BIN);&lt;BR /&gt;MIDS = DO(START_MIDS, END_MIDS, &amp;amp;BINSIZE);&lt;/P&gt;&lt;P&gt;/*CREATE MACRO VARIABLES FOR PROCS GRAPHICS*/&lt;BR /&gt;CALL SYMPUTX("MIN_CUT", MIN(CUTS));&lt;BR /&gt;CALL SYMPUTX("MAX_CUT", MAX(CUTS));&lt;BR /&gt;CALL SYMPUTX("BIN_START", &amp;amp;MIN_CUT - &amp;amp;MID_BIN);&lt;BR /&gt;CALL SYMPUTX("XMIN", &amp;amp;X_TICK*FLOOR(&amp;amp;MIN_CUT / &amp;amp;X_TICK));&lt;BR /&gt;CALL SYMPUTX("XMAX", &amp;amp;X_TICK*CEIL(&amp;amp;MAX_CUT / &amp;amp;X_TICK));&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;&lt;BR /&gt;/*OUTPUT DATASET CONTAINING EACH OBSERVATION OF X AND B*/&lt;BR /&gt;CREATE BINNED_IML VAR {X B};&lt;BR /&gt;APPEND;&lt;BR /&gt;CLOSE BINNED_IML;&lt;/P&gt;&lt;P&gt;/*OUTPUT DATASET CONTAINING THE MIDPOINTS FOR EACH BIN*/&lt;BR /&gt;CREATE MID_PTS VAR {MIDS CUTS};&lt;BR /&gt;APPEND;&lt;BR /&gt;CLOSE;&lt;/P&gt;&lt;P&gt;QUIT;&lt;/P&gt;&lt;P&gt;/*APPEND BINNED_IML TO ORIGINAL DATASET (CBIND)*/&lt;BR /&gt;DATA DATA_BINNED_IML;&lt;BR /&gt;SET &amp;amp;DATA;&lt;BR /&gt;SET BINNED_IML;&lt;BR /&gt;RUN;&lt;/P&gt;&lt;P&gt;ODS GRAPHICS ON / WIDTH=6IN HEIGHT=4IN NOBORDER;&lt;/P&gt;&lt;P&gt;/*-------------- PRODUCE GRAPHIC FOR EACH X VARIABLE ------------*/&lt;/P&gt;&lt;P&gt;/*--- HISTOGRAM ---*/&lt;BR /&gt;%IF &amp;amp;HIST = 1 %THEN %DO;&lt;BR /&gt;PROC SGPLOT DATA = &amp;amp;DATA;&lt;BR /&gt;HISTOGRAM &amp;amp;X / BINSTART = &amp;amp;BIN_START&lt;BR /&gt;BINWIDTH = &amp;amp;BINSIZE&lt;BR /&gt;SCALE = COUNT;&lt;BR /&gt;XAXIS MAX=&amp;amp;MAX_CUT MIN= &amp;amp;MIN_CUT;&lt;BR /&gt;REFLINE &amp;amp;CENTER / AXIS = X LINEATTRS=(COLOR = RED PATTERN = DASH);&lt;BR /&gt;XAXIS VALUES=(&amp;amp;XMIN TO &amp;amp;XMAX BY &amp;amp;X_TICK) ;&lt;BR /&gt;RUN;&lt;BR /&gt;%END;&lt;/P&gt;&lt;P&gt;/*-------------- PRODUCE GRAPHICS FOR EACH Y VARIABLE ------------*/&lt;BR /&gt;%DO I=1 %TO %SYSFUNC(COUNTW(&amp;amp;Y));&lt;/P&gt;&lt;P&gt;%LET Y_I = %SCAN(&amp;amp;Y, &amp;amp;I);&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;/*--- CALCULATE MEAN OF Y VARIABLE FOR EACH BIN ---*/&lt;BR /&gt;PROC MEANS DATA = DATA_BINNED_IML NOPRINT;&lt;BR /&gt;CLASS B;&lt;BR /&gt;VAR &amp;amp;Y_I ;&lt;BR /&gt;OUTPUT OUT = BIN_MEANS(WHERE=(_TYPE_=1)) MEAN=;&lt;/P&gt;&lt;P&gt;RUN;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;/*--- MERGE MID_PTS WITH BIN_MEANS BY B ---*/&lt;BR /&gt;/*NOTE: WE NEED THIS STEP IN CASE SOME BINS HAVE ZERO OBS*/&lt;BR /&gt;DATA MID_PTS;&lt;BR /&gt;SET MID_PTS;&lt;BR /&gt;B = _N_;&lt;BR /&gt;RUN;&lt;/P&gt;&lt;P&gt;PROC SORT DATA= MID_PTS;&lt;BR /&gt;BY B;&lt;BR /&gt;RUN;&lt;/P&gt;&lt;P&gt;PROC SORT DATA= BIN_MEANS;&lt;BR /&gt;BY B;&lt;BR /&gt;RUN;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;&lt;BR /&gt;DATA BINNED(RENAME=(MIDS = &amp;amp;X));&lt;BR /&gt;MERGE BIN_MEANS(RENAME =(_FREQ_=N) DROP=_TYPE_) MID_PTS;&lt;BR /&gt;BY B;&lt;/P&gt;&lt;P&gt;RUN;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;/*--- BINNED SCATTER PLOT ---*/&lt;BR /&gt;%IF &amp;amp;BINSCATTER = 1 %THEN %DO;&lt;BR /&gt;PROC SGPLOT DATA = BINNED;&lt;BR /&gt;SCATTER X = &amp;amp;X Y = &amp;amp;Y_I ;&lt;BR /&gt;REFLINE &amp;amp;CENTER / AXIS = X LINEATTRS=(COLOR = RED PATTERN = DASH);&lt;BR /&gt;XAXIS VALUES=(&amp;amp;XMIN TO &amp;amp;XMAX BY &amp;amp;X_TICK) ;&lt;BR /&gt;RUN;&lt;BR /&gt;%END;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;%END;&lt;/P&gt;&lt;P&gt;ODS GRAPHICS OFF;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;/*CHECK: MAKE SURE BIN CATEGORIES ARE CORRECT*/&lt;BR /&gt;%IF &amp;amp;PRINT = 1 %THEN %DO;&lt;BR /&gt;PROC PRINT DATA = MID_PTS;&lt;BR /&gt;RUN;&lt;/P&gt;&lt;P&gt;PROC SORT DATA= DATA_BINNED_IML;&lt;BR /&gt;BY B;&lt;BR /&gt;RUN;&lt;/P&gt;&lt;P&gt;PROC PRINT DATA = DATA_BINNED_IML;&lt;BR /&gt;BY B;&lt;BR /&gt;VAR B TREAT X Y;&lt;BR /&gt;RUN;&lt;/P&gt;&lt;P&gt;PROC PRINT DATA = BIN_MEANS;&lt;BR /&gt;RUN;&lt;/P&gt;&lt;P&gt;PROC PRINT DATA = BINNED;&lt;BR /&gt;RUN;&lt;BR /&gt;%END;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;%MEND BINSCATTER_TEST;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;/*----------------------------------------------------------------------------------------*/&lt;BR /&gt;/*-------------------------------------- FAKE DATA ---------------------------------------*/&lt;BR /&gt;/*----------------------------------------------------------------------------------------*/&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;DATA FAKE;&lt;BR /&gt;DO STUDENT_ID =1 TO 1000;&lt;BR /&gt;&lt;BR /&gt;X = RAND("NORMAL", 120, 20);&lt;BR /&gt;&lt;BR /&gt;IF X GE 120 THEN DO;&lt;BR /&gt;TREAT = 1;&lt;BR /&gt;Y = X + 40 + RAND("NORMAL", 0, 5);&lt;BR /&gt;END;&lt;BR /&gt;ELSE DO; ;&lt;BR /&gt;TREAT = 0;&lt;BR /&gt;Y = X + RAND("NORMAL", 0, 5);&lt;BR /&gt;END;&lt;BR /&gt;OUTPUT;&lt;BR /&gt;END;&lt;/P&gt;&lt;P&gt;RUN;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;%BINSCATTER_TEST(FAKE, X, Y, CENTER=120, BINSIZE = 10, X_TICK = 10, PRINT = 0);&lt;/P&gt;</description>
    <pubDate>Mon, 03 Feb 2020 19:30:59 GMT</pubDate>
    <dc:creator>whs278</dc:creator>
    <dc:date>2020-02-03T19:30:59Z</dc:date>
    <item>
      <title>Regression discontinuity</title>
      <link>https://communities.sas.com/t5/Statistical-Procedures/Regression-discontinuity/m-p/622019#M30007</link>
      <description>&lt;P&gt;Hi,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I was wondering if SAS had any automated feature for creating a Regression Discontinuity plot.&amp;nbsp; What I want is a function that will split the running variable by a given binwidth and then create a binned scatterplot.&amp;nbsp; The bins should be counted from the point of discontinuity so that each bin contains either all treatment or all control observations.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;For example, in the plot below, X is the running variable.&amp;nbsp; There is a threshold for treatment assignment at 120 represented by a red, dashed vertical line.&amp;nbsp; The binwidth is equal to 10.&amp;nbsp; Consequently, the bins are counted to the right and to the left of the threshold (e.g. 110-120, 100-110,... on the left and 120-130, 130-140... on the right.&amp;nbsp; The observations are binned into these categories and then plotted as points.&amp;nbsp; The y-value is determined by the mean for each bin.&amp;nbsp; As you can see from this example, ideally if a treatment is effective, we should see a discontinuity at the threshold, which we do in this case.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="rdplot_example.png" style="width: 599px;"&gt;&lt;img src="https://communities.sas.com/t5/image/serverpage/image-id/35837i6215E0550123B310/image-size/large?v=v2&amp;amp;px=999" role="button" title="rdplot_example.png" alt="rdplot_example.png" /&gt;&lt;/span&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I created the above plot using this code.&amp;nbsp;&amp;nbsp; However, I was wondering whether or not there was a procedure in SAS that does the same thing.&amp;nbsp; I believe there are functions in R and Stata that create similar plots.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;%MACRO BINSCATTER_TEST(DATA, X, Y, CENTER = 0.5, BINSIZE =10,&lt;BR /&gt;HIST = 1, BINSCATTER = 1,&lt;BR /&gt;X_TICK = 50, PRINT = 0);&lt;/P&gt;&lt;P&gt;/*FIND THE RANK FARTHEST AWAY FROM CUT SCORE*/&lt;BR /&gt;/*NOTE: PROBABLY CAN FIND WAY TO DO THIS INSIDE PROC IML STEP*/&lt;BR /&gt;PROC SQL NOPRINT;&lt;/P&gt;&lt;P&gt;SELECT MAX(ABS( &amp;amp;CENTER - MIN_&amp;amp;X), (MAX_&amp;amp;X - &amp;amp;CENTER)) INTO :FARTHEST_RNK&lt;BR /&gt;FROM (SELECT MIN(&amp;amp;X) AS MIN_&amp;amp;X,&lt;BR /&gt;MAX(&amp;amp;X) AS MAX_&amp;amp;X&lt;BR /&gt;FROM &amp;amp;DATA);&lt;BR /&gt;QUIT;&lt;BR /&gt;%PUT &amp;amp;=FARTHEST_RNK;&lt;/P&gt;&lt;P&gt;PROC IML;&lt;/P&gt;&lt;P&gt;/*MATRICES CREATED INSIDE PROC IML: */&lt;BR /&gt;/*NEG, POS, NEG_REV, CUTS, MIN_CUT, MAX_CUT, B, START_MIDS, END_MIDS, MIDS*/&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;USE &amp;amp;DATA;&lt;BR /&gt;READ ALL VAR {&amp;amp;X} INTO X;&lt;/P&gt;&lt;P&gt;CLOSE &amp;amp;DATA;&lt;/P&gt;&lt;P&gt;%LET MID_BIN = &amp;amp;BINSIZE / 2;&lt;BR /&gt;&lt;BR /&gt;POS = DO(&amp;amp;CENTER, &amp;amp;CENTER + &amp;amp;FARTHEST_RNK + &amp;amp;BINSIZE, &amp;amp;BINSIZE);&lt;BR /&gt;NEG = DO(&amp;amp;CENTER, &amp;amp;CENTER -&amp;amp;FARTHEST_RNK - &amp;amp;BINSIZE, -&amp;amp;BINSIZE);&lt;BR /&gt;&lt;BR /&gt;/*NOTE: NEED TO DROP CUT SCORE FROM ONE OF THESE VECTORS TO PREVENT OVERLAP*/&lt;BR /&gt;NEG = NEG[ , 2:NCOL(NEG)];&lt;/P&gt;&lt;P&gt;/*CREATE 'MINI-FUNCTION' TO REVERSE NEG VECTOR*/&lt;BR /&gt;START FLIPLR(A);&lt;BR /&gt;RETURN A[, NCOL(A):1];&lt;BR /&gt;FINISH;&lt;/P&gt;&lt;P&gt;NEG_REV = FLIPLR(NEG);&lt;/P&gt;&lt;P&gt;/*CONCATENATE REVESED NEG AND POS INTO ONE VECTOR CONTAINING ALL CUTPOINTS*/&lt;BR /&gt;CUTS = NEG_REV||POS;&lt;/P&gt;&lt;P&gt;/*CREATE VECTOR CONTAINING BIN ASSIGNMENT FOR EACH OBSERVATION IN DATASET*/&lt;BR /&gt;B = BIN(X, CUTS);&lt;/P&gt;&lt;P&gt;/*FIND MIDPOINTS OF BINS TO PLOT POINTS INTO SCATTER PLOTS*/&lt;BR /&gt;START_MIDS = MIN(CUTS) + (&amp;amp;MID_BIN);&lt;BR /&gt;END_MIDS = MAX(CUTS) - (&amp;amp;MID_BIN);&lt;BR /&gt;MIDS = DO(START_MIDS, END_MIDS, &amp;amp;BINSIZE);&lt;/P&gt;&lt;P&gt;/*CREATE MACRO VARIABLES FOR PROCS GRAPHICS*/&lt;BR /&gt;CALL SYMPUTX("MIN_CUT", MIN(CUTS));&lt;BR /&gt;CALL SYMPUTX("MAX_CUT", MAX(CUTS));&lt;BR /&gt;CALL SYMPUTX("BIN_START", &amp;amp;MIN_CUT - &amp;amp;MID_BIN);&lt;BR /&gt;CALL SYMPUTX("XMIN", &amp;amp;X_TICK*FLOOR(&amp;amp;MIN_CUT / &amp;amp;X_TICK));&lt;BR /&gt;CALL SYMPUTX("XMAX", &amp;amp;X_TICK*CEIL(&amp;amp;MAX_CUT / &amp;amp;X_TICK));&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;&lt;BR /&gt;/*OUTPUT DATASET CONTAINING EACH OBSERVATION OF X AND B*/&lt;BR /&gt;CREATE BINNED_IML VAR {X B};&lt;BR /&gt;APPEND;&lt;BR /&gt;CLOSE BINNED_IML;&lt;/P&gt;&lt;P&gt;/*OUTPUT DATASET CONTAINING THE MIDPOINTS FOR EACH BIN*/&lt;BR /&gt;CREATE MID_PTS VAR {MIDS CUTS};&lt;BR /&gt;APPEND;&lt;BR /&gt;CLOSE;&lt;/P&gt;&lt;P&gt;QUIT;&lt;/P&gt;&lt;P&gt;/*APPEND BINNED_IML TO ORIGINAL DATASET (CBIND)*/&lt;BR /&gt;DATA DATA_BINNED_IML;&lt;BR /&gt;SET &amp;amp;DATA;&lt;BR /&gt;SET BINNED_IML;&lt;BR /&gt;RUN;&lt;/P&gt;&lt;P&gt;ODS GRAPHICS ON / WIDTH=6IN HEIGHT=4IN NOBORDER;&lt;/P&gt;&lt;P&gt;/*-------------- PRODUCE GRAPHIC FOR EACH X VARIABLE ------------*/&lt;/P&gt;&lt;P&gt;/*--- HISTOGRAM ---*/&lt;BR /&gt;%IF &amp;amp;HIST = 1 %THEN %DO;&lt;BR /&gt;PROC SGPLOT DATA = &amp;amp;DATA;&lt;BR /&gt;HISTOGRAM &amp;amp;X / BINSTART = &amp;amp;BIN_START&lt;BR /&gt;BINWIDTH = &amp;amp;BINSIZE&lt;BR /&gt;SCALE = COUNT;&lt;BR /&gt;XAXIS MAX=&amp;amp;MAX_CUT MIN= &amp;amp;MIN_CUT;&lt;BR /&gt;REFLINE &amp;amp;CENTER / AXIS = X LINEATTRS=(COLOR = RED PATTERN = DASH);&lt;BR /&gt;XAXIS VALUES=(&amp;amp;XMIN TO &amp;amp;XMAX BY &amp;amp;X_TICK) ;&lt;BR /&gt;RUN;&lt;BR /&gt;%END;&lt;/P&gt;&lt;P&gt;/*-------------- PRODUCE GRAPHICS FOR EACH Y VARIABLE ------------*/&lt;BR /&gt;%DO I=1 %TO %SYSFUNC(COUNTW(&amp;amp;Y));&lt;/P&gt;&lt;P&gt;%LET Y_I = %SCAN(&amp;amp;Y, &amp;amp;I);&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;/*--- CALCULATE MEAN OF Y VARIABLE FOR EACH BIN ---*/&lt;BR /&gt;PROC MEANS DATA = DATA_BINNED_IML NOPRINT;&lt;BR /&gt;CLASS B;&lt;BR /&gt;VAR &amp;amp;Y_I ;&lt;BR /&gt;OUTPUT OUT = BIN_MEANS(WHERE=(_TYPE_=1)) MEAN=;&lt;/P&gt;&lt;P&gt;RUN;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;/*--- MERGE MID_PTS WITH BIN_MEANS BY B ---*/&lt;BR /&gt;/*NOTE: WE NEED THIS STEP IN CASE SOME BINS HAVE ZERO OBS*/&lt;BR /&gt;DATA MID_PTS;&lt;BR /&gt;SET MID_PTS;&lt;BR /&gt;B = _N_;&lt;BR /&gt;RUN;&lt;/P&gt;&lt;P&gt;PROC SORT DATA= MID_PTS;&lt;BR /&gt;BY B;&lt;BR /&gt;RUN;&lt;/P&gt;&lt;P&gt;PROC SORT DATA= BIN_MEANS;&lt;BR /&gt;BY B;&lt;BR /&gt;RUN;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;&lt;BR /&gt;DATA BINNED(RENAME=(MIDS = &amp;amp;X));&lt;BR /&gt;MERGE BIN_MEANS(RENAME =(_FREQ_=N) DROP=_TYPE_) MID_PTS;&lt;BR /&gt;BY B;&lt;/P&gt;&lt;P&gt;RUN;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;/*--- BINNED SCATTER PLOT ---*/&lt;BR /&gt;%IF &amp;amp;BINSCATTER = 1 %THEN %DO;&lt;BR /&gt;PROC SGPLOT DATA = BINNED;&lt;BR /&gt;SCATTER X = &amp;amp;X Y = &amp;amp;Y_I ;&lt;BR /&gt;REFLINE &amp;amp;CENTER / AXIS = X LINEATTRS=(COLOR = RED PATTERN = DASH);&lt;BR /&gt;XAXIS VALUES=(&amp;amp;XMIN TO &amp;amp;XMAX BY &amp;amp;X_TICK) ;&lt;BR /&gt;RUN;&lt;BR /&gt;%END;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;%END;&lt;/P&gt;&lt;P&gt;ODS GRAPHICS OFF;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;/*CHECK: MAKE SURE BIN CATEGORIES ARE CORRECT*/&lt;BR /&gt;%IF &amp;amp;PRINT = 1 %THEN %DO;&lt;BR /&gt;PROC PRINT DATA = MID_PTS;&lt;BR /&gt;RUN;&lt;/P&gt;&lt;P&gt;PROC SORT DATA= DATA_BINNED_IML;&lt;BR /&gt;BY B;&lt;BR /&gt;RUN;&lt;/P&gt;&lt;P&gt;PROC PRINT DATA = DATA_BINNED_IML;&lt;BR /&gt;BY B;&lt;BR /&gt;VAR B TREAT X Y;&lt;BR /&gt;RUN;&lt;/P&gt;&lt;P&gt;PROC PRINT DATA = BIN_MEANS;&lt;BR /&gt;RUN;&lt;/P&gt;&lt;P&gt;PROC PRINT DATA = BINNED;&lt;BR /&gt;RUN;&lt;BR /&gt;%END;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;%MEND BINSCATTER_TEST;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;/*----------------------------------------------------------------------------------------*/&lt;BR /&gt;/*-------------------------------------- FAKE DATA ---------------------------------------*/&lt;BR /&gt;/*----------------------------------------------------------------------------------------*/&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;DATA FAKE;&lt;BR /&gt;DO STUDENT_ID =1 TO 1000;&lt;BR /&gt;&lt;BR /&gt;X = RAND("NORMAL", 120, 20);&lt;BR /&gt;&lt;BR /&gt;IF X GE 120 THEN DO;&lt;BR /&gt;TREAT = 1;&lt;BR /&gt;Y = X + 40 + RAND("NORMAL", 0, 5);&lt;BR /&gt;END;&lt;BR /&gt;ELSE DO; ;&lt;BR /&gt;TREAT = 0;&lt;BR /&gt;Y = X + RAND("NORMAL", 0, 5);&lt;BR /&gt;END;&lt;BR /&gt;OUTPUT;&lt;BR /&gt;END;&lt;/P&gt;&lt;P&gt;RUN;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;%BINSCATTER_TEST(FAKE, X, Y, CENTER=120, BINSIZE = 10, X_TICK = 10, PRINT = 0);&lt;/P&gt;</description>
      <pubDate>Mon, 03 Feb 2020 19:30:59 GMT</pubDate>
      <guid>https://communities.sas.com/t5/Statistical-Procedures/Regression-discontinuity/m-p/622019#M30007</guid>
      <dc:creator>whs278</dc:creator>
      <dc:date>2020-02-03T19:30:59Z</dc:date>
    </item>
    <item>
      <title>Re: Regression discontinuity</title>
      <link>https://communities.sas.com/t5/Statistical-Procedures/Regression-discontinuity/m-p/622108#M30008</link>
      <description>&lt;P&gt;I think you could try PROC LOESS non-parameter regression .&lt;/P&gt;
&lt;P&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/13684"&gt;@Rick_SAS&lt;/a&gt;&amp;nbsp; has written several blog about regression .&lt;/P&gt;</description>
      <pubDate>Tue, 04 Feb 2020 04:39:15 GMT</pubDate>
      <guid>https://communities.sas.com/t5/Statistical-Procedures/Regression-discontinuity/m-p/622108#M30008</guid>
      <dc:creator>Ksharp</dc:creator>
      <dc:date>2020-02-04T04:39:15Z</dc:date>
    </item>
    <item>
      <title>Re: Regression discontinuity</title>
      <link>https://communities.sas.com/t5/Statistical-Procedures/Regression-discontinuity/m-p/623121#M30010</link>
      <description>&lt;P&gt;&amp;nbsp; &amp;nbsp;&amp;gt;&amp;nbsp;&lt;SPAN&gt;I was wondering if SAS had any automated feature for creating a Regression Discontinuity plot. ...&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;&amp;gt; I was wondering whether or not there was a procedure in SAS that does the same thing.&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;No. I don't think so.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;Your program uses the BIN function in SAS/IML, which is a good choice.&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Fri, 07 Feb 2020 17:11:28 GMT</pubDate>
      <guid>https://communities.sas.com/t5/Statistical-Procedures/Regression-discontinuity/m-p/623121#M30010</guid>
      <dc:creator>Rick_SAS</dc:creator>
      <dc:date>2020-02-07T17:11:28Z</dc:date>
    </item>
    <item>
      <title>Re: Regression discontinuity</title>
      <link>https://communities.sas.com/t5/Statistical-Procedures/Regression-discontinuity/m-p/623157#M30011</link>
      <description>&lt;P&gt;Hi Rick,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Thank you for the response. I was trying to see if there was a canned procedures so that I could check my macro, but it appears that there isn't one in SAS as of now.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;By the way, I found your blog post very helpful when working on that macro.&amp;nbsp; Coming from a background in R, I am glad that SAS has PROC IML to do things like that.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;U&gt;&lt;STRONG&gt;Blog Entry on Bin Observations using Custom Cut Points&lt;/STRONG&gt;&lt;/U&gt;&lt;/P&gt;&lt;P&gt;&lt;A href="https://blogs.sas.com/content/iml/2013/07/15/cut-pts-and-uneven-bins.html.&amp;nbsp;" target="_blank"&gt;https://blogs.sas.com/content/iml/2013/07/15/cut-pts-and-uneven-bins.html.&amp;nbsp;&lt;/A&gt;&lt;/P&gt;</description>
      <pubDate>Fri, 07 Feb 2020 20:11:02 GMT</pubDate>
      <guid>https://communities.sas.com/t5/Statistical-Procedures/Regression-discontinuity/m-p/623157#M30011</guid>
      <dc:creator>whs278</dc:creator>
      <dc:date>2020-02-07T20:11:02Z</dc:date>
    </item>
  </channel>
</rss>

