Marker di ciclo per dati di sperimentazione clinica
Soluzione con script e componente aggiuntivo per cicli conici verso il basso
In alcune prove un soggetto riceve una serie di dosi che sono rastremate dal più alto al più basso. A seconda del processo, il soggetto può ricevere più serie di dosi affusolate. L'identificazione o l'etichettatura dei cicli è attualmente un'attività noiosa se eseguita manualmente o un'attività complessa viene eseguita a livello di programmazione. In questo blog descriverò un metodo per aggiungere l'annotazione del marker di ciclo alle tabelle JMP. Questa versione della soluzione è stata scritta per essere robusta in caso di dati mancanti sulla dose e dosi duplicate. La soluzione con script è inclusa in un componente aggiuntivo JMP che fornisce un metodo basato su una finestra di dialogo senza script per l'aggiunta del marcatore di colonna.
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
)
)
)
)