Calculate 42-component Dietary Inflammatory Index
This script adapts the DII_ASA24.R from the dietaryindex package to include 14 additional components not included in the original dietaryindex calculation (28 components). This updated calculation relies upon previous calculations of eugenol intake, 6 polyphenol subclasses, and 7 additional food groups (10 possible).
- Original Calculation, DII_ASA24.R
- New Components Added to 28 component DII calculation:
- Compounds: EUGENOL, ISOFLAVONES, FLA3OL, FLAVONES, ANTHOC, FLAVONONES, FLAVONOLS
- Foods: GARLIC, GINGER, ONION, PEPPER, TEA, TURMERIC, THYME
INPUTS
- Recall_total_nutrients.csv: Total nutrient intakes for unique participant and recall combination. Generated from step 1 of Polyphenol Estimator.
- Recall_FooDB_DII_eugenol_by_recall.csv: Sum eugenol intake for each participant recall
- Recall_FooDB_DII_subclass_by_recall.csv: Sum of 6 DII polyphenol subclass intakes for each participant recall
- Recall_DII_foods_by_recall.csv - Intake of 7 DII 2014 food categories by participant recall
OUTPUTS
- summary_DII_final_scores_by_recall.csv - Total DII scores and 42 individual component scores
SCRIPT
Load package
suppressMessages(library(dplyr))
suppressMessages(library(vroom))
suppressMessages(library(tidyr))
suppressMessages(library(stringr))
Load dietary test data
# Load dietary data
total_nut = vroom::vroom('outputs/Recall_total_nutrients.csv', show_col_types = FALSE)
# Load DII calculation files
eugenol = vroom::vroom('outputs/Recall_DII_eugenol_by_recall.csv',
show_col_types = FALSE) # eugenol intake
subclass = vroom::vroom('outputs/Recall_DII_subclass_by_recall.csv',
show_col_types = FALSE) # polyphenol subclass intakes
DII_foods = vroom::vroom('outputs/Recall_DII_foods_by_recall.csv',
show_col_types = FALSE) # food intakes
Merge calculations with ASA24 Items file
merge = total_nut %>%
# Remove the total from names
rename_with(~ gsub("^Total_", "", .x)) %>%
left_join(eugenol) %>%
left_join(subclass) %>%
left_join(DII_foods)
## Joining with `by = join_by(subject, RecallNo)`
## Joining with `by = join_by(subject, RecallNo)`
## Joining with `by = join_by(subject, RecallNo)`
Clean column names and prepare DII Category calculations
ASA24 and NHANES have different naming conventions, so let’s make sure we can map easily between the two by standardizing the names.
mapping_df = tribble(
~new_name, ~asa24_name, ~nhanes_name,
"ALCOHOL", "ALC", "DRXIALCO",
"VITB12", "VB12", "DRXIVB12",
"VITB6", "VB6", "DRXIVB6",
"BCAROTENE", "BCAR", "DRXIBCAR",
"CAFF", "CAFF", "DRXICAFF",
"CARB", "CARB", "DRXICARB",
"CHOLES", "CHOLE", "DRXICHOL",
"KCAL", "KCAL", "DRXIKCAL",
"TOTALFAT", "TFAT", "DRXITFAT",
"FIBER", "FIBE", "DRXIFIBE",
"FOLICACID", "FA", "DRXIFA",
"IRON", "IRON", "DRXIIRON",
"MG", "MAGN", "DRXIMAGN",
"MUFA", "MFAT", "DRXIMFAT",
"NIACIN", "NIAC", "DRXINIAC",
"P183", "P183", "DRXIP183",
"P184", "P184", "DRXIP184",
"P205", "P205", "DRXIP205",
"P225", "P225", "DRXIP225",
"P226", "P226", "DRXIP226",
"P182", "P182", "DRXIP182",
"P204", "P204", "DRXIP204",
"PROTEIN", "PROT", "DRXIPROT",
"PUFA", "PFAT", "DRXIPFAT",
"RIBOFLAVIN", "VB2", "DRXIVB2",
"SATFAT", "SFAT", "DRXISFAT",
"SE", "SELE", "DRXISELE",
"THIAMIN", "VB1", "DRXIVB1",
"VITA", "VARA", "DRXIVARA",
"VITC", "VC", "DRXIVC",
"VITD", "VITD", "DRXIVD",
"VITE", "ATOC", "DRXIATOC",
"ZN", "ZINC", "DRXIZINC")
Conditional Renaming: Flexible between NHANES and ASA24
# Detect if it's NHANES (any column starts with "DRX")
is_nhanes = any(startsWith(names(merge), "DRX"))
# Pick the right mapping
if (is_nhanes) {
old_names = mapping_df$nhanes_name
} else {
old_names = mapping_df$asa24_name
}
new_names = mapping_df$new_name
# Only keep columns that exist in merge
existing_idx = which(old_names %in% names(merge))
old_names = old_names[existing_idx]
new_names = new_names[existing_idx]
# Apply rename to relevant DII columns
merge_renamed = merge %>%
rename(!!!setNames(old_names, new_names))
# Serving size calculation for DII
COHORT1 = merge_renamed %>%
# Apply Calculations
dplyr::mutate(
CAFFEINE = CAFF / 1000, # convert to grams
N3FAT = P183 + P184 + P205 + P225 + P226,
N6FAT = P182 + P204,
TURMERIC = TURMERIC * 1000,
THYME = THYME * 1000) %>% # Includes oregano
# MISSING Components
# ROSEMARY = ROSEMARY * 1000 # convert to mg
dplyr::select(subject, RecallNo, ALCOHOL, VITB12, VITB6, BCAROTENE,
CAFFEINE, CARB, CHOLES, KCAL, TOTALFAT, FIBER, FOLICACID,
IRON, MG, MUFA, NIACIN, N3FAT, N6FAT, PROTEIN, PUFA,
RIBOFLAVIN, SATFAT, SE, THIAMIN, VITA,
VITC, VITD, VITE, ZN,
# NEW COMPONENTS
EUGENOL, ISOFLAVONES, FLA3OL, FLAVONES, ANTHOC,
FLAVONONES, FLAVONOLS, GARLIC, GINGER, ONION, PEPPER,
TEA, TURMERIC, THYME)
# MISSING
# SAFFRON, ROSEMARY, TRANSFATS
Pivot to long format for ease of calculations
COHORT2 = COHORT1 %>%
tidyr::pivot_longer(-c(subject, RecallNo),
names_to = "Variable", values_to = "Value")
BUILD DII calculation scores dataframe
Derived from table 2 values in Shivappa et al.
# DII Food Parameters
Variable = c("ALCOHOL", "VITB12", "VITB6", "BCAROTENE", "CAFFEINE", "CARB",
"CHOLES", "KCAL", "EUGENOL", "TOTALFAT", "FIBER", "FOLICACID",
"GARLIC", "GINGER", "IRON", "MG", "MUFA", "NIACIN", "N3FAT", "N6FAT",
"ONION", "PROTEIN", "PUFA", "RIBOFLAVIN", "SAFFRON", "SATFAT", "SE",
"THIAMIN", "TRANSFAT", "TURMERIC", "VITA", "VITC", "VITD", "VITE", "ZN",
"TEA", "FLA3OL", "FLAVONES", "FLAVONOLS", "FLAVONONES", "ANTHOC",
"ISOFLAVONES", "PEPPER", "THYME", "ROSEMARY")
# Raw inflammatory effect score
Overall_inflammatory_score = c(-0.278, 0.106, -0.365, -0.584, -0.11, 0.097, 0.11,
0.18, -0.14, 0.298, -0.663, -0.19, -0.412, -0.453,
0.032, -0.484, -0.009, -0.246, -0.436, -0.159, -0.301,
0.021, -0.337, -0.068, -0.14, 0.373, -0.191, -0.098,
0.229, -0.785, -0.401, -0.424, -0.446, -0.419, -0.313,
-0.536, -0.415, -0.616, -0.467, -0.25, -0.131, -0.593,
-0.131, -0.102, -0.013)
# Global daily mean intake (units/day)
Global_mean = c( 13.98, 5.15, 1.47, 3718, 8.05, 272.2, 279.4, 2056, 0.01, 71.4,
18.8, 273, 4.35, 59, 13.35, 310.1, 27, 25.9, 1.06, 10.8, 35.9,
79.4, 13.88, 1.7, 0.37, 28.6, 67, 1.7, 3.15, 533.6, 983.9, 118.2,
6.26, 8.73, 9.84, 1.69, 95.8, 1.55, 17.7, 11.7, 18.05, 1.2, 10,
0.33, 1)
# SD of intakes
SD = c(3.72, 2.7, 0.74, 1720, 6.67, 40, 51.2, 338, 0.08, 19.4, 4.9, 70.7, 2.9,
63.2, 3.71, 139.4, 6.1, 11.77, 1.06, 7.5, 18.4, 13.9, 3.76, 0.79, 1.78,
8, 25.1, 0.66, 3.75, 754.3, 518.6, 43.46, 2.21, 1.49, 2.19,1.53, 85.9,
0.07, 6.79, 3.82, 21.14, 0.2, 7.07, 0.99, 15)
# Merge variables into one dataframe
DII_STD = data.frame(Variable, Overall_inflammatory_score, Global_mean, SD)
Calculate DII Scores
# Score calculation for DII
DII_scores = COHORT2 %>%
# Add DII components for calculations
dplyr::left_join(DII_STD, by = c("Variable")) %>%
#
dplyr::mutate(
Z_SCORE = (Value - Global_mean) / SD,
PERCENTILE = pnorm(Z_SCORE) * 2 - 1,
IND_DII_SCORE = PERCENTILE * Overall_inflammatory_score) %>%
# Shift data back to wide format
tidyr::pivot_wider(names_from = Variable, values_from = IND_DII_SCORE) %>%
dplyr::group_by(subject, RecallNo) %>%
# Summarize components
dplyr::summarize(
DII_ALL = sum(ALCOHOL, VITB12, VITB6, BCAROTENE, CAFFEINE, CARB,
CHOLES, KCAL, TOTALFAT, FIBER, FOLICACID, IRON, MG, MUFA,
NIACIN, N3FAT, N6FAT, PROTEIN, PUFA, RIBOFLAVIN, SATFAT,
SE, THIAMIN, VITA, VITC, VITD, VITE, ZN,
EUGENOL, ISOFLAVONES, FLA3OL, FLAVONES, ANTHOC,
FLAVONONES, FLAVONOLS, GARLIC, GINGER, ONION, PEPPER,
TEA, TURMERIC, THYME,
# SAFFRON, ROSEMARY, TRANS
na.rm = TRUE),
DII_NOETOH = sum(VITB12, VITB6, BCAROTENE, CAFFEINE, CARB, CHOLES,
KCAL, TOTALFAT, FIBER, FOLICACID, IRON, MG, MUFA,
NIACIN, N3FAT, N6FAT, PROTEIN, PUFA, RIBOFLAVIN,
SATFAT, SE, THIAMIN, VITA, VITC, VITD, VITE, ZN,
EUGENOL, ISOFLAVONES, FLA3OL, FLAVONES, ANTHOC,
FLAVONONES, FLAVONOLS, GARLIC, GINGER, ONION,
PEPPER, TEA, TURMERIC, THYME,
# SAFFRON, ROSEMARY, TRANS
na.rm = TRUE),
ALCOHOL = sum(ALCOHOL, na.rm = TRUE),
VITB12 = sum(VITB12, na.rm = TRUE),
VITB6 = sum(VITB6, na.rm = TRUE),
BCAROTENE = sum(BCAROTENE, na.rm = TRUE),
CAFFEINE = sum(CAFFEINE, na.rm = TRUE),
CARB = sum(CARB, na.rm = TRUE),
CHOLES = sum(CHOLES, na.rm = TRUE),
KCAL = sum(KCAL, na.rm = TRUE),
TOTALFAT = sum(TOTALFAT, na.rm = TRUE),
FIBER = sum(FIBER, na.rm = TRUE),
FOLICACID = sum(FOLICACID, na.rm = TRUE),
IRON = sum(IRON, na.rm = TRUE),
MG = sum(MG, na.rm = TRUE),
MUFA = sum(MUFA, na.rm = TRUE),
NIACIN = sum(NIACIN, na.rm = TRUE),
N3FAT = sum(N3FAT, na.rm = TRUE),
N6FAT = sum(N6FAT, na.rm = TRUE),
PROTEIN = sum(PROTEIN, na.rm = TRUE),
PUFA = sum(PUFA, na.rm = TRUE),
RIBOFLAVIN = sum(RIBOFLAVIN, na.rm = TRUE),
SATFAT = sum(SATFAT, na.rm = TRUE),
SE = sum(SE, na.rm = TRUE),
THIAMIN = sum(THIAMIN, na.rm = TRUE),
VITA = sum(VITA, na.rm = TRUE),
VITC = sum(VITC, na.rm = TRUE),
VITD = sum(VITD, na.rm = TRUE),
VITE = sum(VITE, na.rm = TRUE),
ZN = sum(ZN, na.rm = TRUE),
ONION = sum(ONION, na.rm = TRUE),
PEPPER = sum(PEPPER, na.rm = TRUE),
GARLIC = sum(GARLIC, na.rm = TRUE),
GINGER =sum(GINGER, na.rm = TRUE),
TEA = sum(TEA, na.rm = TRUE),
THYME = sum(THYME, na.rm = TRUE),
TURMERIC = sum(TURMERIC, na.rm = TRUE),
FLA3OL = sum(FLA3OL, na.rm = TRUE),
FLAVONONES = sum(FLAVONONES, na.rm = TRUE),
ANTHOC = sum(ANTHOC, na.rm = TRUE),
ISOFLAVONES = sum(ISOFLAVONES, na.rm = TRUE),
FLAVONOLS = sum(FLAVONOLS, na.rm = TRUE),
FLAVONES = sum(FLAVONES, na.rm = TRUE),
EUGENOL = sum(EUGENOL, na.rm = TRUE))
## `summarise()` has grouped output by 'subject'. You can override using the
## `.groups` argument.
# Can add with future updats
# SAFFRON =sum(SAFFRON, na.rm = TRUE),
# ROSEMARY = sum(ROSEMARY, na.rm = TRUE),
# TRANS = sum(TRANS, na.rm = TRUE))
Export DII total and component scores for downstream use
vroom::vroom_write(DII_scores, "outputs/summary_DII_final_scores_by_recall.csv", delim = ",")