Fórmula para encontrar el modo de valores diarios.Hola,
Tengo una base de datos que tiene varias muestras que siguen diferentes parámetros para una colección de diferentes sistemas dentro de esas muestras (1 muestra tendrá 1 sistema, pero otra muestra también puede tener el mismo sistema). Cada muestra tiene un estado diferente a medida que se acerca a su final. Estos estados son lo que estoy tratando de predecir. He creado un algoritmo de árbol de decisión utilizando algunas muestras diferentes en una base de datos separada que luego agregué a esta datable. Lo que este árbol de decisiones está tratando de hacer es predecir el estado del sistema en diferentes momentos. Luego mediré estos estados predichos en comparación con los estados conocidos del sistema en estos puntos en el tiempo (el algoritmo se creó con diferentes muestras, por lo que se trata de datos "nuevos")
Ahora, como puede imaginar durante el transcurso del día, esta fórmula puede enviar cientos o miles de predicciones diferentes y no todas son correctas, así que quiero una fórmula de columna que pueda ver todas estas predicciones, por número de muestra y por día. , y mostrar cuál es el estado predicho más comúnmente del equipo (Modo)
En otras palabras, me gustaría una columna que calcula la clasificación de alerta de modo para cada día de cada muestra de los datos y la salida de predicción que se pronostica para cada una de estas filas
En el ejemplo de datos que adjunto, me gustaría una fórmula que pueda automatizar la columna titulada "Alert Prediction for the day" y no me importa usar la columna LogTime o el tiempo transcurrido desde el inicio para crear sus predicciones diarias.
Gracias por tu ayuda
Re: Formula para encontrar el modo de valores diarios.Muchas gracias, he estado luchando para averiguar cómo hacer esto por un tiempo ahora.
Aprenderé más sobre cómo funciona para poder adaptarlo a otros proyectos que tengo. Tuve que ajustarlo un poco para que funcionara en mi conjunto de datos, así que ya lo entiendo, lo que es bueno. Pero aún hay más que aprender.
De nuevo, gracias por tu ayuda
Re: Formula para encontrar el modo de valores diarios.Teniendo en cuenta que es más bien específico para su caso, debería hacerlo. Puede usar 'Ayuda> Índice de secuencias de comandos' y la información sobre herramientas del editor para ayudar a entender cómo funciona.
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));
Re: Formula para encontrar el modo de valores diarios.shortdate * lo siento, no shortcode
Re: Formula para encontrar el modo de valores diarios.Así que efectivamente la lógica se ve así:
para cada muestra -> Divídalos en días (podría usar la columna datetime o la columna que ya he creado, que tiene para cada fila el número de días desde el inicio de esta muestra en particular. Sí, gracias, el uso de shortcode podría ser una manera de facilitar la agrupación de días)
Luego, para cada muestra, mire la columna que predice el estado de Alerta y luego, para cada día de esa muestra, mire cada predicción que se haga y encuentre el valor de modo para ella (que es ordinal). Luego tome ese valor de modo de salida y vuelva a insertarlo en la tabla de datos en cada fila de una nueva columna (de ahí el motivo por el que originalmente la quise como una fórmula) para ese día de esa muestra. Creo que es más claro cuando lees esto mirando el datatable
¿Eso ayuda a tener un poco más de sentido?
Re: Formula para encontrar el modo de valores diarios.Si entiendo correctamente, desea definir un grupo para cada valor de 'Sistema' combinado con la 'parte de la fecha' de 'Tiempo de registro' (tal vez use la función 'Fecha corta ()' para incluir esto en una nueva columna).
Si ese es el caso, puede generalizar el código anterior para trabajar con más de una variable 'by', de lo contrario (quizás más simple) simplemente concatene dos columnas de caracteres y use esto para definir los grupos. Finalmente, como usted señala, necesitará adaptar el código para que funcione cuando 'gVals' es el carácter. Tal vez:
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));
Re: Formula para encontrar el modo de valores diarios.
@ian_jmp escribió:
Si ambas columnas son numéricas, podrías hacerlo de esta manera:
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));
Se puede hacer que el grupo "Muestra" sea continuo, pero definitivamente es un conjunto de datos nominales. El sistema de grupo no puede hacerse continuo sin usar etiquetas de valor y también es un conjunto de datos nominales. ¿Cómo se relacionaría esto con la organización para encontrar el modo en todos los grupos (Sistema y Muestra) seguido de la organización de los datos en una base diaria para cada combinación de ellos? También me gustaría que estos valores se vuelvan a combinar en la tabla de datos para que pueda ver en qué se basa la alerta prevista día a día. Gracias por tu ayuda
Re: Formula para encontrar el modo de valores diarios.Se puede hacer que el grupo "Muestra" sea continuo, pero definitivamente es un conjunto de datos nominales. El sistema de grupo no puede hacerse continuo sin usar etiquetas de valor y también es un conjunto de datos nominales. ¿Cómo se relacionaría esto con la organización para encontrar el modo en todos los grupos (Sistema y Muestra) seguido de la organización de los datos en una base diaria para cada combinación de ellos?
También me gustaría que estos valores se vuelvan a combinar en la tabla de datos para que pueda ver en qué se basa la alerta prevista día a día.
Gracias por tu ayuda
Re: Formula para encontrar el modo de valores diarios.Si ambas columnas son numéricas, podrías hacerlo de esta manera:
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));Re: Formula para encontrar el modo de valores diarios.Originalmente buscaba una fórmula, pero definitivamente veo su punto de vista y creo que, en general, la solución más eficiente sería la mejor. Así que sí, un script sería muy útil gracias.
Re: Formula para encontrar el modo de valores diarios.¿La solución tiene que ser una fórmula o sería aceptable una secuencia de comandos que haga los cálculos y combine los resultados con la tabla original? La razón por la que pregunto es que creo que usar una fórmula sería mucho menos eficiente debido a todo el trabajo de réplica que estaría haciendo cada fila.