[R-sig-ME] cross-validation

Ben Bolker bbolker at gmail.com
Fri Aug 12 16:09:05 CEST 2016


There was a request for cross-validation code some time ago.  This is a
simple example of leave-one-out CV at the level of groups.

dd <- read.table(header=TRUE,
text="
ID TIME EVENT  x1       x2    x3      x4       x5
1   1   0   1.281   0.023   0.875   1.216   0.061
1   2   0   1.270   0.006   0.821   1.005   -0.014
1   3   0   1.053   -0.059  0.922   0.729   0.020
1   4   0   1.113   -0.015  0.859   0.810   0.076
1   5   1   1.220   -0.059  0.887   0.484   0.010
 2   1   0   1.062   0.107   0.815   0.836   0.200
 2   2   0   1.056   0.082   0.879   0.687   0.143
 2   3   0   0.971   0.076   0.907   0.810   0.166
 2   4   0   1.059   0.130   0.818   0.876   0.234
 2   5   0   1.125   0.148   0.759   1.080   0.276
 2   6   0   1.600   0.262   0.546   1.313   0.369
 2   7   0   1.576   0.262   0.564   1.156   0.349
 2   8   0   1.544   0.241   0.591   1.077   0.326
 2   9   0   1.722   0.215   0.552   0.841   0.293
 2   10  0   1.723   0.209   0.534   0.787   0.293
 2   11  0   1.631   0.186   0.548   0.728   0.274
 2   12  0   2.172   0.319   0.441   0.947   0.427
 3   1   0   0.874   -0.035  0.794   0.610   -0.003
 3   2   1   0.825   -0.142  0.952   0.573   -0.019")
require(lme4)
model1 <- glmer(EVENT ~ TIME + (1+TIME|ID)+x1+x2+x3+x4+x5, data=dd,
                family=binomial)

cvfun1 <- function(pred_id,pcut=0.5) {
    train <- subset(dd,!(ID %in% pred_id))
    mm <- suppressWarnings(update(model1, data=train))
    test <- subset(dd,ID %in% pred_id)
    prob <- predict(mm,type="response",newdata=test,re.form=~0)
    outcome <- as.numeric(prob>pcut)
    acc <- mean(outcome==test$EVENT)
    return(acc)
}

sapply(1:3,cvfun1)



More information about the R-sig-mixed-models mailing list