BookmarkSubscribeRSS Feed
viollete
Calcite | Level 5

Hi!

 

I have similar data (just a small part of it):

Rate time

7.5 1

7.4 2

7.8 3

7.2 4

8.0 5

7.9 6

8.2 7

 

I han information that there was a change in policy and it hapend when time=4. I want to plot in one graph rate*time and regression lines (before and after policy was introduce)

 

How can I do it?

10 REPLIES 10
DanH_sas
SAS Super FREQ

The way I would do it is to introduce a third column that grouped the data into "before" and "after" the policy change:

 

 

data rates;
length policy $ 6;
input rate time policy $;
cards;
7.5 1 before
7.4 2 before
7.8 3 before
7.2 4 before
8.0 5 after
7.9 6 after
8.2 7 after
;
run;

proc sgplot data=rates;
reg x=time y=rate / group=policy;
run;
Rick_SAS
SAS Super FREQ

Dan has the right idea. For less coding, you can create the indicator variable without changing the data:

policy = (time < 4);

 

viollete
Calcite | Level 5

Thanks, it does not do what i want. I would like to see something as the Figure1a in the link below

http://www.cdc.gov/pcd/issues/2013/12_0268.htm

 

Rick_SAS
SAS Super FREQ

You need to use a technique called "scoring the regression model" to add a new value to your data set. You want to add an observation with coordinates x=Xmax and y=(predicted value at XMax).

 

This will require that you fit the model in one of the regression procedures, such as PROC GLM, and output the predicted value to a SAS data set.  The following code provides the main ideas:

data rates;
input rate time;
group = (time<4);
cards;
7.5 1
7.4 2
7.8 3
7.2 4
8.0 5
7.9 6
8.2 7
;

/* create scoring observations with 
   x=XMax and Y=. for the group=1 */
data Fake;
rate=.; time=7; group=1;
run;

/* merge data sets */
data All;
set rates fake;
run;

/* evaluate model; create output data set that contains the
   new predicted value for XMax for group=1 */
proc glm data=All plots=fitplot;
class group;
model rate = time group;
output out=FitOut p=pred;
quit;

proc sgplot data=FitOut;
scatter x=time y=rate / group=group;
series x=time y=pred / group=group;
run;
ajames2020
Fluorite | Level 6

If I have two separate regression lines on a segmented regression plot, how do I join the lines to show the level change?

Rick_SAS
SAS Super FREQ

To join the lines, they need to be in the same group. 

ajames2020
Fluorite | Level 6
proc sgplot data=import;

reg x=date y=y_variable/group=intervention;

run; 

Above is the code I'm using, and the goal is to show that after the intervention was implemented, there was a slope change. Essentially, the code above gave me two separate slopes: a pre intervention and a post-intervention slope, which is great. I want to connect the end of my pre-intervention slope to the start of my post-intervention slope.

 

Is there another code that I can use for this? 

 

The other thing I tried doing was to use proc autoreg to generate values for "ytrend" or the "predicted trend" according to the SAS support guide on proc autoreg. When I plotted that against the date, it was able to connect the separate lines the way I want it. However, the "ytrend" lines don't fit the data points/scatter points as well as the regression lines described earlier. My question is, in time series analysis, is the "ytrend" line the same as the "regression line" - are they analogous? 

 

I would really appreciate your expert advice as I am clearly very new to SAS graphics. 

Rick_SAS
SAS Super FREQ

The regression lines you are fitting by using the REG statement in PROC SGPLOT are similar to PROC GLM, not PROC AUTOREG. You can fit the model in PROC GLM, output the data, and then plot it any way you want:

 

/* generate example data */
data import;
call streaminit(1);
retain intervention 0;
do x = 1 to 100;
   y = x + rand("Normal", 0, 3);
   if x > 50 then do;
      intervention = 1;
      y = y - 20;
   end;
   output;
end;
proc sgplot data=import;
reg x=x y=y /group=intervention;
run;
/********************************************************/
/* use PROC GLM to make the same predictions */
proc glm data=import plots=none;
class intervention;
model y = x | intervention;
output  out=ModelOut Predicted=Pred_Y;
run; 

proc sort data=ModelOut; by x; run;

proc sgplot data=ModelOut;
scatter x=x y=y /group=intervention;
series x=x y=Pred_y / lineattrs=(color=black);
run;
ajames2020
Fluorite | Level 6
Thank you! I will try the steps you proposed.
ajames2020
Fluorite | Level 6
This right here is why you're a true SAS expert. This is exactly what I needed! and it worked. Thank you!

sas-innovate-2024.png

Join us for SAS Innovate April 16-19 at the Aria in Las Vegas. Bring the team and save big with our group pricing for a limited time only.

Pre-conference courses and tutorials are filling up fast and are always a sellout. Register today to reserve your seat.

 

Register now!

How to Concatenate Values

Learn how use the CAT functions in SAS to join values from multiple variables into a single value.

Find more tutorials on the SAS Users YouTube channel.

Click image to register for webinarClick image to register for webinar

Classroom Training Available!

Select SAS Training centers are offering in-person courses. View upcoming courses for:

View all other training opportunities.

Discussion stats
  • 10 replies
  • 3867 views
  • 1 like
  • 4 in conversation