<?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 Restricted Cubic Spline-RCSPLINE macro in SAS Procedures</title>
    <link>https://communities.sas.com/t5/SAS-Procedures/Restricted-Cubic-Spline-RCSPLINE-macro/m-p/882292#M82804</link>
    <description>&lt;P&gt;I have to manually create basis functions for a variable but SAS doesn't seem to have a procedure to do it.&amp;nbsp; I am using Frank Harrell's macro RCSPLINE but the basis variables are not identical to those created by SAS.&amp;nbsp; It seems like SAS is dividing the second basis by 4 and the last one by 4.5.&amp;nbsp; Not sure where these numbers come from for the example&amp;nbsp; given below.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;data simulation;&lt;BR /&gt;do i=1 to 10000;&lt;BR /&gt;t=rand('uniform',0,10);&lt;BR /&gt;p=1/(1+exp(sin(t)));&lt;BR /&gt;y=rand('bernoulli',p);&lt;BR /&gt;output;&lt;BR /&gt;end;&lt;BR /&gt;run;&lt;/P&gt;&lt;P&gt;*model a natural cubic spline;&lt;BR /&gt;*and store the result in "mystore";&lt;BR /&gt;proc logistic data=simulation OUTDESIGN=splines;&lt;BR /&gt;effect myspline=spline(t/knotmethod=list(1,2,3,4) NATURALCUBIC);&lt;BR /&gt;model y(event="1")=myspline;&lt;BR /&gt;store mystore;&lt;BR /&gt;run;&lt;BR /&gt;/*-------------------------&lt;BR /&gt;MACRO FOR CUBIC SPLINES&lt;BR /&gt;-------------------------*/&lt;BR /&gt;%macro rcspline(x,knot1,knot2,knot3,knot4,knot5,knot6,knot7,knot8,knot9,knot10, norm=2);&lt;BR /&gt;%LOCAL j v7 k tk tk1 t k1 k2;&lt;BR /&gt;%LET v7=&amp;amp;x; %IF %length(&amp;amp;v7)=8 %THEN %LET v7=%SUBSTR(&amp;amp;v7,1,7);&lt;BR /&gt;%*get no. knots, last knot, next to last knot;&lt;BR /&gt;%DO k=1 %TO 10;&lt;BR /&gt;%IF %QUOTE(&amp;amp;&amp;amp;knot&amp;amp;k)= %THEN %GOTO nomorek;&lt;BR /&gt;%END;&lt;BR /&gt;%LET k=11;&lt;BR /&gt;%nomorek: %LET k=%EVAL(&amp;amp;k-1); %LET k1=%EVAL(&amp;amp;k-1); %LET k2=%EVAL(&amp;amp;k-2);&lt;BR /&gt;%IF &amp;amp;k&amp;lt;3 %THEN %PUT ERROR: &lt;span class="lia-unicode-emoji" title=":red_heart:"&gt;❤️&lt;/span&gt; knots given. no spline variables CREATEd.;&lt;BR /&gt;%ELSE %DO;&lt;BR /&gt;%LET tk=&amp;amp;&amp;amp;knot&amp;amp;k;&lt;BR /&gt;%LET tk1=&amp;amp;&amp;amp;knot&amp;amp;k1;&lt;BR /&gt;DROP _kd_; _kd_=&lt;BR /&gt;%IF &amp;amp;norm=0 %THEN 1;&lt;BR /&gt;%ELSE %IF &amp;amp;norm=1 %THEN &amp;amp;tk - &amp;amp;tk1;&lt;BR /&gt;%ELSE (&amp;amp;tk - &amp;amp;knot1)**.666666666666; ;&lt;BR /&gt;%DO j=1 %TO &amp;amp;k2;&lt;BR /&gt;%LET t=&amp;amp;&amp;amp;knot&amp;amp;j;&lt;BR /&gt;&amp;amp;v7&amp;amp;j=max((&amp;amp;x-&amp;amp;t)/_kd_,0)**3+((&amp;amp;tk1-&amp;amp;t)*max((&amp;amp;x-&amp;amp;tk)/_kd_,0)**3&lt;BR /&gt;-(&amp;amp;tk-&amp;amp;t)*max((&amp;amp;x-&amp;amp;tk1)/_kd_,0)**3)/(&amp;amp;tk-&amp;amp;tk1)%STR(;);&lt;BR /&gt;%END;&lt;BR /&gt;%END;&lt;BR /&gt;%mend rcspline;&lt;/P&gt;&lt;P&gt;%macro rcspline(x,knot1,knot2,knot3,knot4,knot5,knot6,knot7,knot8,knot9,knot10, norm=2);&lt;BR /&gt;%LOCAL j v7 k tk tk1 t k1 k2;&lt;BR /&gt;%LET v7=&amp;amp;x; %IF %length(&amp;amp;v7)=8 %THEN %LET v7=%SUBSTR(&amp;amp;v7,1,7);&lt;BR /&gt;%*get no. knots, last knot, next to last knot;&lt;BR /&gt;%DO k=1 %TO 10;&lt;BR /&gt;%IF %QUOTE(&amp;amp;&amp;amp;knot&amp;amp;k)= %THEN %GOTO nomorek;&lt;BR /&gt;%END;&lt;BR /&gt;%LET k=11;&lt;BR /&gt;%nomorek: %LET k=%EVAL(&amp;amp;k-1); %LET k1=%EVAL(&amp;amp;k-1); %LET k2=%EVAL(&amp;amp;k-2);&lt;BR /&gt;%IF &amp;amp;k&amp;lt;3 %THEN %PUT ERROR: &lt;span class="lia-unicode-emoji" title=":red_heart:"&gt;❤️&lt;/span&gt; knots given. no spline variables CREATEd.;&lt;BR /&gt;%ELSE %DO;&lt;BR /&gt;%LET tk=&amp;amp;&amp;amp;knot&amp;amp;k;&lt;BR /&gt;%LET tk1=&amp;amp;&amp;amp;knot&amp;amp;k1;&lt;BR /&gt;DROP _kd_; _kd_=&lt;BR /&gt;%IF &amp;amp;norm=0 %THEN 1;&lt;BR /&gt;%ELSE %IF &amp;amp;norm=1 %THEN &amp;amp;tk - &amp;amp;tk1;&lt;BR /&gt;%ELSE (&amp;amp;tk - &amp;amp;knot1)**.666666666666; ;&lt;BR /&gt;%DO j=1 %TO &amp;amp;k2;&lt;BR /&gt;%LET t=&amp;amp;&amp;amp;knot&amp;amp;j;&lt;BR /&gt;&amp;amp;v7&amp;amp;j=max((&amp;amp;x-&amp;amp;t)/_kd_,0)**3+((&amp;amp;tk1-&amp;amp;t)*max((&amp;amp;x-&amp;amp;tk)/_kd_,0)**3&lt;BR /&gt;-(&amp;amp;tk-&amp;amp;t)*max((&amp;amp;x-&amp;amp;tk1)/_kd_,0)**3)/(&amp;amp;tk-&amp;amp;tk1)%STR(;);&lt;BR /&gt;%END;&lt;BR /&gt;%END;&lt;BR /&gt;%mend rcspline;&lt;BR /&gt;**comparing to splines datasets from PROC LOGISTIC&lt;BR /&gt;**t1 from PROC LOGISTIC=t1 from below divided by 4-1=3;&lt;BR /&gt;DATA want; SET simulation;&lt;BR /&gt;%rcspline(t,1,2,3,4); *%rcspline(month,6,48,90);&lt;BR /&gt;RUN;&lt;/P&gt;</description>
    <pubDate>Sun, 25 Jun 2023 01:25:50 GMT</pubDate>
    <dc:creator>PamG</dc:creator>
    <dc:date>2023-06-25T01:25:50Z</dc:date>
    <item>
      <title>Restricted Cubic Spline-RCSPLINE macro</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Restricted-Cubic-Spline-RCSPLINE-macro/m-p/882292#M82804</link>
      <description>&lt;P&gt;I have to manually create basis functions for a variable but SAS doesn't seem to have a procedure to do it.&amp;nbsp; I am using Frank Harrell's macro RCSPLINE but the basis variables are not identical to those created by SAS.&amp;nbsp; It seems like SAS is dividing the second basis by 4 and the last one by 4.5.&amp;nbsp; Not sure where these numbers come from for the example&amp;nbsp; given below.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;data simulation;&lt;BR /&gt;do i=1 to 10000;&lt;BR /&gt;t=rand('uniform',0,10);&lt;BR /&gt;p=1/(1+exp(sin(t)));&lt;BR /&gt;y=rand('bernoulli',p);&lt;BR /&gt;output;&lt;BR /&gt;end;&lt;BR /&gt;run;&lt;/P&gt;&lt;P&gt;*model a natural cubic spline;&lt;BR /&gt;*and store the result in "mystore";&lt;BR /&gt;proc logistic data=simulation OUTDESIGN=splines;&lt;BR /&gt;effect myspline=spline(t/knotmethod=list(1,2,3,4) NATURALCUBIC);&lt;BR /&gt;model y(event="1")=myspline;&lt;BR /&gt;store mystore;&lt;BR /&gt;run;&lt;BR /&gt;/*-------------------------&lt;BR /&gt;MACRO FOR CUBIC SPLINES&lt;BR /&gt;-------------------------*/&lt;BR /&gt;%macro rcspline(x,knot1,knot2,knot3,knot4,knot5,knot6,knot7,knot8,knot9,knot10, norm=2);&lt;BR /&gt;%LOCAL j v7 k tk tk1 t k1 k2;&lt;BR /&gt;%LET v7=&amp;amp;x; %IF %length(&amp;amp;v7)=8 %THEN %LET v7=%SUBSTR(&amp;amp;v7,1,7);&lt;BR /&gt;%*get no. knots, last knot, next to last knot;&lt;BR /&gt;%DO k=1 %TO 10;&lt;BR /&gt;%IF %QUOTE(&amp;amp;&amp;amp;knot&amp;amp;k)= %THEN %GOTO nomorek;&lt;BR /&gt;%END;&lt;BR /&gt;%LET k=11;&lt;BR /&gt;%nomorek: %LET k=%EVAL(&amp;amp;k-1); %LET k1=%EVAL(&amp;amp;k-1); %LET k2=%EVAL(&amp;amp;k-2);&lt;BR /&gt;%IF &amp;amp;k&amp;lt;3 %THEN %PUT ERROR: &lt;span class="lia-unicode-emoji" title=":red_heart:"&gt;❤️&lt;/span&gt; knots given. no spline variables CREATEd.;&lt;BR /&gt;%ELSE %DO;&lt;BR /&gt;%LET tk=&amp;amp;&amp;amp;knot&amp;amp;k;&lt;BR /&gt;%LET tk1=&amp;amp;&amp;amp;knot&amp;amp;k1;&lt;BR /&gt;DROP _kd_; _kd_=&lt;BR /&gt;%IF &amp;amp;norm=0 %THEN 1;&lt;BR /&gt;%ELSE %IF &amp;amp;norm=1 %THEN &amp;amp;tk - &amp;amp;tk1;&lt;BR /&gt;%ELSE (&amp;amp;tk - &amp;amp;knot1)**.666666666666; ;&lt;BR /&gt;%DO j=1 %TO &amp;amp;k2;&lt;BR /&gt;%LET t=&amp;amp;&amp;amp;knot&amp;amp;j;&lt;BR /&gt;&amp;amp;v7&amp;amp;j=max((&amp;amp;x-&amp;amp;t)/_kd_,0)**3+((&amp;amp;tk1-&amp;amp;t)*max((&amp;amp;x-&amp;amp;tk)/_kd_,0)**3&lt;BR /&gt;-(&amp;amp;tk-&amp;amp;t)*max((&amp;amp;x-&amp;amp;tk1)/_kd_,0)**3)/(&amp;amp;tk-&amp;amp;tk1)%STR(;);&lt;BR /&gt;%END;&lt;BR /&gt;%END;&lt;BR /&gt;%mend rcspline;&lt;/P&gt;&lt;P&gt;%macro rcspline(x,knot1,knot2,knot3,knot4,knot5,knot6,knot7,knot8,knot9,knot10, norm=2);&lt;BR /&gt;%LOCAL j v7 k tk tk1 t k1 k2;&lt;BR /&gt;%LET v7=&amp;amp;x; %IF %length(&amp;amp;v7)=8 %THEN %LET v7=%SUBSTR(&amp;amp;v7,1,7);&lt;BR /&gt;%*get no. knots, last knot, next to last knot;&lt;BR /&gt;%DO k=1 %TO 10;&lt;BR /&gt;%IF %QUOTE(&amp;amp;&amp;amp;knot&amp;amp;k)= %THEN %GOTO nomorek;&lt;BR /&gt;%END;&lt;BR /&gt;%LET k=11;&lt;BR /&gt;%nomorek: %LET k=%EVAL(&amp;amp;k-1); %LET k1=%EVAL(&amp;amp;k-1); %LET k2=%EVAL(&amp;amp;k-2);&lt;BR /&gt;%IF &amp;amp;k&amp;lt;3 %THEN %PUT ERROR: &lt;span class="lia-unicode-emoji" title=":red_heart:"&gt;❤️&lt;/span&gt; knots given. no spline variables CREATEd.;&lt;BR /&gt;%ELSE %DO;&lt;BR /&gt;%LET tk=&amp;amp;&amp;amp;knot&amp;amp;k;&lt;BR /&gt;%LET tk1=&amp;amp;&amp;amp;knot&amp;amp;k1;&lt;BR /&gt;DROP _kd_; _kd_=&lt;BR /&gt;%IF &amp;amp;norm=0 %THEN 1;&lt;BR /&gt;%ELSE %IF &amp;amp;norm=1 %THEN &amp;amp;tk - &amp;amp;tk1;&lt;BR /&gt;%ELSE (&amp;amp;tk - &amp;amp;knot1)**.666666666666; ;&lt;BR /&gt;%DO j=1 %TO &amp;amp;k2;&lt;BR /&gt;%LET t=&amp;amp;&amp;amp;knot&amp;amp;j;&lt;BR /&gt;&amp;amp;v7&amp;amp;j=max((&amp;amp;x-&amp;amp;t)/_kd_,0)**3+((&amp;amp;tk1-&amp;amp;t)*max((&amp;amp;x-&amp;amp;tk)/_kd_,0)**3&lt;BR /&gt;-(&amp;amp;tk-&amp;amp;t)*max((&amp;amp;x-&amp;amp;tk1)/_kd_,0)**3)/(&amp;amp;tk-&amp;amp;tk1)%STR(;);&lt;BR /&gt;%END;&lt;BR /&gt;%END;&lt;BR /&gt;%mend rcspline;&lt;BR /&gt;**comparing to splines datasets from PROC LOGISTIC&lt;BR /&gt;**t1 from PROC LOGISTIC=t1 from below divided by 4-1=3;&lt;BR /&gt;DATA want; SET simulation;&lt;BR /&gt;%rcspline(t,1,2,3,4); *%rcspline(month,6,48,90);&lt;BR /&gt;RUN;&lt;/P&gt;</description>
      <pubDate>Sun, 25 Jun 2023 01:25:50 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Restricted-Cubic-Spline-RCSPLINE-macro/m-p/882292#M82804</guid>
      <dc:creator>PamG</dc:creator>
      <dc:date>2023-06-25T01:25:50Z</dc:date>
    </item>
  </channel>
</rss>

