Marqueurs de cycle pour les données d'essais cliniques
Solution scriptée et complément pour les cycles de réduction progressive
Dans certains essais, un sujet reçoit une série de doses qui vont progressivement de haut en bas. Selon l'essai, le sujet peut recevoir plusieurs séries de doses effilées. L'identification ou l'étiquetage des cycles est actuellement une tâche fastidieuse si elle est effectuée manuellement, ou une tâche complexe est effectuée par programme. Dans ce blog, je décrirai une méthode pour ajouter l'annotation de marqueur de cycle aux tables JMP. Cette version de la solution est conçue pour être robuste aux données de dose manquantes et aux doses en double. La solution scriptée est incluse dans un complément JMP qui fournit une méthode basée sur une boîte de dialogue de colonne sans script pour ajouter le marqueur de colonne.
names default to here(1);
dt = Current Data Table();
//dt = Open( "cm Subset for Cycle Marker Script Testing 2.jmp" );
cnames = dt << Get Column Names( String );
cd = Column Dialog(
colid = ColList( "Unique Subject ID", max Col( 1 ) ),
colcmd = ColList( "CM Dose", max Col( 1 ) ),
colseq = ColList( "CM Dose Sequence", max Col( 1 ) ),
Text Box(
"Note: Data will be sorted by USUBJID and CMSEQ.
A Cycle Marker column will be added to the end of the data table."
)
);
Eval( cd[1] );
Eval( cd[2] );
Eval( cd[3] );
Show( colid, colcmd, colseq );
cols = Expr( columns() );
subs = Expr(
subset( all rows, private )
//subset( all rows )
);
Insert Into( cols, colid[1] );
Insert Into( cols, colcmd[1] );
Insert Into( cols, colseq[1] );
Insert Into( subs, Eval Expr( cols ) );
Show( subs );
dt ss = subs;
dt ss so = dtss << Sort(
By( colid[1], colseq[1] ),
Order( Ascending, Ascending ),
Output Table( "Sorted cm" ),private
//Output Table( "Sorted cm" )
);
Close( dtss, nosave ); //don't need dtss anymore
//Technically we don't know the actual names of the columns yet
Eval Expr( colid[1] ) << set name( "USUBJID" );
Eval Expr( colcmd[1] ) << set name( "CMDOSE" );
Eval Expr( colseq[1] ) << set name( "CMSEQ" );
checkunique = Expr(
dtssso << New Column( "UniquieCheck", formula( :USUBJID || " " || Char( :CMSEQ ) ) );
dtssso << New Column( "UC_Count", formula( Col Number( :Name( "UniquieCheck" ), :Name( "UniquieCheck" ) ) ) );
);
makecm = Expr(
dtssso << New Column( "Cycle Marker",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula(
If( Row() == 1,
1,
If( :USUBJID != Lag( :USUBJID, 1 ),
1,
If( Is Missing( :CMDOSE ) == 1,
Lag( :Cycle Marker, 1 ),
If( :CMDOSE <= Lag( :CMDOSE, 1 ) | Is Missing( Lag( :CMDOSE, 1 ) == 1 ),
Lag( :Cycle Marker, 1 ),
Lag( :Cycle Marker, 1 ) + 1
)
)
)
)
),
Set Selected,
Set Display Width( 61 )
)
);
checkunique;
update cm with cycle marker=expr(dt <<
Update(
With( dtssso ),
Match Columns( colid[1] = :USUBJID, colseq[1] = :CMSEQ ),
Add Columns from Update Table( :Cycle Marker )
););
If( Col Maximum( dtssso:UC_Count ) > 1,
error=New Window( "ERROR", Text Box( "Duplicated data detected across uniquie subject ID and CM sequence" ),
buttonbox("Acknowledge", error<<CLOSEWINDOW></CLOSEWINDOW>
If( Row() == 1,
1,
If( :USUBJID != Lag( :USUBJID, 1 ),
1,
If( Is Missing( :CMDOSE ) == 1,
Lag( :Cycle Marker, 1 ),
If( :CMDOSE <= Lag( :CMDOSE, 1 ) | Is Missing( Lag( :CMDOSE, 1 ) == 1 ),
Lag( :Cycle Marker, 1 ),
Lag( :Cycle Marker, 1 ) + 1
)
)
)
)