[R] split-plot analysis with lme()

Spencer Graves spencer.graves at pdf.com
Sun Oct 15 17:28:43 CEST 2006


      The problem in your example is that 'lme' doesn't know how to 
handle the Variety*nitro interaction when all 12 combinations are not 
present.  The error message "singularity in backsolve" means that with 
data for only 11 combinations, which is what you have in your example, 
you can only estimate 11 linearly independent fixed-effect coefficients, 
not the 12 required by this model:  1 for intercept + (3-1) for Variety 
+ (4-1) for nitro + (3-1)*(4-1) for Variety*nitro = 12. 

      Since 'nitro' is a fixed effect only, you can get what you want by 
keeping it as a numeric factor and manually specifying the (at most 5, 
not 6) interaction contrasts  you want, something like the following: 

fit2. <- lme(yield ~ Variety+nitro+I(nitro^2)+I(nitro^3)
             +Variety:(nitro+I(nitro^2)), data=Oats,
             random=~1|Block/Variety,
            subset=!(Variety == "Golden Rain" & nitro == "0"))

      NOTE:  This gives us 4 degrees of freedom for the interaction.  
With all the data, we can estimate 6.  Therefore, there should be some 
way to get 5, but so far I haven't figured out an easy way to do that.  
Perhaps someone else will enlighten us both. 

      Even without a method for estimating an interaction term with 5 
degrees of freedom, I hope I've at least answered your basic question. 

      Best Wishes,
      Spencer Graves          

i.m.s.white wrote:
> Dear R-help,
>
> Why can't lme cope with an incomplete whole plot when analysing a split-plot
> experiment? For example:
>
> R : Copyright 2006, The R Foundation for Statistical Computing
> Version 2.3.1 (2006-06-01)
>
>   
>> library(nlme)
>> attach(Oats)
>> nitro <- ordered(nitro)
>> fit <- lme(yield ~ Variety*nitro, random=~1|Block/Variety)
>> anova(fit)
>>     
>               numDF denDF   F-value p-value
> (Intercept)       1    45 245.14333  <.0001
> Variety           2    10   1.48534  0.2724
> nitro             3    45  37.68560  <.0001
> Variety:nitro     6    45   0.30282  0.9322
>
> # Excellent! However ---
>
>   
>> fit2 <- lme(yield ~ Variety*nitro, random=~1|Block/Variety, subset=
>>     
> + !(Variety == "Golden Rain" & nitro == "0"))
> Error in MEEM(object, conLin, control$niterEM) : 
> 	Singularity in backsolve at level 0, block 1
>



More information about the R-help mailing list