[R] replacing characters in formulae / models

Christoph Scherber Christoph.Scherber at agr.uni-goettingen.de
Thu Nov 6 18:13:14 CET 2008


Dear all, Dear Keith,

Well, of course in fact the problem is more complicated than that. The example was just for 
illustration.

I have several statistical models for which I want to retrieve predictions using delta.method (from 
library(alr3)).

Now for this I need a character string such as e.g.
delta.method(model, "a + exp(c * x)") # model could for example be an exponential nls fit

where the "x" shall be replaced by a numeric value at which the predictions plus s.e. shall be returned:

delta.method(model, "a + exp(c * 10)")

##

Because there are many models for which this shall be done, I would like to have a function that 
does something like the following:

extract.estimates=function(model.list,xval)
for (i in 1:length(model.list)){
mod=model.list[i]

- extract the model formula using formula(mod)
- every time the variable "x" is present, it shall be replaced by xval
- create a pasted character string "pastestring" to be used by delta.method

result=list(delta.method(mod,pastestring))
return(result)
}

I hope this has helped illustrating my point.

All the best
Christoph




Keith Jewell schrieb:
> Hi,
> 
> Firstly,  I'd recommend using '<-' for assignment, rather than '='; it saves 
> confusion
> Secondly, I don't think you want 'a*x+b' as a formula, I think you want an 
> expression.
> Thirdly, your 'y' has only one term, a 9 character constant = "a * x + b"
> 
> Consider instead,
> y <- expression(a*x+b)
> a <- 2
> b <- 3
> x <- 1:10
> y
> eval(y)
> 
> Now, how to replace 'x' by 'w'?
> I'm not an expert, but this is the kind of thing I need to do, so I'd 
> welcome criticism of my approach.
> I would view the expression as a list:
> as.list(y)
> as.list(y[[1]])
> 
> So y is an expression containing a sub-expression; that is y is  '(a*x) + b'
> You want to access the sub-expression 'a*x'
> y[[1]][[2]]
> as.list(y[[1]][[2]])
> 
> Now you want to replace the third item in that sub-expression with the name 
> (not the character) w
> y[[1]][[2]][[3]] <- as.name("w")
> w <- 11:20
> y
> eval(y)
> 
> hth
> 
> Keith J
> 
> P.S. Perhaps you really do want a formula; y ~ a*x+b ??
> In that case I'd still probably manipulate it as a list.
> -------------------------------------------
> "Christoph Scherber" <Christoph.Scherber at agr.uni-goettingen.de> wrote in 
> message news:4913125C.2060500 at agr.uni-goettingen.de...
>> Dear all,
>>
>> How can I replace text in objects that are of class "formula"?
>>
>> y="a * x + b"
>> class(y)="formula"
>> grep("x",y)
>> y[1]
>>
>> Suppose I would like to replace the "x" by "w" in the formula object "y".
>>
>> How can this be done? Somehow, the methods that can be used in character 
>> objects do not work 1:1 in formula objects...
>>
>> Many thanks and best wishes
>> Christoph
>>
>>
>>
>> -- 
>> Dr. rer.nat. Christoph Scherber
>> University of Goettingen
>> DNPW, Agroecology
>> Waldweg 26
>> D-37073 Goettingen
>> Germany
>>
>> phone +49 (0)551 39 8807
>> fax   +49 (0)551 39 8806
>>
>> Homepage http://www.gwdg.de/~cscherb1
> 
> ______________________________________________
> 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.
> 
> .
> 

-- 
Dr. rer.nat. Christoph Scherber
University of Goettingen
DNPW, Agroecology
Waldweg 26
D-37073 Goettingen
Germany

phone +49 (0)551 39 8807
fax   +49 (0)551 39 8806

Homepage http://www.gwdg.de/~cscherb1



More information about the R-help mailing list