[R] formula error inside function

Hugh Morgan h.morgan at har.mrc.ac.uk
Sun Jan 29 20:46:56 CET 2012


Hi,

I have what I suppose is the same problem as this.  I am using the 
linear mixed model function lme, and this does not seems to take the 
attribute "model=TRUE" at the end of the function.

Is there a more general way of solving this problem?
Is my description of the problem below correct (from my understanding of 
cran.r-project.org/doc/contrib/Fox-Companion/appendix-scope.pdf)?

Using the test script:

calculate_mixed_model_p <- function() {
   dataObj=read.csv('dataMini.csv', header=TRUE, sep=",", dec=".")
   colnames(dataObj)
   attach(dataObj)
   library(nlme)

   formulaGenotype = test_variable~Genotype + Gender
   formulaNull = test_variable~Gender
   finalModelGenotype = lme(formulaGenotype, random=~1|Date, dataObj, 
na.action="na.omit", method="ML", keep.data = TRUE)
   finalModelNull = lme(formulaNull, random=~1|Date, dataObj, 
na.action="na.omit", method="ML")
   anovaModel = anova (finalModelGenotype,finalModelNull)
   print(anovaModel)
}

Fails with:

Error in eval(expr, envir, enclos) : object 'formulaGenotype' not found

I THINK function lme(...) constructs an object (finalModelGenotype) that 
has as part of it a link (pointer?) to object formulaGenotype.  During 
construction this is in the function scope as it was passed to it.  When 
finalModelGenotype is later passed to function anova(...) the link is 
still there but as the lme(...) scope no longer exists the link is now 
broken.

Any help greatly apperitiated,

Hugh

PS, I tried to make this script self contained, and generated the data 
object with the following lines.  It looks identical when you print it, 
but the lme function fails with error at [2].  If someone was to tell me 
what I am doing wrong I may be able to post easier scripts.

[1]
   
dataObj=data.frame(test_variable=c("23.0","20.2","23.8","25.6","24.6","22.7","27.7","27.5","23.5","22.8","22.3","20.9","26.6","23.8","24.5","26.8","23.2","29.9","23.3","22.5","22.2","27.2","28.1","24.5","22.7","20.7","26.2","27.1","22.0","22.2","26.7","28.5","22.2","22.1","25.3","21.7","29.3"),
     
Gender=c("Female","Female","Male","Male","Male","Female","Male","Male","Female","Female","Female","Female","Male","Male","Male","Male","Female","Male","Female","Female","Female","Male","Male","Male","Female","Female","Male","Male","Female","Female","Male","Male","Female","Female","Female","Female","Male"),
     
Genotype=c("10028","10028","10028","10028","10028","10028","10028","10028","10028","10028","10028","10028","10028","10028","10028","10028","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"),
     
Assay.Date=c("01/07/2009","01/07/2009","01/07/2009","01/07/2009","01/07/2009","01/07/2009","01/07/2009","01/07/2009","01/07/2009","07/07/2010","07/07/2010","07/07/2010","01/07/2009","07/07/2010","07/07/2010","07/07/2010","02/06/2010","02/06/2010","02/06/2010","02/06/2010","02/06/2010","02/06/2010","02/06/2010","02/06/2010","17/06/2010","17/06/2010","17/06/2010","17/06/2010","16/06/2010","16/06/2010","16/06/2010","16/06/2010","22/06/2010","22/06/2010","22/06/2010","22/06/2010","22/06/2010"),
     
Weight=c("9.9","9.5","9.9","10","9.9","9.8","10.2","10.4","9.9","9.8","9.9","9.5","9.8","9.5","9.8","9.9","9.5","10","9.8","9.5","9.7","10","10.2","9.9","9.9","9.5","10","10","9.8","9.9","10.2","10.1","9.8","9.9","10.2","9.8","10")
   )

[2]

Error in `rownames<-`(`*tmp*`, value = c("1", "2", "3", "4", "5", "6",  :
   attempt to set rownames on object with no dimensions
In addition:Warning message:
In Ops.factor(y[revOrder], Fitted) : - not meaningful for factors



On 01/25/2012 01:25 PM, Terry Therneau wrote:
>> I want use survfit() and basehaz() inside a function, but it doesn't
>> work. Could you take a look at this problem. Thanks for your help.
> Your problem has to do with environments, and these lines
>
>     fmla<- as.formula("Surv(time, event) ~ Z1 + Z2")
>     BaseFun<- function(x){
>          start.coxph<- coxph(x, phmmd)
>           ...
>          survfit(start.coxph)
>          }
>     Basefun(fmla)
>
> The survfit routine needs to reconstruct the model matrix, and by
> default in R this is done in the context where the model formula was
> first defined.  Unfortunately this is outside the function, leading to
> problems -- your argument "x" is is unknown in the outer envirnoment.
> The solution is to add "model=TRUE" to the coxph call so that the model
> frame is saved and survfit doesn't have to do reconstruction.
>
> If you think this should work as is, well, so do I.  I spent a lot of
> time on this issue a few months ago and finally threw in the towel.  The
> interaction of environments with model.frame and model.matrix is subtle
> and far from obvious.  (Just to be clear: I didn't say "broken".  Each
> aspect of the process has well thought out reasons.)  The standard
> modeling functions lm, glm, etc changed their defaults from model=F to
> model=T at some point.  This costs some space&  memory, but coxph may
> need to do the same.
>
> Terry T
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.



More information about the R-help mailing list