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.

Reply via email to