4
$\begingroup$

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.

What I already did or am thinking about:

  • 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")
$\endgroup$

1 Answer 1

2
$\begingroup$

@StephanKolassa It looks like your data could fit a Rasch model. Those individuals with large amounts of missing data will wind up with larger standard errors. As long as you have a sufficient sample size, you should be able to get stable estimates for persons, items, and groups.

I do not know how to do this in R, but could do this in Facets (http://www.winsteps.com/facets.htm). Ministeps is free, but only handles small samples. If you would like me to run this for you and send you the specification file and the output, I would be happy to do so. The data would need to be in a csv file.

$\endgroup$
3
  • $\begingroup$ So, I ran the two commands you listed above thinking that I could share the output of the many-facet Rasch model. Data for such an analysis requires that the input be integers. $\endgroup$ Commented Apr 30, 2013 at 21:59
  • $\begingroup$ Thanks! I understand why a Rasch model would prefer data to be integers (it was developed to analyze questionnaire responses, after all). So if I decide to go this way, I will probably need to re-implement everything... $\endgroup$ Commented May 2, 2013 at 17:12
  • $\begingroup$ @stephanKolassa, There are some articles where groups are using the polytomous Rasch model to adjust for rater variance (raters are one of the facets: persons, items, and raters). There are some issues around this. If you figure out a way to simulate rating scale data for a polytomous model, there may be a paper in there! $\endgroup$ Commented May 2, 2013 at 19:15

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.