Linear Model - Interaction Term Interpretation I've been working with simple linear models, to try and see the mean differences between groups, along with batch effects. 
~0 + SampleType + Batch
As far as I'm aware, this uses "Batch" as a confounding variable, so takes the first level of this variable, to collapse the other levels to, becoming a kind of baseline. 
Could the same be said of an interaction model? - for example:
~0 + SampleType:Age + Batch
When using model.matrix in R for the first model, the first level of the batch variable is absorbed, and disappears, but that doesn't appear to be the case in the second model. 
edit - a simple example:
SampleType <- rep(c("A", "B", "C"), 6)
Age        <- rep(45:47, 6)
Batch      <- c(rep("X", 6),
                rep("Y", 12))

colnames(model.matrix(~0 + SampleType + Batch))
colnames(model.matrix(~0 + SampleType*Age + Batch))
colnames(model.matrix(~Age + Batch))
colnames(model.matrix(~0 + SampleType:Age + Batch))

I guess my question in a basic sense is, out of the four colnames calls above, why does the last one not absorb the first level of the batch variable?
 A: In the earlier models, SampleType played the role of the intercept(s) because you prevented the usual intercept with 0.  If you do that, then since it's arbitrary which is chosen, R takes the first mentioned dummy variable to give all levels to, and then baselines the remainder.  For example
> colnames(model.matrix(~0 + SampleType + Batch))
[1] "SampleTypeA" "SampleTypeB" "SampleTypeC" "BatchY" 

but switch them around and you get
> colnames(model.matrix(~0 + Batch + SampleType))
[1] "BatchX"      "BatchY"      "SampleTypeB" "SampleTypeC"

In your final model, the first actual dummy variable is Batch 
colnames(model.matrix(~0 + SampleType:Age + Batch))
[1] "BatchX"          "BatchY"          "SampleTypeA:Age" "SampleTypeB:Age" 
    "SampleTypeC:Age"

because the rest are interactions with a numerical variable.  If you want an actual interaction model you'd write
colnames(model.matrix(~0 + SampleType:Age + SampleType + Batch + Age))
[1] "SampleTypeA"     "SampleTypeB"     "SampleTypeC"     "BatchY"          
    "Age"             "SampleTypeB:Age" "SampleTypeC:Age"

to get Batch baselined, and 
colnames(model.matrix(~0 + SampleType:Age + Batch + SampleType + Age))
[1] "BatchX"          "BatchY"          "SampleTypeB"     "SampleTypeC"     
    "Age"             "SampleTypeB:Age" "SampleTypeC:Age"

to get SampleType baselined.  That's why the * is in the formula interface: to stop you leaving out lower order effects when you have interactions, and thereby confusing yourself.
