Scott Gilpin
2004-Oct-11 19:10 UTC
[R] scoping problem when calling step inside a function
Hi everyone - I'm trying to do a forward stepwise regression (I've tried both step and stepAIC) inside of a function. I can do it outside the function with no problems (first example in code below). I can also do a backward stepwise regression inside a function (second example), but forward stepwise regression ( third example ) fails with the error: "Error in model.frame.default(formula = y ~ X1 + X2 + X3 + X4 + X5 + X6 + : Object "lsdata" not found" I looked through the help archives and found several threads where the problem appears to be the environment which is used in eval. When I looked at the source for step, it appears OK, as it's using eval.parent. I also read section 7.12 of the FAQ about enclosing and parent environments, but this leads me to belive that step is doing the right thing. I've tried this code with R version 1.9.0, 1.9.1 and 2.0.0 on Windows XP. The error message is slightly different for 2.0.0, but it seems to be the same problem. Thanks in advance, Scott Gilpin ## Example code rm(list=ls()) ## Forward stepwise regression - works fine set.seed(2863) x<-matrix(runif(1000),ncol=10) colnames(x)<-1:10 beta<-matrix(c(1,2,3,4,5,0,0,0,0,0),ncol=1) y<-drop(x %*% beta + rnorm(100)) lsdata<-data.frame(cbind(x=x,y=y)) xnam <- names(lsdata)[names(lsdata) != "y"] (fmla <- as.formula(paste("y ~ ", paste(xnam, collapse= "+")))) fit<-lm(y ~ 1,data=lsdata) step.fit<-step(fit,scope = fmla, direction="forward",data=lsdata) ## start from scratch rm(list=ls()) set.seed(2863) x<-matrix(runif(1000),ncol=10) colnames(x)<-1:10 beta<-matrix(c(1,2,3,4,5,0,0,0,0,0),ncol=1) y<-drop(x %*% beta + rnorm(100)) ## backward stepwise in a function - works fine backward.step<-function(x,y,...) { lsdata<-data.frame(cbind(x=x,y=y)) xnam <- names(lsdata)[names(lsdata) != "y"] (fmla <- as.formula(paste("y ~ ", paste(xnam, collapse= "+")))) fit<-lm(fmla,data=lsdata) step.fit<-step(fit, direction="backward",data=lsdata) step.fit } backward.fit<-backward.step(x,y) ## forward stepwise in a function - error forward.step<-function(x,y,...) { lsdata<-data.frame(cbind(x=x,y=y)) xnam <- names(lsdata)[names(lsdata) != "y"] (fmla <- as.formula(paste("y ~ ", paste(xnam, collapse= "+")))) fit<-lm(y ~ 1,data=lsdata) step.fit<-step(fit,scope = fmla, direction="forward",data=lsdata) step.fit } forward.fit<-forward.step(x,y)