/******************************************************************
* Tipping-point sensitivity analysis for a continuous endpoint
* Missing Drug A values receive shifts from -8 to 0 after MAR MI.
******************************************************************/

proc import datafile="example.csv" out=adeff dbms=csv replace;
  guessingrows=max;
run;

%macro tipping(data=adeff, smin=-8, smax=0, sinc=1);
  %local ncase j shift;
  %let ncase=%sysfunc(floor(%sysevalf((&smax-&smin)/&sinc)));

  ods select none;
  %do j=0 %to &ncase;
    %let shift=%sysevalf(&smin+&j*&sinc);

    proc mi data=&data seed=14823 nimpute=25 out=outmi;
      class trtan;
      monotone reg;
      mnar adjust(aval / shift=&shift adjustobs=(trtan='1'));
      var trtan base aval;
    run;

    proc reg data=outmi;
      model aval=trtan base;
      by _imputation_;
      ods output ParameterEstimates=regparm;
    run;

    proc mianalyze parms=regparm;
      modeleffects trtan;
      ods output ParameterEstimates=miparm;
    run;

    data miparm;
      set miparm;
      shift=&shift;
    run;

    %if &j=0 %then %do;
      data tip_results;
        set miparm;
      run;
    %end;
    %else %do;
      data tip_results;
        set tip_results miparm;
      run;
    %end;
  %end;
  ods select all;

  proc sort data=tip_results;
    by descending shift;
  run;

  proc print data=tip_results noobs;
    var shift estimate stderr lclmean uclmean probt;
  run;
%mend;

%tipping();
