Jump to content

Recipe/Example/Rough Oatcakes

From Open Food Facts wiki

Product

OFF: https://world.openfoodfacts.org/product/0061232203072/rough-oatcakes-nairn-s

Ingredients:

Oats (90%), Sunflower Oil, Sustainable Palm Fruit Oil, Sea Salt, Raising Agent: Sodium Bicarbonate

Nutrients:

(17.5, 6.1, 55.8, 0.7, 10.4, 11, 1.46)

Ciqual

Oat, raw (9310) (6.9, 1.22, 55.7, 1.2, 10.6, 16.9, 0.005)
Sunflower oil (17440) (100, 11.1, 0, 0, 0, 0, 0.025)
Palm oil, refined (16150) (100, 49.3, 0, 0, 0, 0, 0.025)
Pure sea salt, no enrichment (11082) (0, 0, 0, 0, 0, 0, 80.5)
Sodium bicarbonate - (not used in estimation)

Estimation

Base estimation

The forced order NNLS estimation gives a deviance of 34.9.

The large deviation seems to be due to a difference between the Ciqual oats and the Product oats. The product oats has less saturated fats and less proteins.

Claude Solver

The Claude Solver gives a better fit than the forced NNLS.

Analysis

Fat, carbs, fibre and protein all fit within 3% — strong results for a 5-ingredient product. Oats drive nearly every nutrient; the two oils split the fat column; sea salt accounts for most of the salt. The baking yield of 93% (S = 107.2g raw per 100g baked) is physically consistent with the 8–10% moisture in dry oat flakes evaporating in the oven.Three nutrients carry large errors, each for a distinct reason: Saturated fat (29% error, fitted 4.33g vs 6.1g declared): the label lists sunflower before palm, so the ordering constraint enforces x(sunflower) ≥ x(palm). At the feasible equal-split optimum (5g each), predicted sat_fat is only 4.33g. Closing the 1.77g gap would require substantially more palm than sunflower — directly contradicting the label order. This error is irreducible given both the declared order and the CIQUAL sat_fat values.

Sugar (153% error, fitted 1.77g vs 0.7g declared): CIQUAL 32140 carries 1.84g sugar per 100g; at 96g oats that predicts 1.77g. The label declares only 0.7g. The CIQUAL average overshoots the natural sugar content of this specific wholegrain variety. No ingredient adjustment can fix a proxy value that is wrong for the actual oat used.

Salt (46% error, fitted 0.79g vs 1.46g declared): sea salt is last in the chain and there is no ordering barrier preventing a larger sel value — 0.83g is well below palm (4.99g). The real constraint is the 90% oats fraction: because x(oats) = 0.90 × S, every gram added to sel also adds 0.90g to oats (via S), which slightly overshoots carbs. The solver trades off salt improvement against carb degradation and settles at sel = 0.83g. Relaxing the oats fraction confidence would push sel toward the physically required ~1.55g, at the cost of a small carbs deviation.

Oat CIQUAL proxy is the limiting factor. Using "Oat, raw" (code 9310, protein 18.1g) gave a 59% protein error. Switching to "Oat flakes, pre-cooked, raw" (code 32140, protein 11.7g) reduced that to 2.7%, demonstrating that the generic CIQUAL oat category is too coarse for this product. A product-specific entry — specifying wholegrain variety, milling method, and moisture content — would further tighten the fit on sugar and salt. The remaining large errors are a direct signal that theoat ingredient on this label is under-specified relative to what the CIQUAL database can resolve.

Recipe report

Graphs