Hola a todos,
Tengo muchas columnas diferentes de un experimento de espectros FTIR y, para corregir la línea base, necesito realizar un ajuste de spline en cada columna (una columna = un espectro). Me gustaría hacer esto automáticamente usando JSL, para no tener que guardar cientos de "valores predichos" a mano.
Intenté crear un código pero de alguna manera no quiere guardar los valores ni poner 0 en cada columna.
¿Alguien podría ayudarme con eso?
A continuación se muestra mi código:
dt = Current Data Table();
// Define the columns for the fit (assuming multiple Y columns and one X column)
x_col = Column("Wavenumber"); // Replace with the name of your X column
y_cols = {};
For(i = 1, i <= N Col(dt), i++,
col_name = Column(i) << Get Name;
// Check if the column name contains "Absorbance at t="
If(Contains(col_name, "Absorbance at t="),
Insert Into(y_cols, col_name); // Add to the list
);
);
// Create a list to store fit reports
fit_reports = {};
// Perform Fit Y by X for each Y column separately and display the fit
For(i = 1, i <= N Items(y_cols), i++,
y_col = y_cols[i];
fit_report = dt << Fit Y by X(
Y(Column(y_col)),
X(x_col),
Fit Spline(1000) // Adjust the lambda (smoothing parameter) as needed
);
Insert Into(fit_reports, fit_report);
);
Show(
"All fits have been displayed. Please review them and adjust the lambda value in the script if needed."
);
// Wait for user to review fits
Wait(0);
// Use a Yes/No dialog to prompt the user to continue or stop
result = New Window("Save Predicted Values?",
Text Box("Are you satisfied with the fits? Click Yes to save predicted values, No to stop."),
Button Box("Yes",
// Save predicted values as columns in the dataset
For(i = 1, i <= N Items(y_cols), i++,
y_col = y_cols[i];
fit_report = fit_reports[i];
predicted_col_name = "Spline Predictor for " || y_col;
dt << New Column(predicted_col_name, Numeric);
Column(predicted_col_name) << Set Values(fit_report["Prediction Formula"]);
);
Show("Predicted values saved successfully.");
),
Button Box("No",
Show("Predicted values were not saved.");
)
);
// Close all fit reports
For(i = 1, i <= N Items(fit_reports), i++,
Close(fit_reports[i], No Save);
);
Close(result); // Close the dialog window
Editar 2024-09-24 jthi: se agregó formato jsl
Esto podría dar algunas ideas.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Semiconductor Capability.jmp");
xcol = "NPN1";
ycols = {"PNP1", "NPN2"};
fits = {};
For Each({ycol}, ycols,
Insert Into(fits,
dt << Fit Y by X(
Y(Eval(ycol)),
X(Eval(xcol)),
Fit Spline(1000)
);
);
);
close_expr = Expr(
For Each({fit}, fits,
fit << close window;
);
nw << Close Window;
);
nw = New Window("Save Predicted Values?",
Text Box("Are you satisfied with the fits? Click Yes to save predicted values, No to stop."),
Button Box("Yes",
For Each({fit}, fits,
fit << (Curve["Smoothing Spline Fit, lambda=1000"] << Save Predicteds);
);
wait(0);
close_expr;
Show("Predicted values saved successfully.");
),
Button Box("No",
Show("Predicted values were not saved.");
close_expr;
)
);
También recopilaría todos los ajustes Y por X en una sola ventana para que sea más fácil verificarlos en lugar de abrir varias ventanas separadas.
Funcionó de maravilla, ¡muchas gracias! He estado luchando con ChatGPT para encontrar una solución durante horas. 