Passa al contenuto principale

VitaScore GFM

Il Gap Filling Module VitaScore calcola gli impatti sulla salute umana dei prodotti alimentari basati sui fattori di rischio dietetici dello studio Global Burden of Disease (GBD). Converte la composizione alimentare in Disability-Adjusted Life Years (DALY), consentendo confronti dell'impatto sulla salute insieme alle metriche ambientali.

Riferimento Rapido

ProprietaDescrizione
Eseguito suFoodProductFlowNode
DipendenzeAggregationGapFillingWorker, DailyFoodUnitGapFillingWorker
Input ChiaveQuantita delle categorie alimentari, valori nutrizionali, unita alimentare giornaliera
OutputVitaScore in DALY per fattore di rischio dietetico
TriggerIl prodotto ha categorie alimentari aggregate e unita alimentare giornaliera

Quando Viene Eseguito

Il modulo si attiva quando:

  1. L'aggregazione delle categorie alimentari e completa
  2. Il calcolo della Daily Food Unit (DFU) e completo
  3. Il nodo ha dati amount_per_category_in_flow validi
  4. Il nodo ha un valore daily_food_unit valido

Output Chiave

Il modulo produce:

  • VitaScore Totale: Impatto sulla salute aggregato in DALY
  • Punteggi per fattore: Contributi DALY individuali da ogni fattore di rischio dietetico
  • Versioni correnti e legacy: Due metodi di calcolo per confronto

Metodologia Scientifica

Il VitaScore quantifica l'impatto sulla salute del consumo alimentare usando Disability-Adjusted Life Years (DALY) basati sullo studio Global Burden of Disease. Un DALY rappresenta la perdita di un anno di piena salute.

Framework Global Burden of Disease

Lo studio GBD identifica fattori di rischio dietetici che contribuiscono al carico di malattia. Il VitaScore utilizza 13 fattori di rischio raggruppati in due categorie:

Fattori di Rischio Positivi (un consumo maggiore e benefico):

  • Dieta povera di frutta
  • Dieta povera di verdura
  • Dieta povera di cereali integrali
  • Dieta povera di noci e semi
  • Dieta povera di latte

Fattori di Rischio Negativi (un consumo maggiore e dannoso):

  • Dieta ricca di sodio
  • Dieta ricca di carne lavorata
  • Dieta ricca di carne rossa
  • Dieta ricca di energia
  • Dieta ricca di grassi
  • Dieta povera di grassi
  • Dieta ricca di proteine
  • Dieta povera di proteine

Livello di Esposizione al Rischio Minimo Teorico (TMREL)

Ogni fattore di rischio dietetico ha un intervallo di consumo ottimale chiamato TMREL - il livello di esposizione che minimizza il rischio per la salute. Il VitaScore calcola quanto il consumo effettivo devia da questo intervallo ottimale.

Il TMREL e definito da due limiti:

  • t_1: Limite inferiore dell'intervallo ottimale
  • t_2: Limite superiore dell'intervallo ottimale

La Formula VitaScore

La formula base calcola una frazione di rischio (f_r) per ogni fattore di rischio dietetico, poi moltiplica per il carico DALY associato:

Per fattori positivi (dove consumare di piu e meglio):

f_r = (t_2 / (t_2 - t_1)) - x_r / (scaling * (t_2 - t_1))

Per fattori negativi (dove consumare di meno e meglio):

f_r = x_r / (scaling * (t_2 - t_1)) - (t_1 / (t_2 - t_1))

Dove:

  • x_r: Quantita del fattore di rischio nel prodotto alimentare
  • t_1, t_2: Limiti inferiore e superiore del TMREL
  • scaling: Fattore di normalizzazione (vedi sotto)
  • f_r: Frazione di rischio (limitata all'intervallo 0-1)

Calcolo finale:

VitaScore[r] = DALY_r * f_r
VitaScore Totale = somma(VitaScore[r] per tutti i fattori di rischio)

Metodi di Normalizzazione

Il VitaScore supporta tre metodi di normalizzazione per diversi fattori di rischio:

MetodoDescrizioneUtilizzo
per_dfuScala per Daily Food UnitLa maggior parte dei fattori di rischio (frutta, verdura, carne, ecc.)
per_total_energyScala per contenuto energetico totaleGrassi e proteine come percentuale delle calorie
per_selfNessuna scala (fattore = 1,0)Misurazioni dirette

Daily Food Unit (DFU)

La Daily Food Unit rappresenta la quantita tipica di consumo giornaliero di una categoria alimentare. Normalizza il calcolo in modo che l'impatto sulla salute di un alimento sia proporzionale a quanto della dieta giornaliera rappresenta.


Dettagli di Implementazione

Fattori di Rischio Dietetici Coperti

Il modulo calcola gli impatti sulla salute per 13 fattori di rischio dietetici. Ogni fattore ha un Livello di Esposizione al Rischio Minimo Teorico (TMREL) che definisce l'intervallo di consumo ottimale.

Fattori di Rischio Positivi (Un Consumo Maggiore e Benefico)

Fattore di RischioTMREL InferioreTMREL SuperioreUnitaNormalizzazioneDALYRiferimento Linee Guida Dietetiche
Dieta povera di frutta200300g/giornoper_dfu61,24L'OMS raccomanda almeno 400 g/giorno di frutta e verdura combinate1
Dieta povera di verdura340500g/giornoper_dfu30,57L'OMS raccomanda almeno 400 g/giorno di frutta e verdura combinate1
Dieta povera di cereali integrali100150g/giornoper_dfu82,86Linee guida statunitensi: 3-4 porzioni/giorno (circa 48-64 g)2
Dieta povera di noci e semi1625g/giornoper_dfu13,98EAT-Lancet: circa 50 g/giorno di noci3
Dieta povera di latte350520g/giornoper_dfu9,422-3 porzioni di latticini/giorno (circa 400-600 ml)4

Fattori di Rischio Negativi (Un Consumo Maggiore e Dannoso)

Fattore di RischioTMREL InferioreTMREL SuperioreUnitaNormalizzazioneDALYRiferimento Linee Guida Dietetiche
Dieta ricca di sodio (sale)15g/giornoper_dfu29,43L'OMS raccomanda meno di 5 g di sale/giorno (meno di 2 g di sodio)5
Dieta ricca di carne lavorata04g/giornoper_dfu96,94EAT-Lancet: evitare o minimizzare la carne lavorata3
Dieta ricca di carne rossa1827g/giornoper_dfu74,25EAT-Lancet: circa 14 g/giorno (circa 100 g/settimana)3

Fattori di Rischio Macronutrienti (Energia e Percentuale dell'Energia Totale)

Fattore di RischioTMREL InferioreTMREL SuperioreUnitaNormalizzazioneDALYRiferimento Linee Guida Dietetiche
Dieta ricca di energia6501250kcalper_self88,66Un pasto equilibrato: 450-850 kcal (circa 1/3 di 2200 kcal/giorno)4
Dieta ricca di grassi27,5%50%% delle kcalper_total_energy88,66Linee guida EFSA/USA: 20-35% dell'energia dai grassi46
Dieta povera di grassi5%27,5%% delle kcalper_total_energy88,66Linee guida EFSA/USA: 20-35% dell'energia dai grassi46
Dieta ricca di proteine22,5%60%% delle kcalper_total_energy88,66AMDR statunitense: 10-35% dell'energia dalle proteine6
Dieta povera di proteine0%22,5%% delle kcalper_total_energy88,66AMDR statunitense: 10-35% dell'energia dalle proteine6

I valori DALY sono espressi come DALY per 100.000 persone-anno e rappresentano il carico di malattia attribuibile a ogni fattore di rischio dietetico.

Conversione da Sodio a Sale

Poiche le linee guida dietetiche spesso si riferiscono al sale (cloruro di sodio) piuttosto che al sodio, il modulo converte i valori di sodio:

# Il sodio e circa il 39,3% del sale in massa
NA_PERCENT_IN_NACL = 39.337 # %

# Converti sodio in equivalente sale
salt_quantity = sodium_quantity * (100 / NA_PERCENT_IN_NACL)

Conversione Energetica dei Macronutrienti

Grassi e proteine sono convertiti da massa a energia per i calcoli di percentuale delle calorie:

FAT_CALORIES_PER_GRAM = 9.0      # kcal/g
PROTEIN_CALORIES_PER_GRAM = 4.0 # kcal/g

fat_kcal = fat_grams * FAT_CALORIES_PER_GRAM
protein_kcal = protein_grams * PROTEIN_CALORIES_PER_GRAM

Supporto Versioni

Il modulo mantiene due versioni di calcolo:

VersioneDescrizione
currentUltimi valori DALY GBD 2021
legacyValori DALY originali per retrocompatibilita

Entrambe le versioni sono calcolate e memorizzate, consentendo il confronto dei risultati tra aggiornamenti metodologici.


Riferimento Codice Completo

Flusso di Calcolo Principale

async def run(self, calc_graph: CalcGraph) -> None:
"""Perform vitascore calculation."""
# Ottieni categorie alimentari aggregate e unita alimentare giornaliera
amount_per_category_in_flow_prop = self.node.amount_per_category_in_flow
dfu_prop = self.node.daily_food_unit

# Aggiungi sale e fattori di rischio derivati dalla nutrizione
salt_qty, energy_qty, fat_qty, protein_qty = (
self.retrieve_salt_and_nutrition_amounts_for_activity_production_amount()
)

# Calcola vitascore per entrambe le versioni
for version in (VitascoreVersionEnum.legacy, VitascoreVersionEnum.current):
vitascore_for_local = self.compute_vitascore(
amount_per_category_in_flow_prop,
dfu_prop,
version,
ReferenceAmountEnum.amount_for_activity_production_amount,
)
# ... memorizza risultati

Implementazione della Formula VitaScore Base

def vitascore_formula(
self,
food_category: QuantityPackageProp,
dfu: float,
legacy_or_current: str,
for_reference_amount: ReferenceAmountEnum,
) -> dict[UuidStr, ReferencelessQuantityProp]:
"""Formula for computing vitascore."""
vitascore = {
self.gfm_factory.vitascore_term.uid: ReferencelessQuantityProp(
value=0.0, unit_term_uid=self.gfm_factory.daly_unit_term.uid
)
}

for idx, term in enumerate(
self.gfm_factory.positive_terms + self.gfm_factory.negative_terms
):
if term.xid in self.gfm_factory.used_categories_xid:
# Ottieni limiti TMREL dai dati del termine
t_1 = float(term.data.get("tmrel").get("lower"))
t_2 = float(term.data.get("tmrel").get("upper"))
normalization = TmrelNormalizationEnum(
term.data.get("tmrel").get("tmrel_normalization")
)

# Ottieni quantita dalle categorie alimentari
if term.uid in amount_per_category_in_flow_present:
x_r = float(amount_per_category_in_flow_present[term.uid].value)
else:
x_r = 0.0

# Ottieni carico DALY per questo fattore di rischio
daly_r = float(term.data.get(legacy_or_current).get("amount"))

# Determina fattore di scala
if normalization == TmrelNormalizationEnum.per_dfu:
scaling = dfu
elif normalization == TmrelNormalizationEnum.per_total_energy:
scaling = energy_kcal_value
elif normalization == TmrelNormalizationEnum.per_self:
scaling = 1.0

# Calcola frazione di rischio
if scaling <= 0.0:
f_r = 0.0
else:
if idx < len(self.gfm_factory.positive_terms):
# Fattori positivi: di piu e meglio
f_r = (t_2 / (t_2 - t_1)) - x_r / (scaling * (t_2 - t_1))
else:
# Fattori negativi: di meno e meglio
f_r = x_r / (scaling * (t_2 - t_1)) - (t_1 / (t_2 - t_1))

# Limita frazione di rischio a [0, 1]
f_r = max(0, min(1, f_r))

# Calcola e accumula vitascore
vitascore[term.uid] = ReferencelessQuantityProp(
value=daly_r * f_r,
unit_term_uid=self.gfm_factory.daly_unit_term.uid
)
vitascore[self.gfm_factory.vitascore_term.uid].value += daly_r * f_r

return vitascore

Recupero Sale e Nutrizione

def retrieve_salt_and_nutrition_amounts_for_activity_production_amount(
self,
) -> Tuple[Optional[ReferencelessQuantityProp], ...]:
"""Extract salt and macronutrient quantities from nutrition data."""

# Controlla prima i nutrienti aggregati, poi i valori nutrizionali
if aggregated_nutrients := self.node.aggregated_nutrients:
nutrition_pkg = aggregated_nutrients.amount_for_activity_production_amount()
elif nutrient_values := self.node.nutrient_values:
nutrition_pkg = nutrient_values.amount_for_activity_production_amount()

# Gestisci la suddivisione del cloruro di sodio
if nutrition_pkg and (sodium_chloride_term.uid in nutrition_pkg.quantities):
nutrition_pkg = split_sodium_chloride(nutrition_pkg)

# Converti sodio in sale
if sodium_term.uid in nutrition_pkg.quantities:
salt_qty = nutrition_pkg.quantities[sodium_term.uid].duplicate()
salt_qty.value *= 100 / NA_PERCENT_IN_NACL

# Ottieni energia e converti grassi/proteine in kcal
energy_kcal_qty = nutrition_pkg.quantities.get(energy_term.uid)

if fat_mass_qty := nutrition_pkg.quantities.get(fat_term.uid):
fat_in_grams = convert_to_grams(fat_mass_qty)
fat_qty = ReferencelessQuantityProp(
value=fat_in_grams * FAT_CALORIES_PER_GRAM,
unit_term_uid=kcal_term.uid
)

if protein_mass_qty := nutrition_pkg.quantities.get(protein_term.uid):
protein_in_grams = convert_to_grams(protein_mass_qty)
protein_qty = ReferencelessQuantityProp(
value=protein_in_grams * PROTEIN_CALORIES_PER_GRAM,
unit_term_uid=kcal_term.uid
)

return salt_qty, energy_kcal_qty, fat_qty, protein_qty

Esempio di Calcolo

Scenario: Calcolare il VitaScore per 100g di prosciutto cotto

Passo 1: Identificare le Quantita dei Fattori di Rischio

Dall'aggregazione delle categorie alimentari:

  • Carne lavorata: 100g
  • Carne rossa: 0g (contata separatamente dalla lavorata)
  • Frutta: 0g
  • Verdura: 0g

Dai valori nutrizionali:

  • Sodio: 1200mg (convertito in 3050mg di sale)
  • Energia: 145 kcal
  • Grassi: 8g (72 kcal)
  • Proteine: 18g (72 kcal)

Passo 2: Calcolare le Frazioni di Rischio

Dieta ricca di carne lavorata (fattore negativo):

  • TMREL: 0-0g al giorno (l'ottimale e zero consumo)
  • Scala: Daily Food Unit (assumiamo 2000g di assunzione alimentare giornaliera)
  • Quantita normalizzata: 100g / 2000g = 0,05 (5% dell'assunzione giornaliera)
  • Frazione di rischio: Calcolata in base alla deviazione dal TMREL

Dieta ricca di sodio:

  • TMREL: 1000-5000mg al giorno
  • Quantita di sale: 3050mg
  • Frazione di rischio: Basata su dove si posiziona 3050mg nell'intervallo TMREL

Dieta povera di frutta (fattore positivo):

  • Quantita: 0g
  • Frazione di rischio: Massima (nessun contenuto di frutta)

Passo 3: Applicare i Valori DALY

Ogni frazione di rischio e moltiplicata per il carico DALY associato dai dati GBD:

  • Carico DALY carne lavorata: circa 40 DALY per 100.000 persone-anno
  • Carico DALY sodio: circa 30 DALY per 100.000 persone-anno

Passo 4: Sommare il VitaScore Totale

VitaScore Totale = somma di (DALY_r * f_r) per tutti i 13 fattori di rischio

Il risultato e espresso in micro-DALY per porzione, rappresentando il carico proporzionale sulla salute.


Fonti dei Dati

Studio Global Burden of Disease

Il VitaScore e basato sullo studio GBD 2021:

GBD 2021 Risk Factors Collaborators (2024). Global burden and strength of evidence for 88 risk factors in 204 countries and 811 subnational locations, 1990-2021: a systematic analysis for the Global Burden of Disease Study 2021. The Lancet.

Dati chiave estratti:

  • Carichi DALY per ogni fattore di rischio dietetico
  • Intervalli TMREL per il consumo ottimale
  • Stime del rischio relativo

Valori TMREL

I Livelli di Esposizione al Rischio Minimo Teorico sono derivati da:

  1. GBD 2021 Appendix 1: Specifiche TMREL dettagliate per ogni fattore di rischio
  2. Lancet Supplementary Materials: Dati di supporto per la derivazione del TMREL

Fattori di Mediazione

Il GBD usa fattori di mediazione per tenere conto di percorsi di rischio sovrapposti. Per esempio, la carne rossa impatta la salute sia direttamente che attraverso il suo effetto sull'indice di massa corporea (BMI).


Limitazioni Note

Vincoli Metodologici

  • Medie di popolazione: I valori DALY rappresentano medie globali o regionali, non rischio individuale
  • Specificita eta/genere: L'implementazione attuale usa valori a livello di popolazione (valori specifici per eta/genere disponibili ma non implementati)
  • Sovrapposizione dei fattori di rischio: I fattori di mediazione affrontano parzialmente ma non completamente i rischi correlati

Limitazioni dei Dati

  • Abbinamento alimentare: Richiede una classificazione accurata delle categorie alimentari
  • Completezza nutrizionale: I calcoli di sodio/grassi/proteine dipendono da dati nutrizionali completi
  • Incertezza TMREL: Gli intervalli di consumo ottimale hanno un'incertezza scientifica intrinseca

Lacune di Copertura

  • Specificita per paese: I valori DALY possono essere resi specifici per paese ma attualmente usano stime globali
  • Alimenti trasformati: Alimenti trasformati complessi potrebbero avere una mappatura incompleta delle categorie
  • Alimenti innovativi: Nuove categorie alimentari potrebbero mancare di associazioni stabilite con i fattori di rischio

Riferimenti

  1. GBD 2021 Risk Factors Collaborators (2024). Global burden and strength of evidence for 88 risk factors in 204 countries and 811 subnational locations, 1990-2021. The Lancet, 403(10440), 2162-2203.

  2. Eaternity (2017). VitaScore Documentation. https://eaternity.org/assets/smart-chefs/2017-12-12_VitaScore_Documentation_web.pdf

  3. Ernstoff, A., et al. (2020). Towards Win-Win Policies for Healthy and Sustainable Diets. Nutrients, 12(9), 2745.

  4. Murray, C.J.L., et al. (2020). Global burden of 87 risk factors in 204 countries and territories, 1990-2019: a systematic analysis for the Global Burden of Disease Study 2019. The Lancet, 396(10258), 1223-1249.

  5. GBD Results Tool. Institute for Health Metrics and Evaluation. https://vizhub.healthdata.org/

Footnotes

  1. WHO Healthy Diet Fact Sheet 2

  2. US Dietary Guidelines and Whole Grains

  3. EAT-Lancet Planetary Health Diet 2 3

  4. EFSA Dietary Reference Values 2 3 4

  5. WHO Sodium Reduction

  6. US Dietary Guidelines - Acceptable Macronutrient Distribution Ranges 2 3 4