Skip to main content
. 2016 Dec 13;11(4):780–790. doi: 10.1177/1932296816682031

Table 1.

Function in R to Extract Glycemic Variability Indices From csv Files.

# index(data, d, n)
# Arguments
 # data is a database with covariates: id (identification), day (1, 2, 3, …), Glucose (mg/dl)
 # d, time (in min) between two consecutive glucose measurements
 # n, for CONGAn estimation (at 1, 2, … hours)
index <- function(data, d, n) {
  glucosemg <- data$Glucose
  day <- data$day
  id <- unique(data$id)
  glucose <- glucosemg/18
  N <- length(glucose) 
  m <- length(table(day)) # number of monitoring days
  Th <- 24*m # total time in hours
# number of observations in 1 hour
  K <- dim(data[day = = 1, ])[1]
  dat <- cbind(c(1:N), data)
  colnames(dat)[1] <- “num” ; orden <- dat$num
  sd <- tapply(dat$glucose, dat$day, sd) # SD for each day
  IGV <- 120 # Ideal glucose value
  MG <- mean(glucosemg)
  SD <- sd(glucosemg)
  CV <- 100*SD/MG
  IQR <- IQR(glucosemg)
  M <- mean(abs(10*log10(glucosemg/IGV))^3) +
  (max(glucosemg)-min(glucosemg))/20 # M-value
  J <- 0.001*(MG + SD)^2 # J-Index (mg/dl)
# J <- 0.324*(MG + SD)^2 # J-Index (mmol/l)
  FG <- 1.509*((log(glucosemg))^1.084 - 5.381)
  rl <- ifelse(FG < 0, 10*FG^2, 0)
  rh <- ifelse(FG > 0, 10*FG^2, 0)
  LBGI <- 1/N*sum(rl) # Low Blood Glucose Index
  HBGI <- 1/N*sum(rh) # High Blood Glucose Index
  LR = HR = NULL
  for (i in 1:m) {
  LR <- max(rl[day = = i])
  HR <- max(rh[day = = i])
  }
  ADRR <- 1/m*sum(LR + HR) # Average Daily Risk Ratio
  HYPO <- 100*mean((glucosemg < 70)) # Hypoglycaemia (%)
  HYPER <- 100*mean((glucosemg > 140)) # Hyperglycaemia (%)
  LI <- sum((glucose[1:N-1] - glucose[2:N])^2)/d # Lability Index
# Glycemia Risk Assessment Diabetes Equation Score
  GRADE <- median(425*(log10(log10(glucose)) + 0.16)^2)
# Continuous Overall Glycemic Action
  CONGA <- sd(glucose[(n+1):N] - glucose[1:(N-n)]
# Mean of Daily Differences
  MODD <- sum(abs(glucose[(n+1):N] - glucose[(1+K):N])) / (K*m-1)
# Area under the curve
  AUC <- (1/2*5*sum(glucosemg[1:N-1] + glucosemg[2:N])) / (m*24*60)
# Mean Amplitude of Glycemic Excursions
  infl = maxi = mini = dif = downs = NULL
  for (i in 2:(N - 1)) {
  if ((glucosemg[i] - glucosemg[i - 1]) * (glucosemg[i + 1] - glucosemg[i]) < = 0) {
  infl = c(infl, i)}
  }
  infl <- c(infl,N)
  eps <- 8
  n_infl <- length(infl)
  for (j in 1:(n_infl)) {
  I1 <- (infl[j] - eps):(infl[j] + eps)
  I <- subset(I1, I1 < = max(infl) & 0 < I1)
  if (max(glucosemg[I]) = = glucosemg[infl[j]] |
   min(glucosemg[I]) = = glucosemg[infl[j]]) {
   maxi = c(maxi, infl[j]) 
   mini = c(mini, infl[j])
  }
  }
  mm <- c(sort(c(maxi, mini)), infl[n_infl])
  def <- ifelse(glucosemg[mm[1:(length(mm)-1)]] = = glucosemg[mm[2:length(mm)]],     NA, mm[1:length(mm)-1])
  def <- c(subset(def, def ! = “NA”), infl[n_infl]) 
  for (k in 1:m) {
  ii <- day[def] = = k
  deff = def[ii]
  diff = NULL
  for (j in 1:length(deff)) {
   diff <- c(diff, glucosemg[deff[j]] - glucosemg[def[j + 1]])
   }
  downs <- c(downs, (subset(diff, diff > 0 & diff > sd(k)))
  }
  MAGE <- sum(downs)/length(downs)
  values <- round(c(id, MG, SD, CV, IQR, M, AdM, J, LBGI, HBGI, ADRR,
  HYPO, HYPER, LI, MAG, GRADE, MAGE, CONGA, MODD, AUC), 6)
  return(values) 
 }