Batches
A batch groups blanks by solvent/extraction system, e.g. "Hexane Batch 1".
New batch
All batches
Blank library
Upload Solvent / Method / Carryover / Reagent blanks per batch — these form the pool used for blank subtraction.
Upload a blank
Quality is the library-match score (0–100) from NIST search — higher means the compound ID is more certain. Min Area % drops peaks below that share of total ion current, filtering out baseline noise.
What entered the blank pool from this file — expand "Uploaded blanks" below for past uploads (compound counts only; re-download needs the original file since raw peaks aren't stored).
Pool composition
Combined counts per blank type for the selected batch.
Uploaded blanks
Training data
Upload a raw sample — cleaned automatically against the batch's blank pool, then tag its known Class.
Add a sample
RT Tolerance is how close (in minutes) a sample peak's retention time must be to a blank peak to count as a match. Area Ratio Threshold: if sample area ÷ blank area is below this, the peak is purged as background — above it, it's flagged "retained (high area)" for your review.
Preview — this is exactly what gets saved. "Final fingerprint" is what's used downstream; expand for the full blank-match detail and blacklist exclusions.
Training dataset
Every sample used to train models — models always train on ALL batches pooled together; this filter is just for viewing/exporting.
Predict sample
Uses the currently active model + diagnostic ratio. Cleaned the same way as training samples.
Upload a sample
Prediction history
Models
Manually triggered. Re-selects biomarkers, retrains all 5 algorithms, and re-derives the diagnostic ratio from the full training dataset.
Retrain
Biomarker candidates
Training dataset overview
PCA biplot — sample clustering with the compounds driving the separation overlaid as vectors.
PLS-DA observation plot
Supervised projection (uses Class labels) — how separable the classes are once the model is allowed to use them.
Model versions
Nothing auto-activates — pick the best-performing version and activate it yourself.
Diagnostic ratio versions
How this works
The math behind the numbers above, in order of the pipeline.
VIP score (Variable Importance in Projection)
For each compound, VIP measures how much it contributes to the PLS-DA model's ability to separate classes, combining how strongly the compound loads onto each PLS component with how much variance that component explains. VIP ≥ 1 is the standard rule-of-thumb cutoff (a compound contributing "more than average" across all compounds) — it's a candidate filter, not proof of biological relevance on its own.
ANOVA p-value & the "validated" flag
For each VIP ≥ 1 candidate, a one-way ANOVA F-test checks whether that compound's area actually differs across your Class groups (not just within the PLS model's internal math). A compound is marked validated: true only if VIP ≥ 1 and p < 0.05 — meaning both the multivariate model and a simple univariate test agree it separates classes. With small sample counts, ANOVA has low statistical power, so a real biomarker can still fail this test on a small dataset — treat the validated list as a shortlist, not a final answer.
The 5 ML algorithms
SVM (RBF kernel) finds the boundary that maximizes the margin between classes in a transformed feature space — good with clear-margin separation, less interpretable.
Random Forest averages many decision trees, each trained on a random subset of samples/features — robust to noise, gives feature importances "for free".
k-NN (k=5) classifies a sample by majority vote among its 5 nearest neighbours in feature space — simple, but sensitive to feature scaling (we standardize first) and to irrelevant features.
Naive Bayes (Gaussian) assumes each feature is normally distributed within a class and independent of the others, then applies Bayes' rule — fast, works well with small n, but the independence assumption rarely holds exactly for correlated lipid compounds.
ANN (2-layer MLP, 32→16 units) learns a non-linear decision boundary via backpropagation — most flexible, but needs more data to avoid overfitting than the others.
All 5 are evaluated with the same stratified k-fold cross-validation split, so the accuracy/sensitivity/specificity/precision/recall/F1/ROC-AUC columns in the Model versions table are directly comparable across algorithms.
Diagnostic lipid ratio (ROC + Youden index)
Every pair among the validated biomarkers is tried as a ratio (compound A ÷ compound B), scored by how well that single number separates "contains lard" from "does not" using ROC-AUC (area under the true-positive-rate vs false-positive-rate curve — 1.0 is perfect separation, 0.5 is no better than chance). The pair with the best AUC is kept. Its cutoff is the Youden-optimal point (max of true-positive rate − false-positive rate along the ROC curve) — the threshold that best balances catching real lard against false alarms, not necessarily 50/50.
Why are there so many versions, and what do they mean?
Every time you click Retrain now, all 5 algorithms are trained on the full current dataset and each gets its own row — so one retrain = 5 new version rows, all sharing the same version_label (a timestamp). That's what the label groups: "which retrain run did this come from." Comparing rows with the same label tells you which algorithm did best on that exact dataset; comparing rows across different labels tells you whether adding more training data made things better or worse over time. Nothing auto-activates — you choose which single version is "live" for predictions.
Which metric should I look at to pick a version?
Accuracy — overall % correct. Misleading if your classes are imbalanced (e.g. mostly halal samples, few lard).
Sensitivity / Recall — of the samples that truly are a given class, how many did the model catch. For a halal-authentication tool, this matters most for the non-halal class: missing real lard (a false negative) is the costlier mistake.
Specificity — of the samples that truly are NOT a given class, how many did the model correctly rule out. High specificity means fewer false alarms on genuinely halal samples.
Precision — of the samples the model called a given class, how many actually were. Low precision means a lot of "suspicious" flags turn out fine on investigation.
F1 — the balance point between precision and recall, useful as a single number when you don't want to prioritize one over the other.
ROC-AUC — how well the model ranks samples by confidence, independent of any specific cutoff; 1.0 is perfect, 0.5 is random guessing.
Given the domain, a reasonable default is: prioritize sensitivity for the non-halal class first (don't miss real lard), then use accuracy/F1 to break ties among versions that are similarly sensitive.
What actually happens when I "promote" a prediction?
The predicted sample's cleaned compound data gets copied into the training dataset with the Class you confirm (tagged source: promoted so you can tell it apart from directly-added samples). It does not retrain anything automatically — the model stays exactly as it was until you go to Models and click Retrain now again, at which point the promoted sample is included like any other training sample.
Blacklist
Keywords that mark a compound as an artifact — applied automatically during cleaning, on both blanks and samples.