Classification with 3 groups, repeated measurements, missing values, more predictors than subjects

I am working on a classification problem with the following characteristics:

• Individuals belong to one of three groups. The groups are "somewhat ordinal": controls, subclinical and clinical group.
• Each individual is measured five times on each predictor. These are technical replicates taken at the same time. All predictors are numerical.
• Many predictor measurements are missing. For some individuals and some predictors, all five measurements are missing.
• I have more predictors than subjects.

• I already tried an approach by Yeung & Bumgarner (2003), which addressed all four of my issues (e.g., it downweights predictors with high average intra-individual variation). Unfortunately, there does not seem to be any code for it, so I coded it myself in R. When I optimized the shrinkage parameter $D$ via cross-validation, the optimal value was very high, so that in effect, the algorithm discards all predictors and assigns everything to the most common group. This may just be what is in my data, or I may have made an error in coding, but I would like to try at least one alternative approach before giving up.
• Partial least squares and similar approaches that essentially rely on matrix algebra will - as far as I understand - have problems with missing data. And I guess they would only deal with my replicates by averaging the observations from each ID/predictor combination, which sounds wasteful to me.
• Given that my groups are somewhat ordinal, I am tempted to use a polytomous Rasch model next, where the link functions could be analogous to mixed models (to account for the replications), with some sort of regularization/shrinkage/lasso/ridge regression (to account for $p>n$). I haven't found an implementation of this anywhere, so it looks like I would need to "roll my own" here.

Any thoughts or pointers? Anything that is already implemented in R (or somewhere else) would be especially welcome.

I paste some example training and test data in R below.

training.data <- structure(list(ID = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L,
3L, 4L, 4L, 4L, 5L, 5L, 5L), .Label = c("a", "b", "c", "d", "e"
), class = "factor"), group = structure(c(1L, 1L, 1L, 1L, 1L,
1L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L), .Label = c("A", "B",
"C"), class = "factor"), predictor.1 = c(0.537, 0.42, 0.15, 0.245,
0.738, 0.513, 0.612, 0.633, 0.685, 0.29, 0.358, 0.624, NA, NA,
NA), predictor.2 = c(NA, NA, NA, NA, 0.846, 0.489, 0.954, 0.627,
0.709, 0.296, 0.975, 0.858, 0.904, 0.104, 0.242), predictor.3 = c(NA,
0.636, 0.007, NA, 0.396, NA, NA, 0.5, 0.776, NA, 0.222, NA, 0.398,
NA, 0.197), predictor.4 = c(0.364, 0.406, 0.761, 0.195, 0.695,
0.205, 0.215, 0.336, 0.311, 0.907, 0.91, 0.267, 0.815, 0.703,
0.486), predictor.5 = c(0.601, 0.568, 0.038, 0.246, 0.118, 0.992,
0.61, 0.486, 0.893, 0.004, 0.123, 0.373, 0.436, 0.595, 0.289),
predictor.6 = c(0.261, 0.75, 0.603, 0.921, 0.398, 0.362,
0.384, 0.603, 0.563, 0.591, 0.387, 0.918, 0.904, 0.965, 0.076
), predictor.7 = c(0.251, 0.724, 0.169, 0.658, 0.702, 0.687,
0.474, 0.769, 0.081, 0.19, 0.798, 0.717, 0.514, 0.672, 0.911
), predictor.8 = c(0.502, 0.868, 0.261, 0.424, 0.884, 0.569,
0.213, 0.781, 0.384, 0.771, 0.657, 0.501, 0.833, 0.357, 0.924
), predictor.9 = c(0.379, 0.375, 0.01, 0.316, 0.747, 0.585,
0.316, 0.054, 0.463, 0.731, 0.239, 0.377, 0.87, 0.895, 0.373
), predictor.10 = c(0.737, 0.397, 0.491, 0.906, 0.111, 0.61,
0.902, 0.77, 0.321, 0.137, 0.49, 0.561, 0.131, 0.202, 0.1
)), .Names = c("ID", "group", "predictor.1", "predictor.2",
"predictor.3", "predictor.4", "predictor.5", "predictor.6", "predictor.7",
"predictor.8", "predictor.9", "predictor.10"), row.names = c(NA,
-15L), class = "data.frame")

test.data <- structure(list(ID = structure(c(1L, 1L, 1L), .Label = "f",
class = "factor"),
group = c(NA, NA, NA), predictor.1 = c(0.203, 0.568, 0.458
), predictor.2 = c(0.729, 0.531, 0.156), predictor.3 = c(0.584,
0.995, 0.079), predictor.4 = c(0.307, 0.085, 0.152), predictor.5 = c(0.966,
NA, 0.108), predictor.6 = c(0.637, 0.97, 0.699), predictor.7 = c(0.597,
0.672, 0.806), predictor.8 = c(NA_real_, NA_real_, NA_real_
), predictor.9 = c(0.943, 0.106, 0.71), predictor.10 = c(0.804,
0.198, 0.408)), .Names = c("ID", "group", "predictor.1",
"predictor.2", "predictor.3", "predictor.4", "predictor.5", "predictor.6",
"predictor.7", "predictor.8", "predictor.9", "predictor.10"), row.names = c(NA,
-3L), class = "data.frame")