[prev in list] [next in list] [prev in thread] [next in thread]
List: sas-l
Subject: SAS Forum: Clinical trials futility analysis IML/R
From: Roger DeAngelis <rogerjdeangelis () GMAIL ! COM>
Date: 2018-10-30 17:33:21
Message-ID: 6552034933601936.WA.rogerjdeangelisgmail.com () listserv ! uga ! edu
[Download RAW message or body]
SAS Forum: Clinical trials futility analysis IML/R \
\
github \
https://github.com/rogerjdeangelis/utl-clinical-trials-futility-analysis \
\
SAS Forum \
https://tinyurl.com/y9754fqp \
https://communities.sas.com/t5/SAS-Statistical-Procedures/intrim-futility-analysis/m-p/508648 \
\
see package futility documentation \
https://cran.r-project.org/web/packages/futility/futility.pdf \
\
It has been a long time since I did clinical analysis and I am \
out of my comfort zone. I suggest you read the R doc carefully. \
\
There are other 'futility' analysis in R. \
\
\
INPUT \
===== \
\
see \
https://tinyurl.com/y7gec28x \
https://github.com/rogerjdeangelis/utl-clinical-trials-futility-analysis/blob/master/interim.sas7bdat \
\
\
SD1.INTERIM total obs=750 (randomly generated data) \
\
days? last_ \
arm schedule2 entry exit visit_dt event dropout complete \
followup
\
1 0 22 . 47.116 0 0 0 \
1 1 0 20 . 88.215 0 \
0 0 1 1 0 25 . \
54.001 0 0 0 1 1 0 \
31 . 78.615 0 0 0 1 \
1 0 23 . 87.260 0 0 0 \
1
... \
\
OUTPUT \
====== \
\
Output datasets are on my github \
\
https://github.com/rogerjdeangelis/utl-clinical-trials-futility-analysis \
futility.xpt ** output from R \
\
arms.sas7bdat ** futility output \
postrate.sas7bdat \
meta.sas7bdat \
\
SD1.POSTRATES total obs=5 \
------------------------- \
\
event Post Rates by arm \
\
ARMS COMPLETE \
\
ARM1 0.0033548 \
ARM2 0.0025508 \
ARM3 0.0015753 \
ARM4 0.0041515 \
ARM5 0.0024646 \
\
\
SD1.META total obs=1 \
-------------------- \
BetaOverBetaPlusTk TkOverTstar \
NTRIALS N ENROLRATE DROPRATE BETAOVER TKOVERTS RANSEED \
POST
\
5 1500 10 0.028428 0.66716 0.24945 9 \
.
\
SD1.ARMS total obs=7,500 \
------------------------ \
\
ARMS ENTRY EXIT EVENT DROPOUT \
\
ARM1 22 102.000 0 0 \
ARM1 20 100.000 0 0 \
ARM1 25 105.000 0 0 \
.... \
\
ARM5 119.168 199.168 0 0 \
ARM5 119.343 199.343 0 0 \
ARM5 119.430 199.430 0 0 \
\
\
PROCESS \
======= \
\
%utlfkil(d:/xpt/futility.xpt); * for development if you rerun; \
\
%utl_submit_r64(' \
library(futility); \
library(haven); \
library(SASxport); \
interimData<-read_sas("d:/sd1/interim.sas7bdat"); \
interimData$arm <- factor(interimData$arm); \
completeData <- completeTrial.pooledArms(interimData=interimData, nTrials=5, N=1500, \
enrollRatePeriod=24, eventPriorWeight=0.5, eventPriorRate=0.001, fuTime=80, \
visitSchedule=seq(0, 80, by=4), \
visitSchedule2=c(0,seq(from=8,to=80,by=12)), randomSeed=9); \
completeTrial.pooledArms(interimData=interimData, nTrials=5, N=1500, \
enrollRatePeriod=24, eventPriorWeight=0.5, eventPriorRate=0.001, fuTime=80, \
visitSchedule=seq(0, 80, by=4), \
visitSchedule2=c(0,seq(from=8,to=80,by=12)), saveDir="./", randomSeed=9); \
str(completeData); \
arm1<-as.data.frame(completeData$trialData[1]); \
arm2<-as.data.frame(completeData$trialData[2]); \
arm3<-as.data.frame(completeData$trialData[3]); \
arm4<-as.data.frame(completeData$trialData[4]); \
arm5<-as.data.frame(completeData$trialData[5]); \
want<-c(completeData$nTrials); \
meta<-as.data.frame(t(c( \
completeData$nTrials, \
completeData$N, \
completeData$rates$enrollRate, \
completeData$rates$dropRate, \
completeData$BetaOverBetaPlusTk, \
completeData$TkOverTstar, \
completeData$randomSeed, \
completeData$w.post))); \
str(meta); \
colnames(meta)<-c("ntrials","N","nrolRate","dropRate","BetaOver","TkOverTs","ranSeed","post"); \
str(meta); \
postrate<-as.data.frame(completeData$rates$eventPostRate); \
write.xport(arm1,arm2,arm3,arm4,arm5,postrate,meta,file="d:/xpt/futility.xpt"); \
'); \
\
libname xpt xport "d:/xpt/futility.xpt"; \
libname sd1 "d:/sd1"; \
\
data sd1.arms(drop=arm) ; \
retain arm 0 arms; \
set xpt.arm1 xpt.arm2 xpt.arm3 xpt.arm4 xpt.arm5 open=defer; \
if mod(_n_-1,1500)=0 then do; \
arm=arm+1; \
arms=cats("ARM",arm); \
end; \
run;quit; \
\
data sd1.meta; \
set xpt.meta; \
run;quit; \
\
data sd1.postrates; \
retain arms; \
set xpt.postrate; \
arms=cats("arm",_n_); \
run;quit; \
\
\
LOG \
=== \
\
List of 8 \
$ trialData :List of 5 \
..$ :'data.frame': 1500 obs. of 4 variables: \
.. ..$ entry : num [1:1500] 22 20 25 31 23 18 24 21 24 39 ... \
.. ..$ exit : num [1:1500] 102 100 105 111 103 98 104 101 104 119 ... \
.. ..$ event : int [1:1500] 0 0 0 0 0 0 0 0 0 0 ... \
.. ..$ dropout: int [1:1500] 0 0 0 0 0 0 0 0 0 0 ... \
..$ :'data.frame': 1500 obs. of 4 variables: \
.. ..$ entry : num [1:1500] 22 20 25 31 23 18 24 21 24 39 ... \
.. ..$ exit : num [1:1500] 102 100 105 111 103 98 104 101 104 119 ... \
.. ..$ event : int [1:1500] 0 0 0 0 0 0 0 0 0 0 ... \
.. ..$ dropout: int [1:1500] 0 0 0 0 0 0 0 0 0 0 ... \
..$ :'data.frame': 1500 obs. of 4 variables: \
.. ..$ entry : num [1:1500] 22 20 25 31 23 18 24 21 24 39 ... \
.. ..$ exit : num [1:1500] 102 100 105 111 103 98 104 101 104 119 ... \
.. ..$ event : int [1:1500] 0 0 0 0 0 0 0 0 0 0 ... \
.. ..$ dropout: int [1:1500] 0 0 0 0 0 0 0 0 0 0 ... \
..$ :'data.frame': 1500 obs. of 4 variables: \
.. ..$ entry : num [1:1500] 22 20 25 31 23 18 24 21 24 39 ... \
.. ..$ exit : num [1:1500] 102 100 105 111 103 98 104 101 104 119 ... \
.. ..$ event : int [1:1500] 0 0 0 0 0 0 0 0 0 0 ... \
.. ..$ dropout: int [1:1500] 0 0 0 0 0 0 0 0 0 0 ... \
..$ :'data.frame': 1500 obs. of 4 variables: \
.. ..$ entry : num [1:1500] 22 20 25 31 23 18 24 21 24 39 ... \
.. ..$ exit : num [1:1500] 102 100 105 111 103 98 104 101 104 119 ... \
.. ..$ event : int [1:1500] 0 0 0 0 0 0 0 0 0 0 ... \
.. ..$ dropout: int [1:1500] 0 0 0 0 0 0 0 0 0 0 ... \
$ nTrials : num 5 \
$ N : num 1500 \
$ rates :List of 3 \
..$ enrollRate : num 10 \
..$ dropRate : num 0.0284 \
..$ eventPostRate: num [1:5] 0.00335 0.00255 0.00158 0.00415 0.00246 \
$ BetaOverBetaPlusTk: num 0.667 \
$ TkOverTstar : num 0.249 \
$ randomSeed : num 9 \
$ w.post : logi NA \
'data.frame': 1 obs. of 8 variables: \
$ V1: num 5 \
$ V2: num 1500 \
$ V3: num 10 \
$ V4: num 0.0284 \
$ V5: num 0.667 \
$ V6: num 0.249 \
$ V7: num 9 \
$ V8: num NA \
'data.frame': 1 obs. of 8 variables: \
$ ntrials : num 5 \
$ N : num 1500 \
$ nrolRate: num 10 \
$ dropRate: num 0.0284 \
$ BetaOver: num 0.667 \
$ TkOverTs: num 0.249 \
$ ranSeed : num 9 \
$ post : num NA \
> \
\
\
* _ _ _ \
_ __ ___ __ _| | _____ __| | __ _| |_ __ _ \
| '_ ` _ \ / _` | |/ / _ \ / _` |/ _` | __/ _` | \
| | | | | | (_| | < __/ | (_| | (_| | || (_| | \
|_| |_| |_|\__,_|_|\_\___| \__,_|\__,_|\__\__,_| \
\
; \
\
https://tinyurl.com/y7gec28x \
https://github.com/rogerjdeangelis/utl-clinical-trials-futility-analysis/blob/master/interim.sas7bdat \
\
\
\
\
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic