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
| Proprieta | Descrizione |
|---|---|
| Eseguito su | FoodProductFlowNode |
| Dipendenze | AggregationGapFillingWorker, DailyFoodUnitGapFillingWorker |
| Input Chiave | Quantita delle categorie alimentari, valori nutrizionali, unita alimentare giornaliera |
| Output | VitaScore in DALY per fattore di rischio dietetico |
| Trigger | Il prodotto ha categorie alimentari aggregate e unita alimentare giornaliera |
Quando Viene Eseguito
Il modulo si attiva quando:
- L'aggregazione delle categorie alimentari e completa
- Il calcolo della Daily Food Unit (DFU) e completo
- Il nodo ha dati
amount_per_category_in_flowvalidi - Il nodo ha un valore
daily_food_unitvalido
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:
| Metodo | Descrizione | Utilizzo |
|---|---|---|
| per_dfu | Scala per Daily Food Unit | La maggior parte dei fattori di rischio (frutta, verdura, carne, ecc.) |
| per_total_energy | Scala per contenuto energetico totale | Grassi e proteine come percentuale delle calorie |
| per_self | Nessuna 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 Rischio | TMREL Inferiore | TMREL Superiore | Unita | Normalizzazione | DALY | Riferimento Linee Guida Dietetiche |
|---|---|---|---|---|---|---|
| Dieta povera di frutta | 200 | 300 | g/giorno | per_dfu | 61,24 | L'OMS raccomanda almeno 400 g/giorno di frutta e verdura combinate1 |
| Dieta povera di verdura | 340 | 500 | g/giorno | per_dfu | 30,57 | L'OMS raccomanda almeno 400 g/giorno di frutta e verdura combinate1 |
| Dieta povera di cereali integrali | 100 | 150 | g/giorno | per_dfu | 82,86 | Linee guida statunitensi: 3-4 porzioni/giorno (circa 48-64 g)2 |
| Dieta povera di noci e semi | 16 | 25 | g/giorno | per_dfu | 13,98 | EAT-Lancet: circa 50 g/giorno di noci3 |
| Dieta povera di latte | 350 | 520 | g/giorno | per_dfu | 9,42 | 2-3 porzioni di latticini/giorno (circa 400-600 ml)4 |
Fattori di Rischio Negativi (Un Consumo Maggiore e Dannoso)
| Fattore di Rischio | TMREL Inferiore | TMREL Superiore | Unita | Normalizzazione | DALY | Riferimento Linee Guida Dietetiche |
|---|---|---|---|---|---|---|
| Dieta ricca di sodio (sale) | 1 | 5 | g/giorno | per_dfu | 29,43 | L'OMS raccomanda meno di 5 g di sale/giorno (meno di 2 g di sodio)5 |
| Dieta ricca di carne lavorata | 0 | 4 | g/giorno | per_dfu | 96,94 | EAT-Lancet: evitare o minimizzare la carne lavorata3 |
| Dieta ricca di carne rossa | 18 | 27 | g/giorno | per_dfu | 74,25 | EAT-Lancet: circa 14 g/giorno (circa 100 g/settimana)3 |
Fattori di Rischio Macronutrienti (Energia e Percentuale dell'Energia Totale)
| Fattore di Rischio | TMREL Inferiore | TMREL Superiore | Unita | Normalizzazione | DALY | Riferimento Linee Guida Dietetiche |
|---|---|---|---|---|---|---|
| Dieta ricca di energia | 650 | 1250 | kcal | per_self | 88,66 | Un pasto equilibrato: 450-850 kcal (circa 1/3 di 2200 kcal/giorno)4 |
| Dieta ricca di grassi | 27,5% | 50% | % delle kcal | per_total_energy | 88,66 | Linee guida EFSA/USA: 20-35% dell'energia dai grassi46 |
| Dieta povera di grassi | 5% | 27,5% | % delle kcal | per_total_energy | 88,66 | Linee guida EFSA/USA: 20-35% dell'energia dai grassi46 |
| Dieta ricca di proteine | 22,5% | 60% | % delle kcal | per_total_energy | 88,66 | AMDR statunitense: 10-35% dell'energia dalle proteine6 |
| Dieta povera di proteine | 0% | 22,5% | % delle kcal | per_total_energy | 88,66 | AMDR 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:
| Versione | Descrizione |
|---|---|
| current | Ultimi valori DALY GBD 2021 |
| legacy | Valori 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:
- GBD 2021 Appendix 1: Specifiche TMREL dettagliate per ogni fattore di rischio
- 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
-
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.
-
Eaternity (2017). VitaScore Documentation. https://eaternity.org/assets/smart-chefs/2017-12-12_VitaScore_Documentation_web.pdf
-
Ernstoff, A., et al. (2020). Towards Win-Win Policies for Healthy and Sustainable Diets. Nutrients, 12(9), 2745.
-
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.
-
GBD Results Tool. Institute for Health Metrics and Evaluation. https://vizhub.healthdata.org/