Thaler, Thorn, LAUSANNE, Applied Mathematics
2011-Jul-29 08:37 UTC
[R] Environment of a LM created in a function
Dear all, Quite often I have the situation that I've multiple response variables and I create Linear Models for them in a function. The following code illustrates my usual approach: ---------------8<--------------- set.seed(123) dat <- data.frame(x = rep(rep(1:3, each = 3), 4), y = rep(1:3, 12)) dat$z1 <- rnorm(36, dat$x + dat$y) dat$z2 <- rnorm(36, dat$x + 2*dat$y) dat$z3 <- rnorm(36, dat$x + 3*dat$y) modelInFunction <- function(resp, expl, df) { fo <- as.formula(paste(resp, paste(expl, collapse = " + "), sep = " ~ ")) lm(fo, data = df) } ex <- c("x", "y") resp <- paste("z", 1:3, sep = "") models <- lapply(resp, modelInFunction, expl = ex, df = dat) ---------------8<--------------- So far so good. But if I try to update any of the models afterwards, I get an error: ---------------8<---------------> update(models[[1]], . ~ . )Error in terms.formula(formula, data = data) : 'data' argument is of the wrong type ---------------8<--------------- In my opinion this happens, because the update function does not know where to look for the data frame containing the original values. However, if I try ---------------8<--------------- model.frame(models[[1]]) ---------------8<--------------- I get the right answer. Thus, I guess it has something to do with different environments and I was wondering what the recommended way would be to create an LM object within a function, which could be processed outside this particular function in the usual way? Or is it simply a bug in update? Any help highly appreciated. Thanks, -Thorn
I haven't seen an answer yet, so I'll give it a shot (below). On 2011-07-29 01:37, Thaler, Thorn, LAUSANNE, Applied Mathematics wrote:> Dear all, > > Quite often I have the situation that I've multiple response variables > and I create Linear Models for them in a function. The following code > illustrates my usual approach: > > ---------------8<--------------- > set.seed(123) > dat<- data.frame(x = rep(rep(1:3, each = 3), 4), y = rep(1:3, 12)) > dat$z1<- rnorm(36, dat$x + dat$y) > dat$z2<- rnorm(36, dat$x + 2*dat$y) > dat$z3<- rnorm(36, dat$x + 3*dat$y) > > modelInFunction<- function(resp, expl, df) { > fo<- as.formula(paste(resp, paste(expl, collapse = " + "), sep = " ~ > ")) > lm(fo, data = df) > } > > ex<- c("x", "y") > resp<- paste("z", 1:3, sep = "") > > models<- lapply(resp, modelInFunction, expl = ex, df = dat) > ---------------8<--------------- > > So far so good. But if I try to update any of the models afterwards, I > get an error: > > ---------------8<--------------- >> update(models[[1]], . ~ . ) > Error in terms.formula(formula, data = data) : > 'data' argument is of the wrong type > ---------------8<--------------- > > In my opinion this happens, because the update function does not know > where to look for the data frame containing the original values.True. You can call update() with 'evaluate = FALSE' to see that it can't find 'df'. The particular form of the error is because 'df' is a function (and hence possibly not a good choice for a variable name). Replacing your 'df' with 'dta' I get update(models[[1]], . ~ .) #Error in inherits(x, "data.frame") : object 'dta' not found But ?update tells us that we can provide additional or changed arguments to the call. So an easy fix is: update(models[[1]], . ~ ., data = dat) or update(models[[1]], . ~ ., data = model.frame(models[[1]])) Peter Ehlers> However, if I try > > ---------------8<--------------- > model.frame(models[[1]]) > ---------------8<--------------- > > I get the right answer. Thus, I guess it has something to do with > different environments and I was wondering what the recommended way > would be to create an LM object within a function, which could be > processed outside this particular function in the usual way? Or is it > simply a bug in update? > > Any help highly appreciated. > > Thanks, > > -Thorn > > ______________________________________________ > 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.