Salut tout le monde,
J'ai beaucoup de colonnes différentes issues d'une expérience de spectres FTIR, et afin de corriger la ligne de base, je dois effectuer un Fit Spline sur chaque colonne (une colonne = un spectre). J'aimerais le faire automatiquement à l'aide de JSL, afin de ne pas avoir à enregistrer des centaines de « valeurs prédites » à la main.
J'ai essayé de créer un code mais d'une manière ou d'une autre, il ne veut pas enregistrer les valeurs ou mettre 0 dans chaque colonne.
Quelqu'un pourrait-il aider à ce sujet ?
Ci-dessous mon code :
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
Edit 2024-09-24 jthi : ajout du formatage jsl
Cela pourrait donner quelques idées
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;
)
);
Je rassemblerais également tous les ajustements Y par X dans une seule fenêtre afin qu'il soit plus facile de les vérifier au lieu d'ouvrir plusieurs fenêtres distinctes
Cela a fonctionné à merveille, merci beaucoup ! Je me bats depuis des heures avec ChatGPT pour trouver une solution 