Søren Højsgaard
2012-Jan-22 14:06 UTC
[R] Calling update on an lm-object inside a function
Dear all, I want to update an lm (or glm) object by changing the response variable and I want to do so inside a function. Doing the update outside of a function is straight forward: x <- 1:5 y <- c(1,2,3,3,6) mm <- lm(y~x) y2 <- c(1,3,3,4,6) mm2<- update(mm, y2 ~ .) But I want to make the update inside a function (where the new response variable is declared inside the function). If I do foo <- function(mod){ y3 <- c(1,3,3,4,6) update(mod, y3 ~ .) } Then I get foo(mm) Error in eval(expr, envir, enclos) : object 'y3' not found (because y3 is not known in the global environment - I suppose). To fix this I do foo2 <- function(mod){ y3 <- c(1,3,3,4,6) mod2 <- eval(getCall(mod)) update(mod2, y3 ~ .) } foo2(mm) Call: lm(formula = y3 ~ x) Coefficients: (Intercept) x 0.1 1.1 Question: Is this the "appropriate" way of making such a model "available" for an update inside a function, or is there a better way? I guess so - because: If I change the model formula of my model and then invoke foo2 I get mm3 <- update(mm,.~.-x)> foo2(mm3)Error in eval(expr, envir, enclos) : object 'y3' not found This puzzles me. Question: can anyone help me clarify why this happens and what I can do to fix it. Thanks in advance S?ren
ONKELINX, Thierry
2012-Jan-23 09:44 UTC
[R] Calling update on an lm-object inside a function
Dear Soren, I would try adding the new variable to the dataset and use the data = argument of lm foo <- function(mod, data){ data$y3 <- c(1,3,3,4,6) update(mod, y3 ~ ., data = data) } x <- 1:5 y <- c(1,2,3,3,6) dataset <- data.frame(x = x, y = y) mm <- lm(y~x, data = dataset) foo(mm, dataset) Best regards, Thierry ir. Thierry Onkelinx Instituut voor natuur- en bosonderzoek / Research Institute for Nature and Forest team Biometrie & Kwaliteitszorg / team Biometrics & Quality Assurance Kliniekstraat 25 1070 Anderlecht Belgium + 32 2 525 02 51 + 32 54 43 61 85 Thierry.Onkelinx at inbo.be www.inbo.be To call in the statistician after the experiment is done may be no more than asking him to perform a post-mortem examination: he may be able to say what the experiment died of. ~ Sir Ronald Aylmer Fisher The plural of anecdote is not data. ~ Roger Brinner The combination of some data and an aching desire for an answer does not ensure that a reasonable answer can be extracted from a given body of data. ~ John Tukey -----Oorspronkelijk bericht----- Van: r-help-bounces at r-project.org [mailto:r-help-bounces at r-project.org] Namens S?ren H?jsgaard Verzonden: zondag 22 januari 2012 15:06 Aan: r-help at r-project.org Onderwerp: [R] Calling update on an lm-object inside a function Dear all, I want to update an lm (or glm) object by changing the response variable and I want to do so inside a function. Doing the update outside of a function is straight forward: x <- 1:5 y <- c(1,2,3,3,6) mm <- lm(y~x) y2 <- c(1,3,3,4,6) mm2<- update(mm, y2 ~ .) But I want to make the update inside a function (where the new response variable is declared inside the function). If I do foo <- function(mod){ y3 <- c(1,3,3,4,6) update(mod, y3 ~ .) } Then I get foo(mm) Error in eval(expr, envir, enclos) : object 'y3' not found (because y3 is not known in the global environment - I suppose). To fix this I do foo2 <- function(mod){ y3 <- c(1,3,3,4,6) mod2 <- eval(getCall(mod)) update(mod2, y3 ~ .) } foo2(mm) Call: lm(formula = y3 ~ x) Coefficients: (Intercept) x 0.1 1.1 Question: Is this the "appropriate" way of making such a model "available" for an update inside a function, or is there a better way? I guess so - because: If I change the model formula of my model and then invoke foo2 I get mm3 <- update(mm,.~.-x)> foo2(mm3)Error in eval(expr, envir, enclos) : object 'y3' not found This puzzles me. Question: can anyone help me clarify why this happens and what I can do to fix it. Thanks in advance S?ren ______________________________________________ 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.