[R] Xyplot - adding model lines to plotted points

Deepayan Sarkar deepayan.sarkar at gmail.com
Fri Aug 3 04:33:26 CEST 2007


On 8/2/07, Sandeman, L. R. <l.sandeman at abdn.ac.uk> wrote:
> Hello,
>
> I have written code to plot an xyplot as follows:
>
> library(lattice)
> xyplot(len~ageJan1|as.factor(cohort),groups=sex,as.table=T,strip=strip.c
> ustom(bg='white',fg='white'),data=dat,
> xlab="Age (January 1st)",ylab="Length (cm)",main="Linear models for male
> and female cod, by cohort",type='p',
> lwd=1.5,auto.key=list(text=c("Male","Female"),points=F,rectangles=F,line
> s=T))
>
> I have fitted a linear model to the same data (for each sex in each
> cohort(year)).  I would like to add the fitted models to the existing
> plot (one line for male and one for female, where each panel is a
> separate cohort - as in the above code....).  I also want to do this
> with non-linear models if possible.
>
> I have trawled R help, and it seems that panel.superpose may be one
> method of attempting this, however, I am unable to produce any working
> code.
>
> My dataset is too large to put in as an example, but it is in the basic
> form as below (where sex is 1 for male and 5 for female).
>
>    len age fitted_model cohort sex
> 1   24   2 30.05771   1977   1
> 2   31   3 36.64122   1977   1
> 3   22   2 27.73938   1978   1
> 4   34   3 36.64122   1977   1
> 5   22   2 27.73938   1978   1
> 6   31   3 36.64122   1977   1
> 7   34   3 36.64122   1977   1
> 8   28   2 27.73938   1978   1
> 9   23   2 27.73938   1978   1
> 10  24   2 27.73938   1978   1
> 11  25   2 27.73938   1978   1
> Etc...


You need to rearrange your data first, so that it looks like

   len      age     cohort sex  source
1   24        2       1977   1   obs
2   31        3       1977   1   obs
3   22        2       1978   1   obs
4   34        3       1977   1   obs
...
1  30.05771   2       1977   1   fitted
2  36.64122   3       1977   1   fitted
3  27.73938   2       1978   1   fitted
4  36.64122   3       1977   1   fitted

There are several ways to do that; options include reshape(),
make.groups(), and the reshape package.

After that, something like

xyplot(len ~ age | as.factor(cohort), data = <...>,
       groups = interaction(sex, source),
       type = c("p", "p", "l", "l"), distribute.type = TRUE)

should give you what you want (this does use panel.superpose
internally).

-Deepayan



More information about the R-help mailing list