Risikotabelle des KM-Diagramms auf JMP?Könnten Sie gemäß https://community.jmp.com/t5/Discussions/Displaying-at-risk-tables-under-kaplan-meier/mp/55338/highlight/true#M31302 bitte die Methode zum Generieren einer Risikotabelle unter dem KM-Diagramm bereitstellen? Ich habe versucht, dem Skript aus dem Kommentar zu folgen, aber es wurde geschlossen, um gelöst zu werden.
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} ) );
);Die Ausgabe wurde als angehängtes Bild angezeigt. Könnten Sie bitte das Skript korrigieren?
Danke
Datenexploration und -visualisierungBetreff: Risikotabelle des KM-Diagramms in JMP?Ich habe versucht, den Code ein wenig weiter zu parametrisieren. Tut das, was Sie suchen, wenn Sie minT, maxT, stepT, ycol, grouping ändern und Ihre Tabelle verwenden?
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));
);
Bearbeiten: kleine Korrekturen
Betreff: Risikotabelle des KM-Diagramms in JMP?Hallo Jarmo, vielen Dank für deine Hilfe. Es hat funktioniert!
Beste Grüße, Theerachai
Betreff: Risikotabelle des KM-Diagramms in JMP?Hier ist auch ein Skript, das grundsätzlich für den Survivor-Bericht verwendet werden kann. Es könnte in den meisten Fällen funktionieren, aber ich bin mir nicht sicher, ob es das tut, da ich mit dieser JMP-Plattform oder -Analyse nicht so vertraut bin. Ich habe auch die Berechnungen geändert, sodass sie möglicherweise nicht ganz korrekt sind
Zuerst müssen Sie den Überlebendenbericht öffnen

Anschließend können Sie das Skript ausführen. Es fragt Sie dann nach einigen Dingen.

Füllen Sie diese aus und drücken Sie OK

Anschließend wird die Tabelle zu Ihrem vorhandenen Bericht hinzugefügt

Skript unten (und auch angehängt). Verwendung auf eigene Gefahr, die Berechnungen wurden nicht überprüft
Mehr sehen...
/*""" 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();
Betreff: Risikotabelle des KM-Diagramms in JMP?Danke für dieses Skript! Es gefällt mir wirklich gut. Wenn ich mit den unten stehenden Einstellungen („Gruppierung“ und „Nach“ angegeben) mehrere Überlebenskurven gleichzeitig erstelle, wird die Risikotabelle nur zum ersten Diagramm hinzugefügt. Gibt es eine Möglichkeit, sie zu allen hinzuzufügen?

Betreff: Risikotabelle des KM-Diagramms in JMP?Dies sollte möglich sein, erfordert aber Änderungen am Skript. Sie können versuchen, ob diese Version für Sie funktioniert:
Mehr anzeigen...
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();
Ich habe am Ende des Skripts nur wenige Änderungen vorgenommen. Im Wesentlichen habe ich nur eine für jede Schleife hinzugefügt (und einen Variablennamen geändert).
Betreff: Risikotabelle des KM-Diagramms in JMP?Danke für die schnelle Antwort! Ich bekomme trotzdem diese Nachricht?

Betreff: Risikotabelle des KM-Diagramms in JMP?In Zeile 100 fehlt ein s

Ich habe meinen früheren Beitrag bearbeitet, um das Problem zu beheben
Betreff: Risikotabelle des KM-Diagramms in JMP?Nochmals vielen Dank! Jetzt funktioniert es!
Um die Ausgabe zu überprüfen, habe ich einfach eine Referenzzahl neu erstellt (siehe unten JMP vs. Referenz) und dabei ein paar Details bemerkt. Von links beginnend, bei Zeit = 0, ist die gefährdete Zahl 40 korrekt, nachfolgende Zeitpunkte sind jedoch um 1 aufgebläht. Die Ausnahme ist, wenn die wahre Zahl Null ist, was das Skript korrekt auflistet. Schließlich gibt es beim letzten Zeitpunkt eine 1, die nicht da sein sollte. Ich könnte dies in Excel beheben, aber es wäre großartig, wenn es eine Skriptkorrektur gäbe!

Betreff: Risikotabelle des KM-Diagramms in JMP?Ich bin mir nicht sicher, welche Berechnung falsch ist. Wenn es in meinem Skript steht, können Sie es höchstwahrscheinlich irgendwo hier beheben

Ich bräuchte einen Beispieldatensatz mit richtigen Antworten, um zu wissen, wie die Ergebnisse aussehen sollten (die Interpolationsoption in meinem Skript scheint jedoch nicht richtig zu funktionieren).
Betreff: Risikotabelle des KM-Diagramms in JMP?Ich gehe der „überhöhten“ Risikozahl nach. Mithilfe Ihres Skripts (danke!) für den VP-Lungenkrebs-Datensatz erhalte ich zusätzliche Risikozahlen für 400 für die Standardgruppe und 200, 400, 600 und 800 für die Testgruppe.

beim Betrachten der Datentabelle zeigen Werte mit exaktem Zeitpunkt (200 für Standard – erste rosa Zeile) die richtige Risikozahl an. Wenn jedoch keine exakte Übereinstimmung vorliegt (wie etwa 400, 600 und 800), fügt das aktuelle Skript die Zahl vor dem angegebenen Zeitpunkt ein. Es wäre toll, wenn diese Fälle durch Skripting behoben werden könnten.


Betreff: Risikotabelle des KM-Diagramms in JMP?Was soll angezeigt werden, wenn nicht der vorherige Wert?