# 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) |
} |