OK, I will try that. I notified the maintainer of boot.stepAIC, so he might fix this in due course.
Thanks, SGO. -----Original Message----- From: R-help [mailto:r-help-boun...@r-project.org] On Behalf Of Heinz Tuechler Sent: 24 August 2017 00:07 To: r-help@r-project.org Subject: Re: [R] boot.stepAIC fails with computed formula It seems that if you build the formula as a character string, and postpone the "as.formula" into the lm call, it works. instead of frm1 <- as.formula(paste(trg,"~1")) use frm1a <- paste(trg,"~1") and then strt <- lm(as.formula(frm1a),dat) regards, Heinz Stephen O'hagan wrote/hat geschrieben on/am 23.08.2017 12:07: > Until I get a fix that works, a work-around would be to rename the 'y1' > column, used a fixed formula, and rename it back afterwards. > > Thanks for your help. > SGO. > > -----Original Message----- > From: Bert Gunter [mailto:bgunter.4...@gmail.com] > Sent: 22 August 2017 20:38 > To: Stephen O'hagan <soha...@manchester.ac.uk> > Cc: r-help@r-project.org > Subject: Re: [R] boot.stepAIC fails with computed formula > > OK, here's the problem. Continuing with your example: > > strt1 <- lm(y1 ~1, dat) > strt2 <- lm(frm1,dat) > > >> strt1 > > Call: > lm(formula = y1 ~ 1, data = dat) > > Coefficients: > (Intercept) > 41.73 > >> strt2 > > Call: > lm(formula = frm1, data = dat) > > Coefficients: > (Intercept) > 41.73 > > > Note that the formula objects of the lm object are different: strt2 does not > evaluate the formula. So presumably boot.step.AIC does no evaluation and > therefore gets confused with the errors you saw. So you need to get the > evaluated formula into the lm object. This can be done, e.g. via: > >> strt2 <- eval(substitute(lm(form,data = dat), list(form = frm1))) > > ## yielding > >> strt2 > > Call: > lm(formula = y1 ~ 1, data = dat) > > Coefficients: > (Intercept) > 41.73 > > So this looks like it should fix the problem, but alas no, the boot.stepAIC > call still fails with the same error message. Here's why: > >> identical(strt$call, strt2$call) > [1] FALSE > > So one might rightfully ask, what the heck is going on here?! Further digging: > >> str(strt$call) > language lm(formula = y1 ~ 1, data = dat) > >> str(strt2$call) > language lm(formula = y1 ~ 1, data = dat) > > These certainly look identical! -- but of course they're not: > >> names(strt$call) > [1] "" "formula" "data" >> names(strt2$call) > [1] "" "formula" "data" > > So the difference must lie in the formula component, right? ... > >> strt$call$formula > y1 ~ 1 >> strt2$call$formula > y1 ~ 1 > > So, thus far, huhh? But.. > >> class(strt2$call$formula) > [1] "formula" > >> class(strt$call$formula) > [1] "call" > > So I think therein lies the critical difference that is screwing things up. > NOTE: If I am wrong about this someone **PLEASE** correct me. > > I see no clear workaround for this other than to explicitly avoid > passing a formula in the lm() call with y~1 or y ~ . I think the > real fix is to make the boot.stepAIC function smarter in how it handles its > formula argument, and that is above my paygrade (and degree of interest) . > You should probably email the maintainer, who may not monitor this list. But > give it a day or so to give someone else a chance to correct me if I'm wrong. > > > HTH. > > Cheers, > > Bert > Bert Gunter > > "The trouble with having an open mind is that people keep coming along and > sticking things into it." > -- Opus (aka Berkeley Breathed in his "Bloom County" comic strip ) > > > On Tue, Aug 22, 2017 at 8:17 AM, Stephen O'hagan <soha...@manchester.ac.uk> > wrote: >> I'm trying to use boot.stepAIC for feature selection; I need to be able to >> specify the name of the dependent variable programmatically, but this appear >> to fail: >> >> In R-Studio with MS R Open 3.4: >> >> library(bootStepAIC) >> >> #Fake data >> n<-200 >> >> x1 <- runif(n, -3, 3) >> x2 <- runif(n, -3, 3) >> x3 <- runif(n, -3, 3) >> x4 <- runif(n, -3, 3) >> x5 <- runif(n, -3, 3) >> x6 <- runif(n, -3, 3) >> x7 <- runif(n, -3, 3) >> x8 <- runif(n, -3, 3) >> y1 <- 42+x3 + 2*x6 + 3*x8 + runif(n, -0.5, 0.5) >> >> dat <- data.frame(x1,x2,x3,x4,x5,x6,x7,x8,y1) >> #the real data won't have these names... >> >> cn <- names(dat) >> trg <- "y1" >> xvars <- cn[cn!=trg] >> >> frm1<-as.formula(paste(trg,"~1")) >> frm2<-as.formula(paste(trg,"~ 1 + ",paste(xvars,collapse = "+"))) >> >> strt=lm(y1~1,dat) # boot.stepAIC Works fine >> >> #strt=do.call("lm",list(frm1,data=dat)) ## boot.stepAIC FAILS ## >> >> #strt=lm(frm1,dat) ## boot.stepAIC FAILS ## >> >> limit<-5 >> >> >> stp=stepAIC(strt,direction='forward',steps=limit, >> scope=list(lower=frm1,upper=frm2)) >> >> bst <- boot.stepAIC(strt,dat,B=50,alpha=0.05,direction='forward',steps=limit, >> scope=list(lower=frm1,upper=frm2)) >> >> b1 <- bst$Covariates >> ball <- data.frame(b1) >> names(ball)=unlist(trg) >> >> Any ideas? >> >> Cheers, >> SOH >> >> >> [[alternative HTML version deleted]] >> >> ______________________________________________ >> R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see >> 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. > ______________________________________________ > R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see > 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. > ______________________________________________ R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see 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. ______________________________________________ R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see 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.