[R] xyplot: discrete points + continuous curve per panel

Deepayan Sarkar deepayan.sarkar at gmail.com
Thu Dec 14 21:39:44 CET 2006


On 12/13/06, RMan54 <RMan54 at cox.net> wrote:
>
> I have a number of x, y observations (Time, Conc) for a number of Subjects
> (with subject number Subj) and Doses. I can plot the individual points with
> xyplot fine:
>
> xyplot(Conc ~ Time | Subj,
>          Groups=Dose,
>          data=myData,
>          panel =  function(x,y) {
>               panel.xyplot(x, y)
>               panel.superpose(???) # Needs more here
>          }
> )
>
> I also like to plot on each panel (there is one Subj per panel) a continuous
> curve with predictions that I can calculate from a rather complicated
> function:
>
> myPred <- (time, subj, dose) {
>        returns predicted value of Conc for a given time, subj and dose
> }
>
> The predicted curves are different for each panel.
>
> How do I plot the predictions? I have tried to add panel.superinpose in the
> xyplot portion but can't link to the myPred function. I also know about
> panel.curve but couldn't make it work.
>
> My attempt is to calculate the predictions on the fly. Is this possible? Or
> do I need to calculate all predictions first and put the results in a data
> frame.

Depends on how much work you are willing to do. There is no reason for
panel.curve to not work, provided you give it a "curve" to plot. This
is normally done in the form of a vectorized function of one variable,
which will be called with a vector of values spanning the x-axis of
your plot. It is your responsibility to construct such a function
inside each panel (presumably it would involve your myPred function).

The easy way, that generally works well for longitudinal data (with
increasing x values within a panel), is to add a column of predicted
values to your data frame. For most model fitting routines in R, the
paradigm is:

fm <- some.model(y ~ whatever, data = mydata, ...)
mydata$fit <- fitted(fm)

xyplot(y + fit ~ whatever,
       type = list("p", "l"), distribute.type = TRUE)

A real example being:

library(lme4)
data(Oxboys, package = "nlme")
Oxboys$fit <- fitted(lmer(height ~ age + (1|Subject), data = Oxboys))
xyplot(height + fit ~ age | Subject, Oxboys,
       type = c("p", "l"), distribute.type = TRUE,
       aspect = "xy")


Things will be more complicated if you already have a grouping
variable (the solution is to pass down the vector of fitted values to
the panel function and use 'subscripts' to retrieve the ones that
belong in the panel).

-Deepayan



More information about the R-help mailing list