Hello,
I have a question about an example in the SAS documentation in the proc power.
The SAS code is example below:
proc power; twosamplefreq test=fm proportiondiff = 0.06 refproportion = 0.32 nullproportiondiff = -0.02 sides = u ntotal = . power = 0.85; run;
I don't understand when is necessary to put NULLPROPORTION as different of 0 ? What does this mean?
Thank you,
Clg
Hello @Clg,
Assuming that you mean NULLPROPORTIONDIFF, this is the negative non-inferiority margin in your example, i.e., the −d in section Farrington-Manning (Score) Test of the PROC FREQ documentation (under "Risks and Risk Differences").
Example:
Suppose the standard therapy has a response rate of 32% (refproportion). The response rate of the new (experimental) therapy is assumed to be 6 percentage points higher (proportiondiff), i.e., 38%. The aim of the clinical trial is just to show that it's less than 2 percentage points lower (if not higher, of course) because that would suffice to claim that the new therapy is "not inferior" to the standard therapy -- in the sense that a response rate of, say, 30.1% would still be acceptable (perhaps in view of advantages regarding adverse events, costs, etc.).
Your PROC POWER step yields:
Farrington-Manning Score Test for Proportion Difference Fixed Scenario Elements Distribution Asymptotic normal Method Normal approximation Number of Sides U Null Proportion Difference -0.02 Reference (Group 1) Proportion 0.32 Proportion Difference 0.06 Nominal Power 0.85 Alpha 0.05 Group 1 Weight 1 Group 2 Weight 1 Computed N Total Actual N Power Total 0.850 1022
That is, with n=1022/2=511 patients per group we would expect about 85% of a large number of hypothetical non-inferiority trials to confirm (at the alpha=5% level) that the experimental therapy is not inferior to the standard therapy.
Let's simulate 100,000 of those trials "Experimental vs. Standard":
%let nsim=100000;
%let n=%eval(1022/2);
%let p1=0.32;
%let pd=0.06;
%let m=0.02; /* PROC FREQ needs the absolute value of the null proportion difference. */
data sim;
call streaminit(27182818);
do i=1 to ≁
do g='E','S';
resp=1;
k=rand('binom', &p1+(g='E')*&pd, &n);
output;
resp=0;
k=&n-k;
output;
end;
end;
run;
ods select none;
ods noresults;
ods output pdiffnoninf=pdni;
proc freq data=sim;
by i;
weight k;
tables g*resp / riskdiff(column=2 method=fm noninf margin=&m);
run;
ods select all;
ods results;
proc format;
value pv
low-0.05='significant'
0.05<-high='not significant';
run;
ods exclude binomialtest;
proc freq data=pdni;
format pvalue pv.;
tables pvalue / binomial;
run;
Result:
Pr > Z Cumulative Cumulative PValue Frequency Percent Frequency Percent -------------------------------------------------------------------- significant 85197 85.20 85197 85.20 not significant 14803 14.80 100000 100.00 Binomial Proportion PValue = significant Proportion 0.8520 ASE 0.0011 95% Lower Conf Limit 0.8498 95% Upper Conf Limit 0.8542 Exact Conf Limits 95% Lower Conf Limit 0.8498 95% Upper Conf Limit 0.8542 Sample Size = 100000
So, the power (0.85) for the sample size obtained by PROC POWER has been confirmed.
Hello @Clg,
Assuming that you mean NULLPROPORTIONDIFF, this is the negative non-inferiority margin in your example, i.e., the −d in section Farrington-Manning (Score) Test of the PROC FREQ documentation (under "Risks and Risk Differences").
Example:
Suppose the standard therapy has a response rate of 32% (refproportion). The response rate of the new (experimental) therapy is assumed to be 6 percentage points higher (proportiondiff), i.e., 38%. The aim of the clinical trial is just to show that it's less than 2 percentage points lower (if not higher, of course) because that would suffice to claim that the new therapy is "not inferior" to the standard therapy -- in the sense that a response rate of, say, 30.1% would still be acceptable (perhaps in view of advantages regarding adverse events, costs, etc.).
Your PROC POWER step yields:
Farrington-Manning Score Test for Proportion Difference Fixed Scenario Elements Distribution Asymptotic normal Method Normal approximation Number of Sides U Null Proportion Difference -0.02 Reference (Group 1) Proportion 0.32 Proportion Difference 0.06 Nominal Power 0.85 Alpha 0.05 Group 1 Weight 1 Group 2 Weight 1 Computed N Total Actual N Power Total 0.850 1022
That is, with n=1022/2=511 patients per group we would expect about 85% of a large number of hypothetical non-inferiority trials to confirm (at the alpha=5% level) that the experimental therapy is not inferior to the standard therapy.
Let's simulate 100,000 of those trials "Experimental vs. Standard":
%let nsim=100000;
%let n=%eval(1022/2);
%let p1=0.32;
%let pd=0.06;
%let m=0.02; /* PROC FREQ needs the absolute value of the null proportion difference. */
data sim;
call streaminit(27182818);
do i=1 to ≁
do g='E','S';
resp=1;
k=rand('binom', &p1+(g='E')*&pd, &n);
output;
resp=0;
k=&n-k;
output;
end;
end;
run;
ods select none;
ods noresults;
ods output pdiffnoninf=pdni;
proc freq data=sim;
by i;
weight k;
tables g*resp / riskdiff(column=2 method=fm noninf margin=&m);
run;
ods select all;
ods results;
proc format;
value pv
low-0.05='significant'
0.05<-high='not significant';
run;
ods exclude binomialtest;
proc freq data=pdni;
format pvalue pv.;
tables pvalue / binomial;
run;
Result:
Pr > Z Cumulative Cumulative PValue Frequency Percent Frequency Percent -------------------------------------------------------------------- significant 85197 85.20 85197 85.20 not significant 14803 14.80 100000 100.00 Binomial Proportion PValue = significant Proportion 0.8520 ASE 0.0011 95% Lower Conf Limit 0.8498 95% Upper Conf Limit 0.8542 Exact Conf Limits 95% Lower Conf Limit 0.8498 95% Upper Conf Limit 0.8542 Sample Size = 100000
So, the power (0.85) for the sample size obtained by PROC POWER has been confirmed.
Are you ready for the spotlight? We're accepting content ideas for SAS Innovate 2025 to be held May 6-9 in Orlando, FL. The call is open until September 25. Read more here about why you should contribute and what is in it for you!
Learn how use the CAT functions in SAS to join values from multiple variables into a single value.
Find more tutorials on the SAS Users YouTube channel.