I'm trying to convert an S-Plus program to R.  Since I'm a SAS programmer I'm 
not facile is either S-Plus or R, so I need some help.  All I did was convert 
the underscores in S-Plus to the assignment operator <-.  Here are the first 
few lines of the S-Plus file:
 
sshc _ function(rc, nc, d, method, alpha=0.05, power=0.8,
             tol=0.01, tol1=.0001, tol2=.005, cc=c(.1,2), l.span=.5)
{
### for method 1
if (method==1) {
ne1 _ ss.rand(rc,nc,d,alpha=.05,power=.8,tol=.01)
return(ne=ne1) 
               }

 
My translation looks like this:
 
sshc<-function(rc, nc=500, d=.5, method=3, alpha=0.05, power=0.8,
              tol=0.01, tol1=.0001, tol2=.005, cc=c(.1,2), l.span=.5)
{
### for method 1
if (method==1) {
 ne1<-ss.rand(rc,nc,d,alpha=.05,power=.8,tol=.01)
 return(ne=ne1) 
               }

The program runs without throwing errors, but I'm not getting any ourput in the 
console.  This is where it should be, right?  I think I have this set up 
correctly.  I'm using method=3 which only requires nc and d to be specified.  
Any ideas why I'm not seeing output?
 
Here is the entire output:
 
> ## sshc.ssc: sample size calculation for historical control studies
> ## J. Jack Lee (jj...@mdanderson.org) and Chi-hong Tseng
> ## Department of Biostatistics, Univ. of Texas M.D. Anderson Cancer Center
> ##
> ## 3/1/99
> ## updated 6/7/00: add loess
> ##------------------------------------------------------------------
> ######## Required Input:
> #
> # rc     number of response in historical control group
> # nc     sample size in historical control
> # d      target improvement = Pe - Pc
> # method 1=method based on the randomized design
> #        2=Makuch & Simon method (Makuch RW, Simon RM. Sample size 
> considerations 
> #          for non-randomized comparative studies. J of Chron Dis 1980; 
> 3:175-181.
> #        3=uniform power method
> ######## optional Input:
> #
> # alpha  size of the test
> # power  desired power of the test
> # tol    convergence criterion for methods 1 & 2 in terms of sample size
> # tol1   convergence criterion for method 3 at any given obs Rc in terms of 
> difference
> #          of expected power from target
> # tol2   overall convergence criterion for method 3 as the max absolute 
> deviation
> #          of expected power from target for all Rc
> # cc     range of multiplicative constant applied to the initial values ne
> # l.span smoothing constant for loess
> #
> # Note:  rc is required for methods 1 and 2 but not 3
> #        method 3 return the sample size need for rc=0 to (1-d)*nc
> #
> ######## Output
> # for methdos 1 & 2: return the sample size needed for the experimental group 
> (1 number)
> #                    for given rc, nc, d, alpha, and power
> # for method 3:      return the profile of sample size needed for given nc, 
> d, alpha, and power
> #                    vector $ne contains the sample size corresponding to 
> rc=0, 1, 2, ... nc*(1-d)
> #                    vector $Ep contains the expected power corresponding to 
> #                      the true pc = (0, 1, 2, ..., nc*(1-d)) / nc
> #                                                  
> #------------------------------------------------------------------
> sshc<-function(rc, nc=500, d=.5, method=3, alpha=0.05, power=0.8,
+              tol=0.01, tol1=.0001, tol2=.005, cc=c(.1,2), l.span=.5)
+ {
+ ### for method 1
+ if (method==1) {
+ ne1<-ss.rand(rc,nc,d,alpha=.05,power=.8,tol=.01)
+ return(ne=ne1)
+                }
+ ### for method 2
+ if (method==2) {
+ ne<-nc
+ ne1<-nc+50
+ while(abs(ne-ne1)>tol & ne1<100000){
+ ne<-ne1
+ pe<-d+rc/nc
+ ne1<-nef(rc,nc,pe*ne,ne,alpha,power)
+ ## if(is.na(ne1)) print(paste('rc=',rc,',nc=',nc,',pe=',pe,',ne=',ne))
+ }
+ if (ne1>100000) return(NA)
+ else return(ne=ne1)
+ }
+ ### for method 3
+ if (method==3) {
+ if (tol1 > tol2/10) tol1<-tol2/10
+ ncstar<-(1-d)*nc
+ pc<-(0:ncstar)/nc
+ ne<-rep(NA,ncstar + 1)
+ for (i in (0:ncstar))
+ { ne[i+1]<-ss.rand(i,nc,d,alpha=.05,power=.8,tol=.01)
+ }
+ plot(pc,ne,type='l',ylim=c(0,max(ne)*1.5))
+ ans<-c.searchd(nc, d, ne, alpha, power, cc, tol1)
+ ### check overall absolute deviance
+ old.abs.dev<-sum(abs(ans$Ep-power))
+ ##bad<-0
+ print(round(ans$Ep,4))
+ print(round(ans$ne,2))
+ lines(pc,ans$ne,lty=1,col=8)
+ old.ne<-ans$ne
+ ##while(max(abs(ans$Ep-power))>tol2 & bad==0){  #### unnecessary ##
+ while(max(abs(ans$Ep-power))>tol2){
+ ans<-c.searchd(nc, d, ans$ne, alpha, power, cc, tol1)
+ abs.dev<-sum(abs(ans$Ep-power))
+ print(paste(" old.abs.dev=",old.abs.dev))
+ print(paste("     abs.dev=",abs.dev))
+ ##if (abs.dev > old.abs.dev) { bad<-1}
+ old.abs.dev<-abs.dev
+ print(round(ans$Ep,4))
+ print(round(ans$ne,2))
+ lines(pc,old.ne,lty=1,col=1)
+ lines(pc,ans$ne,lty=1,col=8)
+ ### add convex
+ ans$ne<-convex(pc,ans$ne)$wy
+ ### add loess
+ ###old.ne<-ans$ne
+ loess.ne<-loess(ans$ne ~ pc, span=l.span)
+ lines(pc,loess.ne$fit,lty=1,col=4)
+ old.ne<-loess.ne$fit
+ ###readline()
+ }
+ return(ne=ans$ne, Ep=ans$Ep)
+                }
+ }
> 
> ## needed for method 1
> nef2<-function(rc,nc,re,ne,alpha,power){
+ za<-qnorm(1-alpha)
+ zb<-qnorm(power)
+ xe<-asin(sqrt((re+0.375)/(ne+0.75)))
+ xc<-asin(sqrt((rc+0.375)/(nc+0.75)))
+ ans<- 1/(4*(xc-xe)^2/(za+zb)^2-1/(nc+0.5)) - 0.5
+ return(ans)
+ }
> ## needed for method 2
> nef<-function(rc,nc,re,ne,alpha,power){
+ za<-qnorm(1-alpha)
+ zb<-qnorm(power)
+ xe<-asin(sqrt((re+0.375)/(ne+0.75)))
+ xc<-asin(sqrt((rc+0.375)/(nc+0.75)))
+ ans<-(za*sqrt(1+(ne+0.5)/(nc+0.5))+zb)^2/(2*(xe-xc))^2-0.5
+ return(ans)
+ }
> ## needed for method 3
> c.searchd<-function(nc, d, ne, alpha=0.05, power=0.8, 
> cc=c(0.1,2),tol1=0.0001){
+ #---------------------------
+ # nc     sample size of control group
+ # d      the differece to detect between control and experiment
+ # ne     vector of starting sample size of experiment group 
+ #    corresonding to rc of 0 to nc*(1-d)
+ # alpha  size of test
+ # power  target power
+ # cc  pre-screen vector of constant c, the range should cover the 
+ #    the value of cc that has expected power 
+ # tol1   the allowance between the expceted power and target power
+ #--------------------------- 
+ pc<-(0:((1-d)*nc))/nc
+ ncl<-length(pc)
+ ne.old<-ne
+ ne.old1<-ne.old
+ ### sweeping forward
+ for(i in 1:ncl){
+ cmin<-cc[1]
+ cmax<-cc[2]
+ ### fixed cci<-cmax bug
+ cci <-1
+ lhood<-dbinom((i:ncl)-1,nc,pc[i])
+ ne[i:ncl]<-(1+(cci-1)*(lhood/lhood[1])) * ne.old1[i:ncl]
+ Ep0 <-Epower(nc, d, ne, pc, alpha)
+ while(abs(Ep0[i]-power)>tol1){
+ if(Ep0[i]<power) cmin<-cci
+ else cmax<-cci
+ cci<-(cmax+cmin)/2
+ ne[i:ncl]<-(1+(cci-1)*(lhood/lhood[1])) * ne.old1[i:ncl]
+ Ep0<-Epower(nc, d, ne, pc, alpha)
+ }
+  ne.old1<-ne
+ }
+ ne1<-ne
+ ### sweeping backward -- ncl:i
+ ne.old2<-ne.old
+ ne     <-ne.old
+ for(i in ncl:1){
+ cmin<-cc[1]
+ cmax<-cc[2]
+ ### fixed cci<-cmax bug
+ cci <-1
+ lhood<-dbinom((ncl:i)-1,nc,pc[i])
+ lenl <-length(lhood)
+ ne[ncl:i]<-(1+(cci-1)*(lhood/lhood[lenl]))*ne.old2[ncl:i]
+ Ep0 <-Epower(nc, d, cci*ne, pc, alpha)
+ while(abs(Ep0[i]-power)>tol1){
+ if(Ep0[i]<power) cmin<-cci
+ else cmax<-cci
+ cci<-(cmax+cmin)/2
+ ne[ncl:i]<-(1+(cci-1)*(lhood/lhood[lenl]))*ne.old2[ncl:i]
+ Ep0<-Epower(nc, d, ne, pc, alpha)
+ }
+  ne.old2<-ne
+ }
+ ne2<-ne
+ ne<-(ne1+ne2)/2
+ #cat(ccc*ne)
+ Ep1<-Epower(nc, d, ne, pc, alpha)
+ return(ne=ne, Ep=Ep1)
+ }
> ###
> vertex<-function(x,y)
+ { n<-length(x)
+ vx<-x[1]
+ vy<-y[1]
+ vp<-1
+ up<-T
+ for (i in (2:n))
+ { if (up)
+ { if (y[i-1] > y[i])
+ {vx<-c(vx,x[i-1])
+  vy<-c(vy,y[i-1])
+  vp<-c(vp,i-1)
+  up<-F
+ }
+ }
+ else
+ { if (y[i-1] < y[i]) up<-T
+ }
+ }
+ vx<-c(vx,x[n])
+ vy<-c(vy,y[n])
+ vp<-c(vp,n)
+ return(vx=vx,vy=vy,vp=vp)
+ }
> ###
> convex<-function(x,y)
+ { 
+ n<-length(x)
+ ans<-vertex(x,y)
+ len<-length(ans$vx)
+ while (len>3)
+ { 
+ #cat("x=",x,"\n")
+ #cat("y=",y,"\n")
+ newx<-x[1:(ans$vp[2]-1)]
+ newy<-y[1:(ans$vp[2]-1)]
+ for (i in (2:(len-1)))
+ {
+  newx<-c(newx,x[ans$vp[i]])
+ newy<-c(newy,y[ans$vp[i]])
+ }
+ newx<-c(newx,x[(ans$vp[len-1]+1):n])
+ newy<-c(newy,y[(ans$vp[len-1]+1):n])
+ y<-approx(newx,newy,xout=x)$y
+ #cat("new y=",y,"\n")
+ ans<-vertex(x,y)
+ len<-length(ans$vx)
+ #cat("vx=",ans$vx,"\n")
+ #cat("vy=",ans$vy,"\n")
+ }
+ return(wx=x,wy=y)}
> ###
> Epower<-function(nc, d, ne, pc = (0:((1 - d) * nc))/nc, alpha = 0.05)
+ {
+ #-------------------------------------
+ # nc     sample size in historical control
+ # d      the increase of response rate between historical and experiment
+ # ne     sample size of corresonding rc of 0 to nc*(1-d)
+ # pc     the response rate of control group, where we compute the 
+ #        expected power
+ # alpha  the size of test
+ #-------------------------------------
+ kk <- length(pc)
+ rc <- 0:(nc * (1 - d))
+ pp <- rep(NA, kk)
+ ppp <- rep(NA, kk)
+ for(i in 1:(kk)) {
+ pe <- pc[i] + d
+ lhood <- dbinom(rc, nc, pc[i])
+ pp <- power1.f(rc, nc, ne, pe, alpha)
+ ppp[i] <- sum(pp * lhood)/sum(lhood)
+ }
+ return(ppp)
+ }
> 
> # adapted from the old biss2
> ss.rand<-function(rc,nc,d,alpha=.05,power=.8,tol=.01)
+ {
+ ne<-nc
+ ne1<-nc+50
+ while(abs(ne-ne1)>tol & ne1<100000){
+ ne<-ne1
+ pe<-d+rc/nc
+ ne1<-nef2(rc,nc,pe*ne,ne,alpha,power)
+ 
+ ## if(is.na(ne1)) print(paste('rc=',rc,',nc=',nc,',pe=',pe,',ne=',ne))
+ }
+ if (ne1>100000) return(NA)
+ else return(ne1)
+ }
> ###
> power1.f<-function(rc,nc,ne,pie,alpha=0.05){
+ #-------------------------------------
+ # rcnumber of response in historical control
+ # ncsample size in historical control
+ # ne    sample size in experitment group
+ # pietrue response rate for experiment group
+ # alphasize of the test
+ #-------------------------------------
+ 
+ za<-qnorm(1-alpha)
+ re<-ne*pie
+ xe<-asin(sqrt((re+0.375)/(ne+0.75)))
+ xc<-asin(sqrt((rc+0.375)/(nc+0.75)))
+ ans<-za*sqrt(1+(ne+0.5)/(nc+0.5))-(xe-xc)/sqrt(1/(4*(ne+0.5)))
+ return(1-pnorm(ans))
+ }

        [[alternative HTML version deleted]]

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to