<?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 Grouping Trends by Monotonicity in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/Grouping-Trends-by-Monotonicity/m-p/858678#M339269</link>
    <description>&lt;P&gt;Hi there,&lt;/P&gt;&lt;P&gt;I I have output from proc UCM with the additive outliers (spikes) and level shifts labelled. (I am running in9.4.) I want to:&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;Extend these labels to the start and end of the increase period. The start period is the month before the increase. The end period is the last month of the increase.&lt;/LI&gt;&lt;LI&gt;Then summarise the data so that only the start and end dates and values are shown.&lt;/LI&gt;&lt;LI&gt;I also want level shifts to take precedence, so that if a level shift and spike both occur during this increase period, then the increase is classed as a level shift.&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;The input data looks like this&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;CODE class=""&gt;data got;
    infile datalines dsd delimiter='|';
format ID $1. Date date9. value 8. valuediff 8. breaktype $12.;
informat date ddmmyy10.; 
   input ID Date Value ValueDiff Breaktype;
    datalines;
A|01/01/2022|1602040||NoBreak
A|01/02/2022|1997341|395301|NoBreak
A|01/03/2022|45544|-1951797|NoBreak
A|01/04/2022|138421|92877|LevelShift
A|01/05/2022|999286|860865|NoBreak
A|01/06/2022|1178399|179113|Spike
A|01/07/2022|881297|-297102|NoBreak
A|01/08/2022|949765|68468|LevelShift
A|01/09/2022|1308423|358658|NoBreak
A|01/10/2022|1004914|-303509|NoBreak
A|01/11/2022|1191019|186105|NoBreak
A|01/12/2022|803331|-387688|NoBreak
B|01/01/2022|921410||NoBreak
B|01/02/2022|1068787|147377|NoBreak
B|01/03/2022|297284|771503|NoBreak
B|01/04/2022|338337|41053|LevelShift
B|01/05/2022|487583|149246|NoBreak
B|01/06/2022|696031|208448|Spike
B|01/07/2022|689942|6089|NoBreak
B|01/08/2022|763417|73475|LevelShift
B|01/09/2022|983677|220260|NoBreak
B|01/10/2022|545737|437940|NoBreak
B|01/11/2022|740081|194344|NoBreak
B|01/12/2022|533809|206272|NoBreak
;
run;

&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;My target data should look like this:&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;ID&lt;/TD&gt;&lt;TD&gt;break_startdate&lt;/TD&gt;&lt;TD&gt;break_enddate&lt;/TD&gt;&lt;TD&gt;breaktype&lt;/TD&gt;&lt;TD&gt;startbreak_value&lt;/TD&gt;&lt;TD&gt;endbreak_value&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;01/03/2022&lt;/TD&gt;&lt;TD&gt;01/06/2022&lt;/TD&gt;&lt;TD&gt;LevelShift&lt;/TD&gt;&lt;TD&gt;45544&lt;/TD&gt;&lt;TD&gt;1178399&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;01/07/2022&lt;/TD&gt;&lt;TD&gt;01/09/2022&lt;/TD&gt;&lt;TD&gt;LevelShift&lt;/TD&gt;&lt;TD&gt;881297&lt;/TD&gt;&lt;TD&gt;1308423&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;B&lt;/TD&gt;&lt;TD&gt;01/03/2022&lt;/TD&gt;&lt;TD&gt;01/06/2022&lt;/TD&gt;&lt;TD&gt;LevelShift&lt;/TD&gt;&lt;TD&gt;297284&lt;/TD&gt;&lt;TD&gt;696031&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;B&lt;/TD&gt;&lt;TD&gt;01/07/2022&lt;/TD&gt;&lt;TD&gt;01/09/2022&lt;/TD&gt;&lt;TD&gt;LevelShift&lt;/TD&gt;&lt;TD&gt;689942&lt;/TD&gt;&lt;TD&gt;983677&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&lt;BR /&gt;I have created some code that works in some circumstances, but not all.&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;It cant handle multiple breaks in the same id.&lt;/LI&gt;&lt;LI&gt;It doesnt let level shifts take precedence over spikes.&lt;/LI&gt;&lt;LI&gt;And it doesnt work if the break label isnt at the start of the increase. I have tried using lag functions, but the issue is that you dont know how many rows to lag by.&lt;/LI&gt;&lt;/UL&gt;&lt;PRE&gt;&lt;CODE class=""&gt;
data need
(keep=id

startbreakvalue endbreakvalue newbreak
structbreak_startdate structbreak_enddate rename=(newbreak=breaktype));
set got;
by id date breaktype;
retain structbreak_startdate structbreak_enddate
startbreakvalue endbreakvalue newbreak;
format structbreak_startdate structbreak_enddate date9.;

if first.id =1   then do;
startbreakvalue = 99999;
endbreakvalue = 0;
structbreak_startdate = '31dec3500'd;
structbreak_enddate = '1jan1960'd;
newbreak =breaktype;
end;
else do;
if breaktype ne "NoBreak" then do;
newbreak =breaktype;
structbreak_enddate ='31dec3500'd;
structbreak_startdate =intnx('month',date,-1);
startbreakvalue = value-valuediff;
end;

if breaktype = "NoBreak" and valuediff&amp;lt;0 then do;
x=1;
structbreak_enddate =min(structbreak_enddate,intnx('month',date,-1));
endbreakvalue = max(endbreakvalue,value-valuediff);
end;
end;
if last.id = 1;

;
run;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;Any help would be greatly appreciated!&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Tue, 14 Feb 2023 09:02:52 GMT</pubDate>
    <dc:creator>skipjimroo</dc:creator>
    <dc:date>2023-02-14T09:02:52Z</dc:date>
    <item>
      <title>Grouping Trends by Monotonicity</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Grouping-Trends-by-Monotonicity/m-p/858678#M339269</link>
      <description>&lt;P&gt;Hi there,&lt;/P&gt;&lt;P&gt;I I have output from proc UCM with the additive outliers (spikes) and level shifts labelled. (I am running in9.4.) I want to:&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;Extend these labels to the start and end of the increase period. The start period is the month before the increase. The end period is the last month of the increase.&lt;/LI&gt;&lt;LI&gt;Then summarise the data so that only the start and end dates and values are shown.&lt;/LI&gt;&lt;LI&gt;I also want level shifts to take precedence, so that if a level shift and spike both occur during this increase period, then the increase is classed as a level shift.&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;The input data looks like this&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;CODE class=""&gt;data got;
    infile datalines dsd delimiter='|';
format ID $1. Date date9. value 8. valuediff 8. breaktype $12.;
informat date ddmmyy10.; 
   input ID Date Value ValueDiff Breaktype;
    datalines;
A|01/01/2022|1602040||NoBreak
A|01/02/2022|1997341|395301|NoBreak
A|01/03/2022|45544|-1951797|NoBreak
A|01/04/2022|138421|92877|LevelShift
A|01/05/2022|999286|860865|NoBreak
A|01/06/2022|1178399|179113|Spike
A|01/07/2022|881297|-297102|NoBreak
A|01/08/2022|949765|68468|LevelShift
A|01/09/2022|1308423|358658|NoBreak
A|01/10/2022|1004914|-303509|NoBreak
A|01/11/2022|1191019|186105|NoBreak
A|01/12/2022|803331|-387688|NoBreak
B|01/01/2022|921410||NoBreak
B|01/02/2022|1068787|147377|NoBreak
B|01/03/2022|297284|771503|NoBreak
B|01/04/2022|338337|41053|LevelShift
B|01/05/2022|487583|149246|NoBreak
B|01/06/2022|696031|208448|Spike
B|01/07/2022|689942|6089|NoBreak
B|01/08/2022|763417|73475|LevelShift
B|01/09/2022|983677|220260|NoBreak
B|01/10/2022|545737|437940|NoBreak
B|01/11/2022|740081|194344|NoBreak
B|01/12/2022|533809|206272|NoBreak
;
run;

&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;My target data should look like this:&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;ID&lt;/TD&gt;&lt;TD&gt;break_startdate&lt;/TD&gt;&lt;TD&gt;break_enddate&lt;/TD&gt;&lt;TD&gt;breaktype&lt;/TD&gt;&lt;TD&gt;startbreak_value&lt;/TD&gt;&lt;TD&gt;endbreak_value&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;01/03/2022&lt;/TD&gt;&lt;TD&gt;01/06/2022&lt;/TD&gt;&lt;TD&gt;LevelShift&lt;/TD&gt;&lt;TD&gt;45544&lt;/TD&gt;&lt;TD&gt;1178399&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;01/07/2022&lt;/TD&gt;&lt;TD&gt;01/09/2022&lt;/TD&gt;&lt;TD&gt;LevelShift&lt;/TD&gt;&lt;TD&gt;881297&lt;/TD&gt;&lt;TD&gt;1308423&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;B&lt;/TD&gt;&lt;TD&gt;01/03/2022&lt;/TD&gt;&lt;TD&gt;01/06/2022&lt;/TD&gt;&lt;TD&gt;LevelShift&lt;/TD&gt;&lt;TD&gt;297284&lt;/TD&gt;&lt;TD&gt;696031&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;B&lt;/TD&gt;&lt;TD&gt;01/07/2022&lt;/TD&gt;&lt;TD&gt;01/09/2022&lt;/TD&gt;&lt;TD&gt;LevelShift&lt;/TD&gt;&lt;TD&gt;689942&lt;/TD&gt;&lt;TD&gt;983677&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&lt;BR /&gt;I have created some code that works in some circumstances, but not all.&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;It cant handle multiple breaks in the same id.&lt;/LI&gt;&lt;LI&gt;It doesnt let level shifts take precedence over spikes.&lt;/LI&gt;&lt;LI&gt;And it doesnt work if the break label isnt at the start of the increase. I have tried using lag functions, but the issue is that you dont know how many rows to lag by.&lt;/LI&gt;&lt;/UL&gt;&lt;PRE&gt;&lt;CODE class=""&gt;
data need
(keep=id

startbreakvalue endbreakvalue newbreak
structbreak_startdate structbreak_enddate rename=(newbreak=breaktype));
set got;
by id date breaktype;
retain structbreak_startdate structbreak_enddate
startbreakvalue endbreakvalue newbreak;
format structbreak_startdate structbreak_enddate date9.;

if first.id =1   then do;
startbreakvalue = 99999;
endbreakvalue = 0;
structbreak_startdate = '31dec3500'd;
structbreak_enddate = '1jan1960'd;
newbreak =breaktype;
end;
else do;
if breaktype ne "NoBreak" then do;
newbreak =breaktype;
structbreak_enddate ='31dec3500'd;
structbreak_startdate =intnx('month',date,-1);
startbreakvalue = value-valuediff;
end;

if breaktype = "NoBreak" and valuediff&amp;lt;0 then do;
x=1;
structbreak_enddate =min(structbreak_enddate,intnx('month',date,-1));
endbreakvalue = max(endbreakvalue,value-valuediff);
end;
end;
if last.id = 1;

;
run;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;Any help would be greatly appreciated!&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 14 Feb 2023 09:02:52 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Grouping-Trends-by-Monotonicity/m-p/858678#M339269</guid>
      <dc:creator>skipjimroo</dc:creator>
      <dc:date>2023-02-14T09:02:52Z</dc:date>
    </item>
  </channel>
</rss>

