Skip to content

Issue with formula conversion

10 messages · David Winsemius, Gang Chen, Richard M. Heiberger

#
A random effect formulation for R package nlme is read in as a string
of characters from an input file:

ranEff <- "pdCompSymm(~1+Age)"

I need to convert 'ranEff' to a formula class. However, as shown below:
~1 + Age

the "pdCompSymm" is lost in the conversion. Any solutions? Thanks!

Gang
#
On Aug 27, 2014, at 11:19 AM, Gang Chen wrote:

            
as.formula(paste("~",ranEff))
~pdCompSymm(~1 + Age)
#
Thanks for the help! However, I just need to get

pdCompSymm(~1 + Age)

without a tilde (~) at the beginning.
On Wed, Aug 27, 2014 at 3:34 PM, David Winsemius <dwinsemius at comcast.net> wrote:
#
On Aug 27, 2014, at 12:44 PM, Gang Chen wrote:

            
That's not a formula in the R sense of the word. You should do a better job of posting a use case. Perhaps you want an expression?
#
Good point!

Here is an example:

library(nlme)
fm <- lme(yield ~ nitro, data=Oats, random=list(Block=pdComSymm(~Variety-1)))

Now the problem I'm facing is that the following part

pdComSymm(~Variety-1)

is read in as a string of characters from an external source:

ranEff <- 'pdComSymm(~Variety-1)'

The following

(ranEff1 <- as.formula(ranEff))
~Variety - 1

is not what I want. Even though

fm <- lme(yield ~ nitro, data=Oats, random=list(Block=pdCompSymm(ranEff1)))

works, I don't know the 'pdCompSymm' part in advance and would like to
make the process automatic.
On Wed, Aug 27, 2014 at 3:49 PM, David Winsemius <dwinsemius at comcast.net> wrote:
#
On Aug 27, 2014, at 1:11 PM, Gang Chen wrote:

            
One problem is that youa re misspelling the function name.
# Returns an unevaluated expression
Linear mixed-effects model fit by REML
  Data: Oats 
  Log-restricted-likelihood: -296.5209
  Fixed: yield ~ nitro 
(Intercept)       nitro 
   81.87222    73.66667 
snipped rest of output.
#
Sorry for the misspelling! And more importantly, thanks a lot for the
nice solution and for the quick help!
On Wed, Aug 27, 2014 at 4:22 PM, David Winsemius <dwinsemius at comcast.net> wrote:
#
do you have control over the external source?

if so, then something like

BlockFunction <- "pdComSymm"
ranEff1 <- "~Variety -1"

fm <- lme(yield ~ nitro, data=Oats,
random=list(Block=get(BlockFunction)(ranEff1)))

The above is untested.  An example if get() is
[1] 10

The main problem with David's solution, which does work, is the use
of the eval(parse()) idiom.  This is usually strongly discouraged.  See, for
example,
If the answer is parse() you should usually rethink the question.
   -- Thomas Lumley
      R-help (February 2005)
On Wed, Aug 27, 2014 at 4:11 PM, Gang Chen <gangchen6 at gmail.com> wrote:
#
On Aug 27, 2014, at 1:33 PM, Richard M. Heiberger wrote:

            
I doubt that would work, since it is not a formula object.
After correcting the misspelling of the function name, I tested this approach:

 BlockFunction <- "pdCompSymm"
 ranEff1 <- as.formula("~Variety -1")
 fm <- lme(yield ~ nitro, data=Oats, random=list(Block=do.call(BlockFunction, list(form=ranEff1) )
  ))
 fm
#----------
Linear mixed-effects model fit by REML
  Data: Oats 
  Log-restricted-likelihood: -296.5209
  Fixed: yield ~ nitro 
snipped
#
David,

you caught my typo of excess quotation marks.  this should work

ranEff1 <- ~Variety -1
random=list(Block=get(BlockFunction)(ranEff1)))
On Wed, Aug 27, 2014 at 4:41 PM, David Winsemius <dwinsemius at comcast.net> wrote: