Tableau des risques du tracé KM sur JMP ?Selon https://community.jmp.com/t5/Discussions/Displaying-at-risk-tables-under-kaplan-meier/mp/55338/highlight/true#M31302 , pourriez-vous s'il vous plaît fournir la méthode pour générer un risque table sous le tracé KM ? J'ai essayé de suivre le script à partir du commentaire mais il était fermé pour être résolu.
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} ) );
);la sortie est montrée comme image de pièce jointe. Pourriez-vous s'il vous plaît corriger le script ?
Merci
Exploration et visualisation des donnéesRe : Tableau des risques du tracé KM sur JMP ?J'ai essayé de paramétrer le code un peu plus loin, est-ce que cela fait ce que vous recherchez si vous modifiez minT, maxT, stepT, ycol, regroupez et utilisez votre table
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));
);
Edit : petites corrections
Re : Tableau des risques du tracé KM sur JMP ?Bonjour Jarmo, Merci pour votre aide. Ça a marché!
Meilleur, Theerachai
Re : Tableau des risques du tracé KM sur JMP ?Voici également un script qui peut être utilisé essentiellement sur le rapport Survivant. Cela peut fonctionner dans la plupart des cas, mais je ne sais pas si ce sera le cas, car je ne suis pas très familier avec cette plate-forme ou cette analyse JMP. J'ai également modifié les calculs pour qu'ils ne soient peut-être pas tout à fait corrects
Vous devez d’abord ouvrir le rapport de survivant.

alors vous pouvez exécuter le script et il vous demandera quelques choses

Remplissez-les et appuyez sur OK

Il ajoutera ensuite le tableau à votre rapport existant

Script ci-dessous (et également joint). Utilisation à vos risques et périls, les calculs n'ont pas été vérifiés
Voir plus...
/*""" 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();
Ré: Tableau des risques du tracé KM sur JMP ?Merci pour ce script ! Je l'aime vraiment. Lorsque je génère plusieurs courbes de survie à la fois en utilisant la configuration ci-dessous (« Groupage » et « Par » spécifiés), le tableau à risque n'est ajouté qu'au premier graphique. Existe-t-il un moyen de l'ajouter à tous ?

Ré: Tableau des risques du tracé KM sur JMP ?Cela devrait être possible mais nécessitera des modifications du script. Vous pouvez essayer si cette version fonctionne pour vous :
Voir plus...
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();
J'ai seulement apporté quelques modifications à la fin du script, j'en ai simplement ajouté une pour chaque boucle (et changé le nom d'une variable).
Ré: Tableau des risques du tracé KM sur JMP ?Merci pour la réponse rapide ! Je reçois quand même ce message ?

Ré: Tableau des risques du tracé KM sur JMP ?Il manque un s à la ligne 100

J'ai édité mon message précédent pour résoudre le problème
Ré: Tableau des risques du tracé KM sur JMP ?Merci encore ! Ça marche maintenant !
Pour contrôler la qualité de la sortie, j'ai simplement refait une figure de référence (voir ci-dessous JMP vs référence) et j'ai remarqué quelques détails. En partant de la gauche, à l'instant = 0, le nombre à risque, 40, est correct, cependant, les points temporels suivants sont gonflés de 1. L'exception est lorsque le nombre réel est zéro, ce que le script répertorie avec précision. Enfin, il y a un 1 au dernier point temporel, qui ne devrait pas être là. Je pourrais corriger cela dans Excel, mais ce serait génial s'il y avait un correctif de script !

Ré: Tableau des risques du tracé KM sur JMP ?Je ne sais pas quel calcul est incorrect. Si c'est le cas dans mon script, vous pouvez probablement le corriger quelque part ici

J'aurais besoin d'un exemple de jeu de données avec des réponses correctes pour savoir quels devraient être les résultats (l'option d'interpolation dans mon script ne semble cependant pas fonctionner correctement).
Re : Tableau des risques du tracé KM sur JMP ?Suite au chiffre de risque « gonflé ». En utilisant votre script (merci !) sur l'ensemble de données du cancer du poumon VP, j'obtiens un chiffre de risque supplémentaire pour 400 pour le groupe standard et 200, 400, 600, 800 pour le groupe test.

en regardant le tableau de données, les valeurs avec un point temporel exact (200 pour la norme - première ligne rose) affichent le numéro à risque correct, cependant, lorsqu'il n'y a pas de correspondance exacte, comme 400, 600 et 800), le script actuel introduit le numéro avant le point temporel spécifié. ce serait formidable si le script pouvait résoudre ces cas.


Re : Tableau des risques du tracé KM sur JMP ?Que devrait-il afficher si ce n'est pas la valeur précédente ?