<?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 Re: Programming a time-varying cumulative covariate in long format in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/Programming-a-time-varying-cumulative-covariate-in-long-format/m-p/982741#M379382</link>
    <description>&lt;P&gt;Hi Paige,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Thank you for the reply!&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;1. I can easily subtract 1 from STOP, but in a follow up DATA STEP as I can isolate the ID order number. In the current DATA STEP, if I subtract or add 1 to either the START or STOP for lines "if tx_visit ne 1..." and "if last.id...", it does this calculation on rows that I DO and do NOT want it to. For example,&amp;nbsp; the below code (bolded segments are the revision) yields the correct START/STOP for the first and last ID rows, but not middle rows for those with 3+ tx_dates (see last ID in below table; I bolded the incorrect row).&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;DIV&gt;data v2a; set v2;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;by id;&amp;nbsp;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;retain start stop tvteeth teeth;&amp;nbsp;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;if first.id then cum_teeth=0; cum_teeth+num_teeth_per_txdate;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;if first.id then do; start=1; stop=1; teeth=.; tvteeth=Num_teeth_per_txdate; end;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;if tx_visit ne 1 and days_diff &amp;lt; postop_days then do; start=stop;&lt;STRONG&gt; stop=days_diff-1&lt;/STRONG&gt;; teeth=lag(Num_teeth_per_txdate); tvteeth=tvteeth+teeth; event=0; output; end;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;if last.id then do; &lt;STRONG&gt;start=stop+1&lt;/STRONG&gt;; stop=postop_days; teeth=lag(Num_teeth_per_txdate); tvteeth=tvteeth+teeth; event=(postop_yn=1); output; end;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;run;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;id&lt;/TD&gt;&lt;TD&gt;tx_date&lt;/TD&gt;&lt;TD&gt;days_diff&lt;/TD&gt;&lt;TD&gt;start&lt;/TD&gt;&lt;TD&gt;stop&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;120587&lt;/TD&gt;&lt;TD&gt;10/3/2022&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;24&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;120587&lt;/TD&gt;&lt;TD&gt;10/28/2022&lt;/TD&gt;&lt;TD&gt;25&lt;/TD&gt;&lt;TD&gt;25&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;149268&lt;/TD&gt;&lt;TD&gt;3/25/2021&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;20&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;149268&lt;/TD&gt;&lt;TD&gt;4/15/2021&lt;/TD&gt;&lt;TD&gt;21&lt;/TD&gt;&lt;TD&gt;21&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;152067&lt;/TD&gt;&lt;TD&gt;1/28/2021&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;13&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;152067&lt;/TD&gt;&lt;TD&gt;2/11/2021&lt;/TD&gt;&lt;TD&gt;14&lt;/TD&gt;&lt;TD&gt;14&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;154198&lt;/TD&gt;&lt;TD&gt;12/10/2020&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;6&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;STRONG&gt;154198&lt;/STRONG&gt;&lt;/TD&gt;&lt;TD&gt;&lt;STRONG&gt;12/17/2020&lt;/STRONG&gt;&lt;/TD&gt;&lt;TD&gt;&lt;STRONG&gt;7&lt;/STRONG&gt;&lt;/TD&gt;&lt;TD&gt;&lt;STRONG&gt;6&lt;/STRONG&gt;&lt;/TD&gt;&lt;TD&gt;&lt;STRONG&gt;26&lt;/STRONG&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;154198&lt;/TD&gt;&lt;TD&gt;1/6/2021&lt;/TD&gt;&lt;TD&gt;27&lt;/TD&gt;&lt;TD&gt;27&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&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;2. I have added your suggested code in several few different places, but it is not getting the cumulative sum, and I am not sure why. Below is the first 9 observations where the cum_teeth variable is showing what it SHOULD be, but I can't get that. Any suggestions? Below is the last version of the code I tried.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;id&lt;/TD&gt;&lt;TD&gt;tx_date&lt;/TD&gt;&lt;TD&gt;start&lt;/TD&gt;&lt;TD&gt;stop&lt;/TD&gt;&lt;TD&gt;cum_teeth&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;120587&lt;/TD&gt;&lt;TD&gt;10/28/2022&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;24&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;120587&lt;/TD&gt;&lt;TD&gt;10/28/2022&lt;/TD&gt;&lt;TD&gt;25&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;149268&lt;/TD&gt;&lt;TD&gt;4/15/2021&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;20&lt;/TD&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;149268&lt;/TD&gt;&lt;TD&gt;4/15/2021&lt;/TD&gt;&lt;TD&gt;21&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;TD&gt;8&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;152067&lt;/TD&gt;&lt;TD&gt;2/11/2021&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;13&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;152067&lt;/TD&gt;&lt;TD&gt;2/11/2021&lt;/TD&gt;&lt;TD&gt;14&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;154198&lt;/TD&gt;&lt;TD&gt;12/17/2020&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;6&lt;/TD&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;154198&lt;/TD&gt;&lt;TD&gt;1/6/2021&lt;/TD&gt;&lt;TD&gt;6&lt;/TD&gt;&lt;TD&gt;26&lt;/TD&gt;&lt;TD&gt;7&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;154198&lt;/TD&gt;&lt;TD&gt;1/6/2021&lt;/TD&gt;&lt;TD&gt;27&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;TD&gt;10&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;DIV&gt;data v2a; set v2;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;by id;&amp;nbsp;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;retain start stop teeth cum_teeth;&amp;nbsp;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;if first.id then do; start=1; stop=1; cum_teeth=0; end;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;if tx_visit ne 1 and days_diff &amp;lt; postop_days then do; start=stop; stop=days_diff-1; cum_teeth+num_teeth_per_txdate; event=0; output; end;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;if last.id then do; start=stop+1; stop=postop_days; cum_teeth+num_teeth_per_txdate; event=(postop_yn=1); output; end;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;run;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/DIV&gt;</description>
    <pubDate>Fri, 30 Jan 2026 15:55:39 GMT</pubDate>
    <dc:creator>dwhitney</dc:creator>
    <dc:date>2026-01-30T15:55:39Z</dc:date>
    <item>
      <title>Programming a time-varying cumulative covariate in long format</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Programming-a-time-varying-cumulative-covariate-in-long-format/m-p/982727#M379379</link>
      <description>&lt;P&gt;I have a dataset in a long format where each subsequent row per ID is a new dental surgery event; folks have anywhere from 2-5 distinct surgery dates (tx_date) within 30 days of the first tx_date. The outcome is examined up to 30 days after the first tx_date. For those that developed the outcome (postop_yn=1), the subsequent dental surgeries occur before or on the same day as the outcome. So, all unique tx_dates per ID are within 30 days of the very first tx_date through the end of the 30 day follow-up or on/before developing the outcome.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;At each surgery, a certain number of teeth get extracted&amp;nbsp;(Num_teeth_per_txdate). I need help in figuring out how to code the dataset so that I get a start (day 1) to end (the day before the subsequent tx_date) per tx_date while cumulatively summing the Num_teeth_per_txdate until the last tx_date.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;1. One question is how to code the start/stop so that the stop is 1 day before the subsequent tx_date; right now, I am getting the stop to equal the next tx_date.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;2. The other question is how to get the Num_teeth_per_txdate to be cumulatively summing over the tx_dates.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Below is the first 50 observations of the dataset. After that is the code I am struggling with.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;id&lt;/TD&gt;&lt;TD&gt;tx_date&lt;/TD&gt;&lt;TD&gt;tx_visit&lt;/TD&gt;&lt;TD&gt;days_diff&lt;/TD&gt;&lt;TD&gt;Num_teeth_per_txdate&lt;/TD&gt;&lt;TD&gt;postop_yn&lt;/TD&gt;&lt;TD&gt;postop_days&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;120587&lt;/TD&gt;&lt;TD&gt;10/3/2022&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;120587&lt;/TD&gt;&lt;TD&gt;10/28/2022&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;25&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;149268&lt;/TD&gt;&lt;TD&gt;3/25/2021&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;149268&lt;/TD&gt;&lt;TD&gt;4/15/2021&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;21&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;152067&lt;/TD&gt;&lt;TD&gt;1/28/2021&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;152067&lt;/TD&gt;&lt;TD&gt;2/11/2021&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;14&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;154198&lt;/TD&gt;&lt;TD&gt;12/10/2020&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;154198&lt;/TD&gt;&lt;TD&gt;12/17/2020&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;7&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;154198&lt;/TD&gt;&lt;TD&gt;1/6/2021&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;27&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;170135&lt;/TD&gt;&lt;TD&gt;9/26/2022&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;170135&lt;/TD&gt;&lt;TD&gt;10/20/2022&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;24&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;181736&lt;/TD&gt;&lt;TD&gt;3/12/2024&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;181736&lt;/TD&gt;&lt;TD&gt;3/19/2024&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;7&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;309868&lt;/TD&gt;&lt;TD&gt;6/16/2023&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;309868&lt;/TD&gt;&lt;TD&gt;7/14/2023&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;28&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;318151&lt;/TD&gt;&lt;TD&gt;4/4/2023&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;6&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;318151&lt;/TD&gt;&lt;TD&gt;4/18/2023&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;14&lt;/TD&gt;&lt;TD&gt;9&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;323719&lt;/TD&gt;&lt;TD&gt;11/9/2022&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;323719&lt;/TD&gt;&lt;TD&gt;11/15/2022&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;6&lt;/TD&gt;&lt;TD&gt;8&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;327936&lt;/TD&gt;&lt;TD&gt;11/23/2020&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;327936&lt;/TD&gt;&lt;TD&gt;12/22/2020&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;29&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;329053&lt;/TD&gt;&lt;TD&gt;12/23/2021&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;329053&lt;/TD&gt;&lt;TD&gt;1/11/2022&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;19&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;336334&lt;/TD&gt;&lt;TD&gt;3/5/2024&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;336334&lt;/TD&gt;&lt;TD&gt;3/27/2024&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;22&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;337798&lt;/TD&gt;&lt;TD&gt;5/5/2021&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;6&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;337798&lt;/TD&gt;&lt;TD&gt;5/14/2021&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;9&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;338227&lt;/TD&gt;&lt;TD&gt;11/29/2023&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;338227&lt;/TD&gt;&lt;TD&gt;12/19/2023&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;20&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;340983&lt;/TD&gt;&lt;TD&gt;1/20/2021&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;340983&lt;/TD&gt;&lt;TD&gt;1/28/2021&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;8&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;340983&lt;/TD&gt;&lt;TD&gt;2/3/2021&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;14&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;345539&lt;/TD&gt;&lt;TD&gt;10/3/2025&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;345539&lt;/TD&gt;&lt;TD&gt;10/17/2025&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;14&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;345539&lt;/TD&gt;&lt;TD&gt;10/31/2025&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;28&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;348457&lt;/TD&gt;&lt;TD&gt;7/6/2023&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;21&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;348457&lt;/TD&gt;&lt;TD&gt;7/17/2023&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;11&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;21&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;349118&lt;/TD&gt;&lt;TD&gt;7/21/2020&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;349118&lt;/TD&gt;&lt;TD&gt;7/30/2020&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;9&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;349118&lt;/TD&gt;&lt;TD&gt;8/13/2020&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;23&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;349948&lt;/TD&gt;&lt;TD&gt;10/12/2022&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;16&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;349948&lt;/TD&gt;&lt;TD&gt;10/19/2022&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;7&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;16&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;350382&lt;/TD&gt;&lt;TD&gt;1/24/2024&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;350382&lt;/TD&gt;&lt;TD&gt;2/7/2024&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;14&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;354806&lt;/TD&gt;&lt;TD&gt;2/23/2021&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;354806&lt;/TD&gt;&lt;TD&gt;3/2/2021&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;7&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;363310&lt;/TD&gt;&lt;TD&gt;11/12/2020&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;363310&lt;/TD&gt;&lt;TD&gt;11/17/2020&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;6&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;367820&lt;/TD&gt;&lt;TD&gt;5/20/2022&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;367820&lt;/TD&gt;&lt;TD&gt;6/14/2022&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;25&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Code that needs some help.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;DIV&gt;data v2a; set v2;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;by id;&amp;nbsp;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;retain start stop tvteeth teeth;&amp;nbsp;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;if first.id then do; start=1; stop=1; teeth=.; tvteeth=Num_teeth_per_txdate; end;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;if tx_visit ne 1 and days_diff &amp;lt; postop_days then do; start=stop; stop=days_diff; teeth=lag(Num_teeth_per_txdate); tvteeth=tvteeth+teeth; event=0; output; end;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;if last.id then do; start=stop; stop=postop_days; teeth=lag(Num_teeth_per_txdate); tvteeth=tvteeth+teeth; event=(postop_yn=1); output; end;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;run;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 30 Jan 2026 14:53:14 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Programming-a-time-varying-cumulative-covariate-in-long-format/m-p/982727#M379379</guid>
      <dc:creator>dwhitney</dc:creator>
      <dc:date>2026-01-30T14:53:14Z</dc:date>
    </item>
    <item>
      <title>Re: Programming a time-varying cumulative covariate in long format</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Programming-a-time-varying-cumulative-covariate-in-long-format/m-p/982730#M379380</link>
      <description>&lt;BLOCKQUOTE&gt;&lt;HR /&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/241840"&gt;@dwhitney&lt;/a&gt;&amp;nbsp;wrote:&lt;BR /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;1. One question is how to code the start/stop so that the stop is 1 day before the subsequent tx_date; right now, I am getting the stop to equal the next tx_date.&lt;/P&gt;
&lt;HR /&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;I am mystified by this question. I feel either I have completely missed the point, or you have missed something obvious. Can you not just subtract 1 and get the quantity you want?&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;2. The other question is how to get the Num_teeth_per_txdate to be cumulatively summing over the tx_dates.&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Cumulative number of teeth, you can add this into your existing SAS data step code:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;if first.id then cum_teeth=0;
cum_teeth+num_teeth_per_txdate;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 30 Jan 2026 15:12:16 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Programming-a-time-varying-cumulative-covariate-in-long-format/m-p/982730#M379380</guid>
      <dc:creator>PaigeMiller</dc:creator>
      <dc:date>2026-01-30T15:12:16Z</dc:date>
    </item>
    <item>
      <title>Re: Programming a time-varying cumulative covariate in long format</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Programming-a-time-varying-cumulative-covariate-in-long-format/m-p/982741#M379382</link>
      <description>&lt;P&gt;Hi Paige,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Thank you for the reply!&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;1. I can easily subtract 1 from STOP, but in a follow up DATA STEP as I can isolate the ID order number. In the current DATA STEP, if I subtract or add 1 to either the START or STOP for lines "if tx_visit ne 1..." and "if last.id...", it does this calculation on rows that I DO and do NOT want it to. For example,&amp;nbsp; the below code (bolded segments are the revision) yields the correct START/STOP for the first and last ID rows, but not middle rows for those with 3+ tx_dates (see last ID in below table; I bolded the incorrect row).&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;DIV&gt;data v2a; set v2;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;by id;&amp;nbsp;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;retain start stop tvteeth teeth;&amp;nbsp;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;if first.id then cum_teeth=0; cum_teeth+num_teeth_per_txdate;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;if first.id then do; start=1; stop=1; teeth=.; tvteeth=Num_teeth_per_txdate; end;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;if tx_visit ne 1 and days_diff &amp;lt; postop_days then do; start=stop;&lt;STRONG&gt; stop=days_diff-1&lt;/STRONG&gt;; teeth=lag(Num_teeth_per_txdate); tvteeth=tvteeth+teeth; event=0; output; end;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;if last.id then do; &lt;STRONG&gt;start=stop+1&lt;/STRONG&gt;; stop=postop_days; teeth=lag(Num_teeth_per_txdate); tvteeth=tvteeth+teeth; event=(postop_yn=1); output; end;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;run;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;id&lt;/TD&gt;&lt;TD&gt;tx_date&lt;/TD&gt;&lt;TD&gt;days_diff&lt;/TD&gt;&lt;TD&gt;start&lt;/TD&gt;&lt;TD&gt;stop&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;120587&lt;/TD&gt;&lt;TD&gt;10/3/2022&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;24&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;120587&lt;/TD&gt;&lt;TD&gt;10/28/2022&lt;/TD&gt;&lt;TD&gt;25&lt;/TD&gt;&lt;TD&gt;25&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;149268&lt;/TD&gt;&lt;TD&gt;3/25/2021&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;20&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;149268&lt;/TD&gt;&lt;TD&gt;4/15/2021&lt;/TD&gt;&lt;TD&gt;21&lt;/TD&gt;&lt;TD&gt;21&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;152067&lt;/TD&gt;&lt;TD&gt;1/28/2021&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;13&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;152067&lt;/TD&gt;&lt;TD&gt;2/11/2021&lt;/TD&gt;&lt;TD&gt;14&lt;/TD&gt;&lt;TD&gt;14&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;154198&lt;/TD&gt;&lt;TD&gt;12/10/2020&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;6&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;STRONG&gt;154198&lt;/STRONG&gt;&lt;/TD&gt;&lt;TD&gt;&lt;STRONG&gt;12/17/2020&lt;/STRONG&gt;&lt;/TD&gt;&lt;TD&gt;&lt;STRONG&gt;7&lt;/STRONG&gt;&lt;/TD&gt;&lt;TD&gt;&lt;STRONG&gt;6&lt;/STRONG&gt;&lt;/TD&gt;&lt;TD&gt;&lt;STRONG&gt;26&lt;/STRONG&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;154198&lt;/TD&gt;&lt;TD&gt;1/6/2021&lt;/TD&gt;&lt;TD&gt;27&lt;/TD&gt;&lt;TD&gt;27&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&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;2. I have added your suggested code in several few different places, but it is not getting the cumulative sum, and I am not sure why. Below is the first 9 observations where the cum_teeth variable is showing what it SHOULD be, but I can't get that. Any suggestions? Below is the last version of the code I tried.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;id&lt;/TD&gt;&lt;TD&gt;tx_date&lt;/TD&gt;&lt;TD&gt;start&lt;/TD&gt;&lt;TD&gt;stop&lt;/TD&gt;&lt;TD&gt;cum_teeth&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;120587&lt;/TD&gt;&lt;TD&gt;10/28/2022&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;24&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;120587&lt;/TD&gt;&lt;TD&gt;10/28/2022&lt;/TD&gt;&lt;TD&gt;25&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;149268&lt;/TD&gt;&lt;TD&gt;4/15/2021&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;20&lt;/TD&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;149268&lt;/TD&gt;&lt;TD&gt;4/15/2021&lt;/TD&gt;&lt;TD&gt;21&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;TD&gt;8&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;152067&lt;/TD&gt;&lt;TD&gt;2/11/2021&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;13&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;152067&lt;/TD&gt;&lt;TD&gt;2/11/2021&lt;/TD&gt;&lt;TD&gt;14&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;154198&lt;/TD&gt;&lt;TD&gt;12/17/2020&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;6&lt;/TD&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;154198&lt;/TD&gt;&lt;TD&gt;1/6/2021&lt;/TD&gt;&lt;TD&gt;6&lt;/TD&gt;&lt;TD&gt;26&lt;/TD&gt;&lt;TD&gt;7&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;154198&lt;/TD&gt;&lt;TD&gt;1/6/2021&lt;/TD&gt;&lt;TD&gt;27&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;TD&gt;10&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;DIV&gt;data v2a; set v2;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;by id;&amp;nbsp;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;retain start stop teeth cum_teeth;&amp;nbsp;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;if first.id then do; start=1; stop=1; cum_teeth=0; end;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;if tx_visit ne 1 and days_diff &amp;lt; postop_days then do; start=stop; stop=days_diff-1; cum_teeth+num_teeth_per_txdate; event=0; output; end;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;if last.id then do; start=stop+1; stop=postop_days; cum_teeth+num_teeth_per_txdate; event=(postop_yn=1); output; end;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;run;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/DIV&gt;</description>
      <pubDate>Fri, 30 Jan 2026 15:55:39 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Programming-a-time-varying-cumulative-covariate-in-long-format/m-p/982741#M379382</guid>
      <dc:creator>dwhitney</dc:creator>
      <dc:date>2026-01-30T15:55:39Z</dc:date>
    </item>
    <item>
      <title>Re: Programming a time-varying cumulative covariate in long format</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Programming-a-time-varying-cumulative-covariate-in-long-format/m-p/982743#M379383</link>
      <description>&lt;P&gt;Regarding #2, the summing to get cum_teeth should not be inside an IF statement. That line must execute on every record.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Regarding #1, I am going to request that you provide code inside a code box (click on the little running man icon and paste your code in there) with one command per line, and with proper indentation.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;And in fact, it is also requested (by me, if you want me to run code on your data) to provide the data as working SAS data step code (&lt;A href="https://blogs.sas.com/content/sastraining/2016/03/11/jedi-sas-tricks-data-to-data-step-macro/" target="_self"&gt;examples and instructions&lt;/A&gt;).&lt;/P&gt;</description>
      <pubDate>Fri, 30 Jan 2026 16:12:54 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Programming-a-time-varying-cumulative-covariate-in-long-format/m-p/982743#M379383</guid>
      <dc:creator>PaigeMiller</dc:creator>
      <dc:date>2026-01-30T16:12:54Z</dc:date>
    </item>
    <item>
      <title>Re: Programming a time-varying cumulative covariate in long format</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Programming-a-time-varying-cumulative-covariate-in-long-format/m-p/982753#M379386</link>
      <description>&lt;PRE&gt;&lt;CODE class=""&gt;data v2a;  set v2; 

by id; 

retain start stop cum_teeth; 

if first.id then do; start=1; stop=1; cum_teeth=0; end;

if tx_visit ne 1 and days_diff &amp;lt; postop_days then do; start=stop; stop=days_diff-1; event=0; output; end;

if last.id then do; start=stop+1; stop=postop_days; event=(postop_yn=1); output; end;

cum_teeth+num_teeth_per_txdate;
			
run;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;Above is the code that is still not working to get the cumulative teeth.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Below is the working SAS data step code. I am only taking the first ~50 observations.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;data 50.V2;&lt;BR /&gt;infile datalines dsd truncover;&lt;BR /&gt;input id:BEST. tx_date:MMDDYY10. tx_visit:32. days_diff:32. Num_teeth_per_txdate:32. postop_yn:32. postop_days:32.;&lt;BR /&gt;format id BEST. tx_date MMDDYY10.;&lt;BR /&gt;label id="ID" tx_date="Tx_date";&lt;BR /&gt;datalines4;&lt;BR /&gt;120587,10/03/2022,1,0,2,0,30&lt;BR /&gt;120587,10/28/2022,2,25,1,0,30&lt;BR /&gt;149268,03/25/2021,1,0,5,0,30&lt;BR /&gt;149268,04/15/2021,2,21,3,0,30&lt;BR /&gt;152067,01/28/2021,1,0,3,0,30&lt;BR /&gt;152067,02/11/2021,2,14,1,0,30&lt;BR /&gt;154198,12/10/2020,1,0,5,0,30&lt;BR /&gt;154198,12/17/2020,2,7,2,0,30&lt;BR /&gt;154198,01/06/2021,3,27,3,0,30&lt;BR /&gt;170135,09/26/2022,1,0,1,0,30&lt;BR /&gt;170135,10/20/2022,2,24,1,0,30&lt;BR /&gt;181736,03/12/2024,1,0,1,0,30&lt;BR /&gt;181736,03/19/2024,2,7,1,0,30&lt;BR /&gt;309868,06/16/2023,1,0,3,0,30&lt;BR /&gt;309868,07/14/2023,2,28,2,0,30&lt;BR /&gt;318151,04/04/2023,1,0,6,1,30&lt;BR /&gt;318151,04/18/2023,2,14,9,1,30&lt;BR /&gt;323719,11/09/2022,1,0,1,0,30&lt;BR /&gt;323719,11/15/2022,2,6,8,0,30&lt;BR /&gt;327936,11/23/2020,1,0,1,0,30&lt;BR /&gt;327936,12/22/2020,2,29,1,0,30&lt;BR /&gt;329053,12/23/2021,1,0,3,0,30&lt;BR /&gt;329053,01/11/2022,2,19,1,0,30&lt;BR /&gt;336334,03/05/2024,1,0,1,0,30&lt;BR /&gt;336334,03/27/2024,2,22,3,0,30&lt;BR /&gt;337798,05/05/2021,1,0,6,0,30&lt;BR /&gt;337798,05/14/2021,2,9,4,0,30&lt;BR /&gt;338227,11/29/2023,1,0,3,0,30&lt;BR /&gt;338227,12/19/2023,2,20,4,0,30&lt;BR /&gt;340983,01/20/2021,1,0,4,0,30&lt;BR /&gt;340983,01/28/2021,2,8,4,0,30&lt;BR /&gt;340983,02/03/2021,3,14,2,0,30&lt;BR /&gt;345539,10/03/2025,1,0,3,0,30&lt;BR /&gt;345539,10/17/2025,2,14,3,0,30&lt;BR /&gt;345539,10/31/2025,3,28,3,0,30&lt;BR /&gt;348457,07/06/2023,1,0,1,1,21&lt;BR /&gt;348457,07/17/2023,2,11,3,1,21&lt;BR /&gt;349118,07/21/2020,1,0,1,0,30&lt;BR /&gt;349118,07/30/2020,2,9,4,0,30&lt;BR /&gt;349118,08/13/2020,3,23,2,0,30&lt;BR /&gt;349948,10/12/2022,1,0,1,1,16&lt;BR /&gt;349948,10/19/2022,2,7,4,1,16&lt;BR /&gt;350382,01/24/2024,1,0,1,0,30&lt;BR /&gt;350382,02/07/2024,2,14,4,0,30&lt;BR /&gt;354806,02/23/2021,1,0,2,0,30&lt;BR /&gt;354806,03/02/2021,2,7,2,0,30&lt;BR /&gt;363310,11/12/2020,1,0,4,0,30&lt;BR /&gt;363310,11/17/2020,2,5,6,0,30&lt;BR /&gt;367820,05/20/2022,1,0,5,0,30&lt;BR /&gt;367820,06/14/2022,2,25,2,0,30&lt;BR /&gt;369007,12/01/2025,1,0,5,0,30&lt;BR /&gt;369007,12/18/2025,2,17,5,0,30&lt;/P&gt;&lt;P&gt;;;;;&lt;/P&gt;</description>
      <pubDate>Fri, 30 Jan 2026 16:34:39 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Programming-a-time-varying-cumulative-covariate-in-long-format/m-p/982753#M379386</guid>
      <dc:creator>dwhitney</dc:creator>
      <dc:date>2026-01-30T16:34:39Z</dc:date>
    </item>
    <item>
      <title>Re: Programming a time-varying cumulative covariate in long format</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Programming-a-time-varying-cumulative-covariate-in-long-format/m-p/982754#M379387</link>
      <description>&lt;P&gt;Please comply with my request, with emphasis in red.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;Regarding #1, I am going to request that you provide code inside a code box (click on the little running man icon and paste your code in there) &lt;FONT color="#FF0000"&gt;with one command per line, and with proper indentation&lt;/FONT&gt;.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 30 Jan 2026 17:53:20 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Programming-a-time-varying-cumulative-covariate-in-long-format/m-p/982754#M379387</guid>
      <dc:creator>PaigeMiller</dc:creator>
      <dc:date>2026-01-30T17:53:20Z</dc:date>
    </item>
    <item>
      <title>Re: Programming a time-varying cumulative covariate in long format</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Programming-a-time-varying-cumulative-covariate-in-long-format/m-p/982755#M379388</link>
      <description>&lt;P&gt;Apologies, I must not know what proper indentation is. I googled it and tried the below.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;CODE class=""&gt;data v2a;  
    set v2; 
        by id; 
            retain start stop cum_teeth; 
            if first.id then do; 
                start=1; stop=1; cum_teeth=0; 
            end;
            if tx_visit ne 1 and days_diff &amp;lt; postop_days then do; 
                start=stop; stop=days_diff-1; event=0; 
           output; 
           end;
           if last.id then do; 
               start=stop+1; stop=postop_days; event=(postop_yn=1); 
           output; 
           end;
        cum_teeth+num_teeth_per_txdate;		
run;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Fri, 30 Jan 2026 18:12:39 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Programming-a-time-varying-cumulative-covariate-in-long-format/m-p/982755#M379388</guid>
      <dc:creator>dwhitney</dc:creator>
      <dc:date>2026-01-30T18:12:39Z</dc:date>
    </item>
    <item>
      <title>Re: Programming a time-varying cumulative covariate in long format</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Programming-a-time-varying-cumulative-covariate-in-long-format/m-p/982756#M379389</link>
      <description>&lt;P&gt;You still have three commands on a single line.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Nevertheless, this is much more workable, so thank you.&amp;nbsp; Here is my solution.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data v2a;  
    set v2; 
    by id; 
    prev_tx_date=lag(tx_date);
    if first.id then do; 
        days_diff=0;
        cum_teeth=0; 
    end;
    else do;
        days_diff=tx_date-prev_tx_date-1;
    end;
    cum_teeth+num_teeth_per_txdate;	
    drop prev_tx_date;
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 30 Jan 2026 18:40:36 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Programming-a-time-varying-cumulative-covariate-in-long-format/m-p/982756#M379389</guid>
      <dc:creator>PaigeMiller</dc:creator>
      <dc:date>2026-01-30T18:40:36Z</dc:date>
    </item>
    <item>
      <title>Re: Programming a time-varying cumulative covariate in long format</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Programming-a-time-varying-cumulative-covariate-in-long-format/m-p/982757#M379390</link>
      <description>&lt;P&gt;Ah, I see now what is meant by a command! I will do that in the future. Thank you for working me on this.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Your code works well to get the cum_teeth, but not the START and STOP (in days), which I need for the time-varying proc phreg model. I tried using your code and adding START/STOP variables, but to no luck.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;If first.ID, then START should equal 1 and the STOP should be 1 day minus the next tx_date per ID. Then for subsequent tx_dates per ID, the START should equal the diff_days (tx_date of that row - tx_date from the row before) and the STOP should equal either: (1)&amp;nbsp; 1 day minus the next tx_date per ID if not the last.ID or (2) the postop_days if the last.ID. Is there a way to build that into your code?&lt;/P&gt;</description>
      <pubDate>Fri, 30 Jan 2026 18:57:49 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Programming-a-time-varying-cumulative-covariate-in-long-format/m-p/982757#M379390</guid>
      <dc:creator>dwhitney</dc:creator>
      <dc:date>2026-01-30T18:57:49Z</dc:date>
    </item>
    <item>
      <title>Re: Programming a time-varying cumulative covariate in long format</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Programming-a-time-varying-cumulative-covariate-in-long-format/m-p/982758#M379391</link>
      <description>&lt;P&gt;Not sure I follow your whole thread but is seems you might need to know the NEXT value of START to do what you want.&amp;nbsp; &amp;nbsp;That is harder than finding the PREVIOUS value since it is much harder to predict the future than to remember the past.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;SAS makes it easy to find the PREVIOUS value by using the LAG() function to remember the past value.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Here is simple trick to predict the future.&amp;nbsp; Use an additional SET statement to read in the same dataset only using FIRSTOBS=2 to skip the first observation.&amp;nbsp; I like to add a third read of just the first observation to make the two SET statements have the same number of observations.&lt;/P&gt;
&lt;P&gt;Remember to take care not to use the NEXT value when at the end of a BY group since it comes from the following BY group.&amp;nbsp; Just like you took care not to use the PREVIOUS value at the start of the BY group since it came from an earlier BY group.&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data v2a;  
    set v2; 
    by id tx_date ; 
    prev_tx_date=lag(tx_date);
    set v2(keep=tx_date rename=(tx_date=next_tx_date) firstobs=2)
        v2(obs=1 drop=_all_)
    ;
    if first.id then do; 
        days_diff=0;
        cum_teeth=0; 
    end;
    else do;
        days_diff=tx_date-prev_tx_date-1;
    end;
    if last.id then call missing(next_tx_date);
    else stop_date = next_tx_date -1 ;
    format stop_date date9.;
    cum_teeth+num_teeth_per_txdate;	
    drop prev_tx_date next_tx_date ;
run;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Fri, 30 Jan 2026 19:47:41 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Programming-a-time-varying-cumulative-covariate-in-long-format/m-p/982758#M379391</guid>
      <dc:creator>Tom</dc:creator>
      <dc:date>2026-01-30T19:47:41Z</dc:date>
    </item>
    <item>
      <title>Re: Programming a time-varying cumulative covariate in long format</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Programming-a-time-varying-cumulative-covariate-in-long-format/m-p/982759#M379392</link>
      <description>&lt;P&gt;Maybe someone else can figure out how to do this in one step, but here is my solution which takes several steps&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data v2a;  
    set v2; 
    by id; 
    prev_tx_date=lag(tx_date);
    if first.id then do; 
        days_diff=0;
        cum_teeth=0; 
        start=1;
    end;
    else do;
        days_diff=tx_date-prev_tx_date-1;
    end;
    cum_teeth+num_teeth_per_txdate;	
    drop prev_tx_date;
run;

/* Find max tx_date and min tx_date per id */
proc summary nway data=v2a;
    class id;
    var tx_date;
    output out=max_tx_date min=min_tx_date max=max_tx_date;
run;
data v2b;
    merge v2a max_tx_date(keep=max_tx_date min_tx_date id);
    by id;
run;
data v2c;
    merge v2b v2b(firstobs=2 keep=tx_date rename=(tx_date=next_tx_date));
    if days_diff=0 then do; 
        start=1;
        stop=next_tx_date-tx_date-1; 
    end;
    else do;
        if tx_date^=max_tx_date then do;
            start=tx_date-min_tx_date;
            stop=next_tx_date-min_tx_date-1; 
        end;
        else do;
            start=tx_date-min_tx_date;
            stop=postop_days;
        end;
    end;
    drop min_tx_date max_tx_date next_tx_date;
run;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Fri, 30 Jan 2026 19:36:23 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Programming-a-time-varying-cumulative-covariate-in-long-format/m-p/982759#M379392</guid>
      <dc:creator>PaigeMiller</dc:creator>
      <dc:date>2026-01-30T19:36:23Z</dc:date>
    </item>
    <item>
      <title>Re: Programming a time-varying cumulative covariate in long format</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Programming-a-time-varying-cumulative-covariate-in-long-format/m-p/982760#M379393</link>
      <description>&lt;P&gt;You might try something like this.&amp;nbsp; That said, I don't think I really follow the purpose of the 'post_op' variable here.&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;proc sql noprint;
select max(nrecs) into :maxrecs trimmed 
from 
	(select id, count(*) as nrecs from tx group by id);
quit;

%let maxrecs=%eval(&amp;amp;maxrecs+1);

proc sort data=tx; by id tx_date; run;

data tx2;
set tx;
by id;
array dts {&amp;amp;maxrecs} _temporary_;
array tth {&amp;amp;maxrecs} _temporary_;
length n startdt enddt 4 nteeth 3;
format startdt enddt date9.;
if first.id then call missing(of dts[*], of tth[*], n, nteeth);
n+1;
dts[n]=tx_date;
tth[n]=num_teeth_per_txdate;
if last.id then do;
	do i=1 to n;
		startdt=dts[i];
		enddt=dts[i+1]-1;
		nteeth+tth[i];
		output;
	end;
end;
keep id startdt enddt nteeth;
run;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Fri, 30 Jan 2026 20:42:59 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Programming-a-time-varying-cumulative-covariate-in-long-format/m-p/982760#M379393</guid>
      <dc:creator>quickbluefish</dc:creator>
      <dc:date>2026-01-30T20:42:59Z</dc:date>
    </item>
    <item>
      <title>Re: Programming a time-varying cumulative covariate in long format</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Programming-a-time-varying-cumulative-covariate-in-long-format/m-p/982762#M379394</link>
      <description>&lt;P&gt;Thank you, kindly, to everyone! Using a bit of everyone's approach, I finally got the dataset that I needed. This has been an incredibly helpful experience. Thank you, everyone!&lt;/P&gt;</description>
      <pubDate>Fri, 30 Jan 2026 21:02:28 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Programming-a-time-varying-cumulative-covariate-in-long-format/m-p/982762#M379394</guid>
      <dc:creator>dwhitney</dc:creator>
      <dc:date>2026-01-30T21:02:28Z</dc:date>
    </item>
  </channel>
</rss>

