######Index value calculator_EQ-5D-5L Singapore_2025
#Authors: Nan Luo, Annushiah Vasan Thakumar, Ling Jie Cheng, Zhihao Yang, Kim Rand, Yin Bun Cheung, Julian Thumboo
#Assume you have a data.frame dataset
#The mobility dimension in your dataset is to be called mo
#The self-care dimension in your dataset is to be called sc
#The usual activities dimension in your dataset is to be called ua
#The pain/discomfort dimension in your dataset is to be called pd
#The anxiety/depression dimension in your dataset is to be called ad


library(readxl)
# read raw data
dataset <- read_excel('c:/...../datasetname.xlsx')


# Match dimension level score to dimension disutilities

# Mobility
dataset$d1 <- ifelse(dataset$mo == 1, 0,
                     ifelse(dataset$mo == 2, 0.06515843,
                            ifelse(dataset$mo == 3, 0.12925925,
                                   ifelse(dataset$mo == 4, 0.31425328,
                                          ifelse(dataset$mo == 5, 0.39063292, NA)))))

# Self-care
dataset$d2 <- ifelse(dataset$sc == 1, 0,
                     ifelse(dataset$sc == 2, 0.06329752,
                            ifelse(dataset$sc == 3, 0.12081511,
                                   ifelse(dataset$sc == 4, 0.27394023,
                                          ifelse(dataset$sc == 5, 0.32843878, NA)))))

# Usual activities
dataset$d3 <- ifelse(dataset$ua == 1, 0,
                     ifelse(dataset$ua == 2, 0.06974331,
                            ifelse(dataset$ua == 3, 0.12710424,
                                   ifelse(dataset$ua == 4, 0.24620166,
                                          ifelse(dataset$ua == 5, 0.27766045, NA)))))

# Pain/discomfort
dataset$d4 <- ifelse(dataset$pd == 1, 0,
                     ifelse(dataset$pd == 2, 0.04439036,
                            ifelse(dataset$pd == 3, 0.14469826,
                                   ifelse(dataset$pd == 4, 0.47881629,
                                          ifelse(dataset$pd == 5, 0.5722395, NA)))))

# Anxiety/depression
dataset$d5 <- ifelse(dataset$ad == 1, 0,
                     ifelse(dataset$ad == 2, 0.08578835,
                            ifelse(dataset$ad == 3, 0.17940256,
                                   ifelse(dataset$ad == 4, 0.43180251,
                                          ifelse(dataset$ad == 5, 0.49681671, NA)))))

# Interaction term mo*ad
dataset$d1d5 <- (dataset$mo - 1) * (dataset$ad - 1) * -0.00694155

# Interaction term pd*ad
dataset$d4d5 <- (dataset$pd - 1) * (dataset$ad - 1) * -0.00650446

# Convert disutilities to utilities (index score)
dataset$index_score <- 1 - (dataset$d1 + dataset$d2 + dataset$d3 + dataset$d4 + dataset$d5 + dataset$d1d5 + dataset$d4d5)

