| ifun | R Documentation |
Given a transformed variable and the expression used to transform it, ifun creates
a function containing the inverse expression that will back-transform the variable.
ifun(expr, verbose = FALSE)
expr |
a single-variable call or quoted expression to be inverted.
The variable's name in |
verbose |
a logical controlling printing of the intermediate functions
|
ifun returns the inverting function such that
ifun(expr)(eval(expr)) = varname, where
expr can include any of the invertible functions in the Math and Ops
groups, plus identity and I.
To illustrate its use, consider variants of the sitar model
height ~ age where age and/or height are transformed,
e.g. height ~ log(age) or log(height) ~ sqrt(age). Each model
is of the form y ~ x but the units of x and y vary.
The models are compared by plotting the fitted curves in their original units,
by first applying suitable functions to back-transform x and y.
For example with log(age), where expr = quote(log(age)),
the function ifun = function(x) exp(x) back-transforms
eval(expr) to give age. See the first example.
ifun generalises this process for increasingly complex expr, as
the next two examples show.
The final example shows ifun in action with plot.sitar,
which uses ifun as the default function for arguments xfun and
yfun - they are used to back-transform x and y using the
values of expr for x and y extracted from the model's
sitar call.
Structuring expr suitably ensures it can be inverted - it should
contain a single mention of a single variable (varname here),
and possibly functions such as f(.), g(.), h(.) etc
such that expr = f(g(h((varname)))). The number of such functions
is in principle unlimited. ifun returns function(x)
h^{-1}(g^{-1}(f^{-1}((x)))),
which ensures that
expr is invertible so long as the individual functions are invertible.
The required inverting function, with single argument x. Its
"varname" attribute contains varname as a character string.
Tim Cole tim.cole@ucl.ac.uk
plot.sitar
## for best effect run all the code
## define varname variable
(age <- 1:9)
## simple case - age transformed to log(age)
(expr <- quote(log(age)))
## transformed age
eval(expr)
## inverting function, with "varname" attribute set to "age"
ifun(expr)
## inverted transformed age identical to age
all.equal(age, ifun(expr)(eval(expr)))
## more complex case - age transformed to log age since conception
(expr <- quote(log(age + 0.75)))
## inverting function
ifun(expr)
## inverted transformed age identical to age
all.equal(age, ifun(expr)(eval(expr)))
## ludicrously complex case involving exp, log10, ^, pi and trigonometry
(expr <- quote((exp(sin(pi * log10(age + 0.75)/2) - 1)^4)))
## inverting function, showing intermediate stages
ifun(expr, verbose=TRUE)
## identical to original
all.equal(age, ifun(expr)(eval(expr)))
## example of plot.sitar back-transforming transformed x and y in sitar models
## fit sitar models
m1 <- sitar(x=age, y=height^2, id=id, data=heights, df=6)
m2 <- update(m1, x=log(age+0.75), y=height)
## default plot options for xfun & yfun back-transform x & y to original scales
## xfun=ifun(x$call.sitar$x)
## yfun=ifun(x$call.sitar$y)
## compare mean curves for the two models where x & y are on the original scales
plot(m1, 'd', las=1)
lines(m2, 'd', col=2)
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.