SAS Code to generate IPTW for continuous treatment duration
Reference:
Donna L. Coffman, Daniel Almirall and Wei Zhong "Assessing mediation using marginal structural models in the presence of confounding and moderation" Penn State, Technical Report Series 11-112
http://methodology.psu.edu/media/techreports/11-112.pdf
Appendix (page 47) gives R code for empirical data analysis, which I have converted to SAS below:
*--- center the continuous treatment duration variable at zero;
proc standard data=mydata out=stddata mean=0;
var duration;
run;
*--- intercept-only model for numerator;
ods output FitStatistics=fitnum;
proc reg data=stddata(keep=ptid duration);
model duration = ;
output out=ipt0 student=rd0 pred=yhat0;
run; quit;
data _null_; set fitnum;
if label1='Root MSE';
call symput('sigmani1',put(nvalue1,best.));
run;
*--- full model for denominator;
ods output FitStatistics=fitden;
proc reg data=stddata(keep=ptid a b c d duration);
model duration = a b c d;
output out=ipt1 student=rd1 pred=yhat1;
run; quit;
data _null_; set fitden;
if label1='Root MSE';
call symput('sigmadi1',put(nvalue1,best.));
run;
data ipt2; merge ipt0 ipt1;
by ptid;
sigmad=&sigmadi1; sigman=&sigmani1;
num_p=pdf('normal',duration,yhat0,sigman);
den_p=pdf('normal',duration,yhat1,sigmad);
iptw = num_p/den_p;
run;