Define interaction explicitly:
test.dat$strainlab <- with(test.dat,interaction(strain,lab))
Fit site (lab) as fixed effect (makes much more sense if you have only two sites), strain-by-site interaction as random:
m1 <- lme(test~strain+lab , random=~1|strainlab,
data=data.frame(test.dat),method='REML')
VarCorr(m1)
## strainlab = pdLogChol(1)
## Variance StdDev
## (Intercept) 29.286446 5.411695
## Residual 5.398621 2.323493
Approximate confidence intervals:
intervals(m1,which="var-cov")
## Approximate 95% confidence intervals
##
## Random Effects:
## Level: strainlab
## lower est. upper
## sd((Intercept)) 4.258995 5.411695 6.876374
##
## Within-group standard error:
## lower est. upper
## 2.106594 2.323493 2.562725
##
Alternatively, fit lab and strain-by-lab interaction as random:
m2 <- lme(test~strain , random=~1|lab/strain,
data=data.frame(test.dat),method='REML')
VarCorr(m2)
## Variance StdDev
## lab = pdLogChol(1)
## (Intercept) 18.608568 4.313765
## strain = pdLogChol(1)
## (Intercept) 29.286446 5.411695
## Residual 5.398621 2.323493
##
intervals(m2,which="var-cov")
## Approximate 95% confidence intervals
##
## Random Effects:
## Level: lab
## lower est. upper
## sd((Intercept)) 1.925088 4.313765 9.666346
## Level: strain
## lower est. upper
## sd((Intercept)) 4.259026 5.411695 6.876324
##
## Within-group standard error:
## lower est. upper
## 2.106600 2.323493 2.562717