SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 720|回复: 0
打印 上一主题 下一主题

ROC样本含量的计算SAS程序

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2004-4-14 12:47:00 | 只看该作者

ROC样本含量的计算SAS程序

[code:97ebc]%macro rocpower (t0, t1, t2, percent, r,na, nn,n, alpha, tails, ordinal, I=2,
   J=1);

%macro VAR(num);
    if ordinal=1 then do;
       A&num=probit(t&num)*sqrt(2);
     V&num=na*((.0099)*exp(-A&num**2/2))*((5*A&num**2+8)/na+(A&num**2+8)/nn);
       end;
    else do;
       Q1&num=t&num/(2-t&num);
       Q2&num=2*(T&num**2)/(1+T&num);
       v&num=Q1&num/ratio+Q2&num-T&num**2*(1/ratio+1);
       end;
  %mend;



data zepp1;
error=0;
pi=3.141592654;
I=&i+0; if i le 0 then i=1;
j=&j+0; if j le 0 then j=1;

t0=&t0+0; if t0 le 0 then do;
           put "ERROR: t1 needs to be specified";
           error=1;
           end;
          if t0 ge 1 then do;
            put "ERROR: t0 specified as &t0.  It should be less than 1.0";
           error=1;
           end;

t1=&t1+0; if t1 le 0 then do;
           put "ERROR: t1 needs to be specified";
           error=1;
           end;
          if t1 ge 1 then do;
            put "ERROR: t1 specified as &t1.  It should be less than 1.0";
           error=1;
           end;

t2=&t2+0; if i ge 2 and t2 le 0 then do;
           put "ERROR:  &i modalities indicated, but T2 not specified or set to zero";
           error=1;
           end;
          if t2 ge 1 then do;
            put "ERROR: t2 specified as &t2.  It should be less than 1.0";
           error=1;
           end;
n=&n+0; no=n;
nn=&nn+0; nno=nn;
na=&na+0; nao=na;
percent=&percent+0; percento=percent;
if percent>1 and percent le 100 then percent=percent/100;
if percent gt 100 then do;
  put "ERROR: A percentage greater than 100% has been entered";
  error=1;
  end;
if percent lt 0 then do;
  put "ERROR: A percentage less than 0 has been entered";
  error=1;
  end;
if nn gt 0 then percent=na/(nn+na);
if na le 0 and nn le 0 then do;
   if n le 0 then do;
    put "ERROR: na, nn, n, and percent input incorrectly or not at all";
    put "you must specify nn and na or percent and n";
    error=1;
    end;
   else do;
    na=percent*n;
    nn=n-na;
   end;
end;

alpha=&alpha+0; if alpha le 0 then do;
                  alpha=.05;
                  %let alpha=.05;
                  end;
tails=&tails+0; if tails le 0 then do;
                  tails=2;
                  %let tails=2;
                  end;
r=&r+0;
ordinal=&ordinal+0;
ratio=nn/na;

*Single Reader;
if J=1 and error=0 then do;

if t2 eq 0 and tails eq 1 then do;
   diff=abs(t1-t0);
   %do zz=0 %to 1;
     %var(&zz);
   %end;
   zbeta=(diff*sqrt(na)-probit(1-alpha)*sqrt(v0))/sqrt(v1);
   Power=probnorm(ZBeta);
end;

if t2 eq 0 and tails eq 2 then do;
   diff=abs(t1-t0);
   %do zz=0 %to 1;
     %var(&zz);
   %end;
   zbeta=(diff*sqrt(na)-probit(1-alpha/2)*sqrt(v0))/sqrt(v1);
   zbeta2=(-diff*sqrt(na)-probit(1-alpha/2)*sqrt(v0))/sqrt(v1);
   Power=probnorm(ZBeta) + probnorm(Zbeta2);
end;

if t2 gt 0 and tails eq 1 then do;
   d1=abs(t1-t0);
   d2=abs(t2-t0);
   d3=abs(t1-t2);
   diff=max(of d1 d2 d3);
   %do zz=0 %to 2;
     %var(&zz);
   %end;    ZBeta=(diff*sqrt(na)-probit(1-alpha)*sqrt(2*v0-2*r*V0))/sqrt(v1+v2-2*r*sqrt(v1)*sqrt(v2));
    Power=probnorm(ZBeta);
end;

if t2 gt 0 and tails eq 2 then do;
   d1=abs(t1-t0);
   d2=abs(t2-t0);
   d3=abs(t1-t2);
   diff=max(of d1 d2 d3);
%do zz=0 %to 2;
  %var(&zz);
%end;   ZBeta=(diff*sqrt(na)-probit(1-alpha/2)*sqrt(2*v0-2*r*V0))/sqrt(v1+v2-2*r*sqrt(v1)*sqrt(v2));
   ZBeta2=(-diff*sqrt(na)-probit(1-alpha/2)*sqrt(2*v0-2*r*V0))/sqrt(v1+v2-2*r*sqrt(v1)*sqrt(v2));
   Power=probnorm(ZBeta) + probnorm(Zbeta2);
end;




file print;
*paired or unpaired;

if i eq 2 then do;
  if r eq 0 then Put 'Unpaired Cases';
   else  Put 'Paired Cases';
end;

put;
put;

*hypotheses;
Put "Hypothesis tested:";
if i eq 2 then do;
  Put "HO:  T1 = T2 = &T0";
  if tails eq 2 then put "HA:  T1 < T2 or T1 > T2";
  else if t1<t2 then put "HA:  T1 < T2";
  else put "HA:  T1 > T2";
  end;
else if i eq 1 then do;
  Put "HO:  T1 = &T0";
  if tails eq 2 then put "HA:  T1 < &T0 or T1 > &T0";
  else if t1<t0 then put "HA:  T1 < &T0";
  else put "HA:  T1 > &T0";
  end;



put;
put;
put "With:";
put "T1 hypothesized at &t1";
if t2 gt 0 then put "T2 hypothesized at &t2";
put "Alpha = &alpha";

if na>10 and nn> 10 and nao gt 0 then do;
   put "Number of Abnormal Cases = &na";
   put "Number of Normal Cases = &nn";
   end;
else if na>10 and nn> 10 and percent gt 0 then do;
   put "Percent of abnormal patients = &percent";
   put " Total Sample Size = &n";
   end;


else if na<10 and nao gt 0 then do;
  put "WARNING:  The number of Abnormal Cases (&na) is small.";
  put "          Assymptotic Theory may not apply!";
  end;
else if na<10 and nao eq 0 then do;
  put "WARNING:  The percent (&percent) and total sample size (&n) yield a small number of abnormal patients.";
  put "          Assymptotic Theory may not apply!";
  end;

if nn<10 and nno gt 0 then do;
  put "WARNING:  The number of Normal Cases (&nn) is small.";
  put "          Assymptotic Theory may not apply!";
  end;
else if nn<10 and nno eq 0 then do;
  put "WARNING:  The percent (&percent) and total sample size (&n) yield a small number of abnormal patients.";
  put "          Assymptotic Theory may not apply!";
  end;


if r ne 0 then put "Correlation between T1 and T2 = &r";
if ordinal=0 then put "Standard Errors estimated using the Hanley-McNeil method";
else put "Standard Errors estimated using the Obuchowski method";
put;
put "The estimated Power of the test is " power 5.3;

end;

if error=1 then do;
file print;
put  #8 "An error has occurred, please check the SAS:LOG";
end;
%mend;[/code:97ebc]
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2025-1-10 00:39 , Processed in 0.107451 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表