Formel zum Finden des Modus der TageswerteHi,
Ich habe eine Datentabelle mit mehreren Proben, die verschiedene Parameter für eine Sammlung verschiedener Systeme innerhalb dieser Proben verfolgen (1 Probe hat 1 System, aber eine andere Probe kann auch dasselbe System haben). Jedes Sample hat einen anderen Zustand, wenn es sich seinem Ende nähert. Diese Zustände versuche ich vorherzusagen. Ich habe einen Entscheidungsbaumalgorithmus mit einigen verschiedenen Beispielen in einer separaten Datentabelle erstellt, die ich dann dieser Datentabelle hinzugefügt habe. Dieser Entscheidungsbaum versucht, den Zustand des Systems zu verschiedenen Zeitpunkten vorherzusagen. Ich werde dann diese vorhergesagten Zustände mit den bekannten Zuständen des Systems zu diesen Zeitpunkten vergleichen (der Algorithmus wurde mit verschiedenen Stichproben erstellt, daher handelt es sich um "frische" Daten).
Wie Sie sich nun vorstellen können, kann diese Formel im Laufe eines Tages Hunderte oder Tausende verschiedener Vorhersagen senden, von denen nicht alle korrekt sind. Daher möchte ich eine Spaltenformel, die alle diese Vorhersagen nach Stichprobennummer und Tag betrachten kann , und geben Sie den am häufigsten vorhergesagten Zustand der Ausrüstung aus (Modus)
Mit anderen Worten, ich hätte gerne eine Spalte, die die Modusalarmbewertung für jeden Tag jeder Stichprobe der Daten berechnet und die vorhergesagte Alarmbewertung für jede dieser Zeilen ausgibt
In der Beispieldatentabelle, die ich angehängt habe, hätte ich gerne eine Formel, die die Spalte mit dem Titel "Alarmvorhersage für den Tag" automatisieren kann, und es macht mir nichts aus, die Spalte "LogTime" oder die Spalte "Zeit seit dem Start" zu verwenden, um ihre täglichen Vorhersagen zu erstellen.
Danke für Ihre Hilfe
Betreff: Formel zum Ermitteln des Modus der TageswerteVielen Dank, ich kämpfe schon seit einiger Zeit damit, herauszufinden, wie ich das machen soll.
Ich werde mehr darüber erfahren, wie es funktioniert, damit ich es für andere Projekte anpassen kann, die ich habe. Ich musste es schon ein bisschen tweeken, um es an meinem Datensatz zum Laufen zu bringen, also fange ich an, es bereits zu verstehen, was gut ist. Aber noch mehr zu lernen
Danke nochmal für deine Hilfe
Betreff: Formel zum Ermitteln des Modus der TageswerteWenn man bedenkt, dass es ziemlich spezifisch für Ihren Fall ist, sollte dies reichen. Sie können „Hilfe > Skripting-Index“ und die Editor-Tooltips verwenden, um zu verstehen, wie es funktioniert.
NamesDefaultToHere(1);
// Starting table
dt = DataTable("Example Datatable for Summarising Alert Ratings.jmp");
// Add required columns
dt << NewColumn("Date", Character, Formula(Short Date( :Logtime )));
dt << NewColumn("Group", Character, Formula((:System || " ") || :Date));
// Find the mode of :Decision Tree Prediction for each level in :Group, and fill in 'modeVals'
vals = Column(dt, "Decision Tree Prediction") << getValues;
gVals = Column(dt, "Group") << getValues;
levs = AssociativeArray(gVals) << getKeys;
modes = J(NItems(levs), 1, .);
modeVals = J(NRow(dt), 1, .);
for(i=1, i<=NItems(levs), i++,
rows = Loc(AsList(gVals), levels[i]);
modes[i] = Mode(vals[rows]);
modeVals[rows] = modes[i];
);
// Build the final column in dt using 'modeVals'
vl = Column(dt, "Decision Tree Prediction") << getProperty("Value Labels");
nc = dt << NewColumn("Modes for Decision Tree Prediction", Numeric, Nominal, Values(modeVals));
nc << valueLabels(Arg(vl, 1));
Betreff: Formel zum Ermitteln des Modus der Tageswerteshortdate* Entschuldigung, kein Shortcode
Betreff: Formel zum Ermitteln des Modus der TageswerteEffektiv sieht die Logik also so aus:
für jede Probe -> Teilen Sie sie in Tage auf (könnte die datetime-Spalte oder die Spalte verwenden, die ich bereits erstellt habe, die für jede Zeile die Anzahl der Tage seit Beginn dieser bestimmten Probe enthält. Ja danke, die Verwendung von Shortcode könnte eine Möglichkeit sein, die Gruppierung von Tagen zu vereinfachen)
Sehen Sie sich dann für jedes Beispiel die Spalte an, die den Alarmzustand vorhersagt, und sehen Sie sich dann für jeden Tag dieses Beispiels jede Vorhersage an, die gemacht wird, und finden Sie den Moduswert dafür (der ordinal ist). Nehmen Sie dann diesen Ausgabemoduswert und fügen Sie ihn für diesen Tag dieses Beispiels wieder in die Datentabelle in jeder Zeile einer neuen Spalte ein (daher wollte ich ihn ursprünglich als Formel). Ich denke, es ist klarer, wenn Sie dies lesen und sich die Datentabelle ansehen
Macht das etwas mehr Sinn?
Betreff: Formel zum Ermitteln des Modus der TageswerteWenn ich das richtig verstehe, möchten Sie eine Gruppe für jeden Wert von „System“ in Kombination mit dem „Datumsteil“ von „Logtime“ definieren (verwenden Sie möglicherweise die Funktion „ShortDate()“, um dies in eine neue Spalte zu bringen).
Wenn das der Fall ist, könnten Sie entweder den obigen Code verallgemeinern, um mit mehr als einer 'by'-Variablen zu arbeiten, oder (vielleicht einfacher) einfach zwei Zeichenspalten miteinander verketten und dies verwenden, um die Gruppen zu definieren. Schließlich müssten Sie, wie Sie betonen, den Code so anpassen, dass er funktioniert, wenn „gVals“ ein Zeichen ist. Vielleicht:
NamesDefaultToHere(1);
ClearLog();
// Given a set of values ('vals') and group membership ('gVals'),
// returns the distinct levels in 'gVals' and the mode of each group
modeWithBy =
Function({vals, gVals}, {Default Local},
levs = AssociativeArray(gVals) << getKeys;
modes = {};
for(i=1, i<=NItems(levs), i++, InsertInto(modes, Mode(vals[Loc(AsList(gVals), levs[i])])));
EvalList({levs, modes});
);
l = [1, 2, 1, 1, 2, 2, 3];
g = {"1", "1", "1", "1", "2", "2", "2"};
Print(modeWithBy(l, g));
Betreff: Formel zum Ermitteln des Modus der Tageswerte
@ian_jmp schrieb:
Wenn beide Spalten numerisch sind, könnten Sie es so machen:
NamesDefaultToHere(1);
ClearLog();
// Given a set of values ('vals') and group membership ('gVals'),
// returns the distinct levels in 'gVals' and the mode of each group
modeWithBy =
Function({vals, gVals}, {Default Local},
levs = AssociativeArray(gVals) << getKeys;
modes = J(NItems(levs), 1, .);
for(i=1, i<=NItems(levs), i++, modes[i] = Mode(vals[Loc(AsList(gVals), levs[i])]));
EvalList({levs, modes});
);
l = [1, 2, 1, 1, 2, 2, 3];
g = [1, 1, 1, 1, 2, 2, 2];
Print(modeWithBy(l, g));
Die Gruppe "Sample" kann kontinuierlich gemacht werden, aber es ist definitiv ein nominaler Datensatz. Die Gruppe System kann ohne die Verwendung von Wertelabels nicht kontinuierlich gemacht werden und ist auch ein nominaler Datensatz. Wie würde dies dann damit zusammenhängen, es zu organisieren, um den Modus über alle Gruppen (System und Probe) zu finden, gefolgt von der Organisation der Daten auf einer täglichen Basis für jede Kombination von ihnen
Außerdem möchte ich, dass diese Werte wieder in die Datentabelle zusammengeführt werden, damit Sie sehen können, was die vorhergesagte Warnung auf einer täglichen Basis ist
Danke für Ihre Hilfe
Betreff: Formel zum Ermitteln des Modus der TageswerteDie Gruppe "Sample" kann kontinuierlich gemacht werden, aber es ist definitiv ein nominaler Datensatz. Die Gruppe System kann ohne die Verwendung von Wertelabels nicht kontinuierlich gemacht werden und ist auch ein nominaler Datensatz. Wie würde dies dann damit zusammenhängen, es zu organisieren, um den Modus über alle Gruppen (System und Probe) zu finden, gefolgt von der Organisation der Daten auf einer täglichen Basis für jede Kombination von ihnen
Außerdem möchte ich, dass diese Werte wieder in die Datentabelle zusammengeführt werden, damit Sie sehen können, was die vorhergesagte Warnung auf einer täglichen Basis ist
Danke für Ihre Hilfe
Betreff: Formel zum Ermitteln des Modus der TageswerteWenn beide Spalten numerisch sind, könnten Sie es so machen:
NamesDefaultToHere(1);
ClearLog();
// Given a set of values ('vals') and group membership ('gVals'),
// returns the distinct levels in 'gVals' and the mode of each group
modeWithBy =
Function({vals, gVals}, {Default Local},
levs = AssociativeArray(gVals) << getKeys;
modes = J(NItems(levs), 1, .);
for(i=1, i<=NItems(levs), i++, modes[i] = Mode(vals[Loc(AsList(gVals), levs[i])]));
EvalList({levs, modes});
);
l = [1, 2, 1, 1, 2, 2, 3];
g = [1, 1, 1, 1, 2, 2, 2];
Print(modeWithBy(l, g));Betreff: Formel zum Ermitteln des Modus der TageswerteUrsprünglich wollte ich eine Formel, aber ich verstehe definitiv Ihren Standpunkt und denke, dass insgesamt die effizientere Lösung definitiv die beste wäre. Also ja, ein Skript wäre wirklich nützlich, danke
Betreff: Formel zum Ermitteln des Modus der TageswerteMuss die Lösung eine Formel sein oder wäre ein Skript akzeptabel, das die Berechnungen durchführt und die Ergebnisse wieder mit der ursprünglichen Tabelle verbindet? Der Grund, warum ich frage, ist, dass ich glaube, dass die Verwendung einer Formel um ein Vielfaches weniger effizient wäre, da jede Zeile replizieren würde.