[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