Tabella dei rischi del grafico KM su JMP?Secondo https://community.jmp.com/t5/Discussions/Displaying-at-risk-tables-under-kaplan-meier/mp/55338/highlight/true#M31302 , potresti fornire il metodo per generare un rischio tabella sotto il grafico KM? Ho provato a seguire lo script dal commento ma era chiuso per essere risolto.
dt = Current Data Table ();
minT = 0;
maxT = 25;
stepT = 1;
Summarize( lv = by( :group) );
obj = Survival(
Y( :time ),
Censor( :"reject"n ),
Grouping( :group ),
Failure Plot( 0 ),
SendToReport(
Dispatch(
{"Survival Plot"},
"1",
ScaleBox,
{Min( 0 ), Max( 25 ), Inc( 1 ), Minor Ticks( 1 )}
),
Dispatch(
{"Survival Plot"},
"time",
TextEditBox,
{Set Text( "Times(years)" )}
)
)
) << report;
obj[List Box( 2 )] << append( Table Box( String Col Box( "No at Risk | Year", lv ) ) );
Tab1 = (obj[lv[1]][Table Box( 1 )] << get);
Tab2 = (obj[lv[2]][Table Box( 1 )] << get);
For( T = minT, T <= maxT, T += stepT,
lp = Max( Loc( Matrix( Tab1 [years] ) <= T ) );
AR1 = Tab1["At Risk"][lp];
lp = Max( Loc( Matrix( Tab2 [years]) <= T ) );
AR2 = Tab2["At Risk"][lp];
obj[List Box( 2 )][Table Box( 1 )] << append( Number Col Box( Char( T ), {AR1, AR2} ) );
);l'uscita è stata mostrata come nell'immagine allegata. Potresti per favore correggere lo script?
Grazie
Esplorazione e visualizzazione dei datiRi: Tabella dei rischi del grafico KM su JMP?Ho tentato di parametrizzare ulteriormente il codice, fa questo quello che stai cercando se cambi minT, maxT, stepT, ycol, raggruppamento e usi la tua tabella
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Rats.jmp");
minT = 100;
maxT = 350;
stepT = 50;
ycol = "days";
grouping = "Group";
Summarize(dt, groups = by(Eval(grouping)));
obj = dt << Survival(
Y(Eval(ycol)),
Censor(:Censor),
Grouping(Eval(grouping)),
Show Points(1),
SendToReport(
Dispatch({"Survival Plot"}, "1", ScaleBox,
{Min(minT), Max(maxT), Inc(stepT), Minor Ticks(1)}
),
)
);
rep = Report(obj);
rep[List Box(2)] << append(tb = Table Box(String Col Box("No at Risk ("||ycol||")", groups)));
rep[List Box(2)] << Append(Spacer Box(Size(0,20)));
tabs = {};
For Each({group}, groups,
Insert Into(tabs, Eval List({rep[OutlineBox(group), Table Box(1)] << get}));
);
For(T = minT, T <= maxT, T += stepT,
ARs = {};
For Each({tab}, tabs,
lp = Max(Loc(Matrix(tab[ycol]) <= T));
Insert Into(ARS, tab["At Risk"][lp])
);
tb << append(Number Col Box(Char(T), ARs));
);
Modifica: piccole correzioni
Ri: Tabella dei rischi del grafico KM su JMP?Ciao Jarmo, grazie per il tuo aiuto. Ha funzionato!
Meglio, Theerachai
Ri: Tabella dei rischi del grafico KM su JMP?Ecco anche uno script che può essere utilizzato fondamentalmente sul rapporto Survivor. Potrebbe funzionare nella maggior parte dei casi, ma non sono sicuro che funzionerà poiché non ho molta familiarità con questa piattaforma o analisi JMP. Ho anche modificato i calcoli in modo che potrebbero non essere esattamente corretti
Per prima cosa devi avere aperto il rapporto sui sopravvissuti

quindi puoi eseguire lo script e ti chiederà alcune cose

Compilarli e premere OK

Aggiungerà quindi la tabella al report esistente

Script qui sotto (e anche allegato). Utilizzare a proprio rischio, i calcoli non sono stati controllati
Visualizza altro...
/*""" Add risk table to Survival platform
Author: jthi
Creation Date: 2024-07-31
Creation JMP Version: JMP Pro 18.0.1
Description: Based on
https://community.jmp.com/t5/Discussions/Displaying-at-risk-tables-under-kaplan-meier/m-p/305898/highlight/true#M56162
Todo:
* Show steps to user before pressing OK
* Remove modal window
* Turn into add-in / proper script
* Add instructions / title to UI
* Add utility modal
"""*/
Names Default To Here(1);
ask_steps = function({}, {Default Local},
nw = New Window("Fill in Time to Event Steps", << Type("Modal Dialog"), << Return Result,
H List Box(
Panel Box("Fill in steps",
Lineup Box(N Col(2),
Text Box("Min Time"),
neb_min = Number Edit Box(.),
Text Box("Max Time"),
neb_max = Number Edit Box(.),
Text Box("Step Time"),
neb_step = Number Edit Box(.),
Text Box("Interpolate last"),
cb_interpolate = Check Box({""}, << Set All(1))
)
),
Spacer Box(Size(20, 0)),
Panel Box("Actions",
Button Box("OK"),
Button Box("Cancel")
)
)
, << Set Window Icon("Survival")
);
If(nw["Button"] != 1,
Throw("Cancelled");
);
min_t = nw["neb_min"];
max_t = nw["neb_max"];
step_t = nw["neb_step"];
If(Any(Is Missing(min_t), Is Missing(max_t), Is Missing(step_t)),
Throw("Steps not filled in");
);
interpolate_last = N Items(nw["cb_interpolate"]);
return(Eval List({min_t, max_t, step_t, interpolate_last}));
);
add_risk_table = function({platform_ref, min_t, max_t, step_t, interpolate_last}, {Default Local},
rep = Report(platform_ref);
dt = platform_ref << Get Data Table;
ycol = ((rep << XPath("//TextBox[text()='Time to event: ']"))[1] << sib) << get text;
grouping_col = ((rep << XPath("//TextBox[text()='Grouped by ']"))[1] << sib) << get text;
Summarize(dt, groups = by(Eval(grouping_col)));
steps = min_t::max_t::step_t;
vals = steps;
For Each({group}, groups,
m_tb = rep[OutlineBox(group), Table Box(1)] << get as matrix;
times = m_tb[0, 1];
atrisk = m_tb[0, N Cols(m_tb)];
cur_steps = Step(steps, times, atrisk); // Last one isn't assumed in this
If(interpolate_last,
If(times[N Rows(times), 1] < max_t & Is Missing(cur_steps[N Cols(cur_steps)]),
cur_steps[N Cols(cur_steps)] = atrisk[N Rows(times), 1];
);
);
vals = vals |/ cur_steps;
);
pb = Panel Box("Risk Table", tb_results = Table Box(
String Col Box(Eval Insert("No at Risk (^ycol^)"), groups),
));
For(i = 1, i <= N Cols(vals), i++,
cur_vals = vals[0, i];
title = Char(Remove From(cur_vals, 1)[1]);
tb_results << Append(Number Col Box(title, cur_vals));
);
rep[List Box(2)] << Append(pb);
rep[List Box(2)] << Append(Spacer Box(Size(0, 10)));
);
cur_rep = Current Report();
If(Is Empty(cur_rep),
Throw("No reports open");
);
ob_ref = cur_rep << XPath("//OutlineBox[@helpKey='Surv']");
If(N Items(ob_ref) == 0,
Throw("No Surv platform found");
);
Try(
{min_t, max_t, step_t, interpolate_last} = ask_steps();
platform_ref = ob_ref[1] << get scriptable object;
add_risk_table(platform_ref, min_t, max_t, step_t, interpolate_last);
,
Throw("Other issues: " || char(exception_msg));
);
Write();
Ri: Tabella dei rischi del grafico KM su JMP?Grazie per questo script! Mi piace molto. Quando genero più curve di sopravvivenza contemporaneamente usando la configurazione sottostante ("Grouping" e "By" specificati), la tabella dei rischi viene aggiunta solo al primo grafico. C'è un modo per aggiungerla a tutti?

Ri: Tabella dei rischi del grafico KM su JMP?Dovrebbe essere possibile, ma richiederà delle modifiche allo script. Puoi provare se questa versione funziona per te:
Vedi altro...
Names Default To Here(1);
ask_steps = function({}, {Default Local},
nw = New Window("Fill in Time to Event Steps", << Type("Modal Dialog"), << Return Result,
H List Box(
Panel Box("Fill in steps",
Lineup Box(N Col(2),
Text Box("Min Time"),
neb_min = Number Edit Box(.),
Text Box("Max Time"),
neb_max = Number Edit Box(.),
Text Box("Step Time"),
neb_step = Number Edit Box(.),
Text Box("Interpolate last"),
cb_interpolate = Check Box({""}, << Set All(1))
)
),
Spacer Box(Size(20, 0)),
Panel Box("Actions",
Button Box("OK"),
Button Box("Cancel")
)
)
, << Set Window Icon("Survival")
);
If(nw["Button"] != 1,
Throw("Cancelled");
);
min_t = nw["neb_min"];
max_t = nw["neb_max"];
step_t = nw["neb_step"];
If(Any(Is Missing(min_t), Is Missing(max_t), Is Missing(step_t)),
Throw("Steps not filled in");
);
interpolate_last = N Items(nw["cb_interpolate"]);
return(Eval List({min_t, max_t, step_t, interpolate_last}));
);
add_risk_table = function({platform_ref, min_t, max_t, step_t, interpolate_last}, {Default Local},
rep = Report(platform_ref);
dt = platform_ref << Get Data Table;
ycol = ((rep << XPath("//TextBox[text()='Time to event: ']"))[1] << sib) << get text;
grouping_col = ((rep << XPath("//TextBox[text()='Grouped by ']"))[1] << sib) << get text;
Summarize(dt, groups = by(Eval(grouping_col)));
steps = min_t::max_t::step_t;
vals = steps;
For Each({group}, groups,
m_tb = rep[OutlineBox(group), Table Box(1)] << get as matrix;
times = m_tb[0, 1];
atrisk = m_tb[0, N Cols(m_tb)];
cur_steps = Step(steps, times, atrisk); // Last one isn't assumed in this
If(interpolate_last,
If(times[N Rows(times), 1] < max_t & Is Missing(cur_steps[N Cols(cur_steps)]),
cur_steps[N Cols(cur_steps)] = atrisk[N Rows(times), 1];
);
);
vals = vals |/ cur_steps;
);
pb = Panel Box("Risk Table", tb_results = Table Box(
String Col Box(Eval Insert("No at Risk (^ycol^)"), groups),
));
For(i = 1, i <= N Cols(vals), i++,
cur_vals = vals[0, i];
title = Char(Remove From(cur_vals, 1)[1]);
tb_results << Append(Number Col Box(title, cur_vals));
);
rep[List Box(2)] << Append(pb);
rep[List Box(2)] << Append(Spacer Box(Size(0, 10)));
);
cur_rep = Current Report();
If(Is Empty(cur_rep),
Throw("No reports open");
);
ob_refs = cur_rep << XPath("//OutlineBox[@helpKey='Surv']");
If(N Items(ob_refs) == 0,
Throw("No Surv platform found");
);
Try(
{min_t, max_t, step_t, interpolate_last} = ask_steps();
For Each({ob_ref}, ob_refs,
platform_ref = ob_ref << get scriptable object;
add_risk_table(platform_ref, min_t, max_t, step_t, interpolate_last);
);
,
Throw("Other issues: " || char(exception_msg));
);
Write();
Ho apportato solo poche modifiche alla fine dello script: in pratica ne ho aggiunta una per ogni ciclo (e ho cambiato il nome di una variabile).
Ri: Tabella dei rischi del grafico KM su JMP?Grazie per la risposta rapida! Ricevo questo messaggio?

Ri: Tabella dei rischi del grafico KM su JMP?Manca una s dalla riga 100

Ho modificato il mio post precedente per risolvere il problema
Ri: Tabella dei rischi del grafico KM su JMP?Grazie ancora! Ora funziona!
Per controllare la qualità dell'output, ho appena rifatto una figura di riferimento (vedi sotto JMP vs riferimento) e ho notato alcuni dettagli. Partendo da sinistra, al tempo = 0, il numero a rischio, 40, è corretto, tuttavia, i punti temporali successivi sono gonfiati di 1. L'eccezione è quando il numero reale è zero, che lo script elenca accuratamente. Infine, c'è un 1 all'ultimo punto temporale, che non dovrebbe esserci. Potrei risolvere questo problema in Excel, ma sarebbe fantastico se ci fosse una correzione di script!

Ri: Tabella dei rischi del grafico KM su JMP?Non sono sicuro di quale calcolo sia sbagliato. Se è nel mio script, puoi probabilmente correggerlo da qualche parte qui

Avrei bisogno di un set di dati di esempio con le risposte corrette per sapere quali dovrebbero essere i risultati (anche se l'opzione di interpolazione nel mio script non sembra funzionare correttamente).
Ri: Tabella dei rischi del grafico KM su JMP?In seguito al numero di rischio "gonfiato". Utilizzando il tuo script (grazie!) sul dataset del cancro al polmone VP, ottengo un numero di rischio aggiuntivo pari a 400 per il gruppo standard e 200, 400, 600, 800 per il gruppo di test.

guardando la tabella dei dati, i valori con il punto temporale esatto (200 per lo standard - prima riga rosa) mostrano un numero di rischio corretto, tuttavia quando non c'è una corrispondenza esatta, come 400, 600 e 800, lo script corrente sta importando il numero prima del punto temporale specificato. Sarebbe fantastico se lo scripting potesse risolvere questi casi.


Ri: Tabella dei rischi del grafico KM su JMP?Cosa dovrebbe visualizzare se non il valore precedente?