Hi there, I want to make trajectory plots for data as follows: ID time y 1 1 1.4 1 2 2.0 1 3 2.5 2 1.5 2.3 2 4 4.5 2 5.5 1.6 2 6 2.0 ... That is, I will plot a growth curve for each subject ID, with y in the y axis, and time in the x axis. I would like to have all growth curves in the same plot. Is there a simple way in R to do it? Thanks a lot! Lei Liu Associate Professor Division of Biostatistics and Epidemiology Department of Public Health Sciences University of Virginia School of Medicine http://people.virginia.edu/~ll9f/
On Mon, Aug 23, 2010 at 3:58 PM, Lei Liu <liulei at virginia.edu> wrote:> Hi there, > > I want to make trajectory plots for data as follows: > > ID ? ? ?time ? ?y > 1 ? ? ? 1 ? ? ? 1.4 > 1 ? ? ? 2 ? ? ? 2.0 > 1 ? ? ? 3 ? ? ? 2.5 > 2 ? ? ? 1.5 ? ? 2.3 > 2 ? ? ? 4 ? ? ? 4.5 > 2 ? ? ? 5.5 ? ? 1.6 > 2 ? ? ? 6 ? ? ? 2.0 > > ... > > That is, I will plot a growth curve for each subject ID, with y in the y > axis, and time in the x axis. I would like to have all growth curves in the > same plot. Is there a simple way in R to do it? Thanks a lot! >Try this. Lines <- "ID time y 1 1 1.4 1 2 2.0 1 3 2.5 2 1.5 2.3 2 4 4.5 2 5.5 1.6 2 6 2.0" library(zoo) # z <- read.zoo("myfile.dat", header = TRUE, split = 1, index = 2) z <- read.zoo(textConnection(Lines), header = TRUE, split = 1, index = 2) plot(z) # each in separate panel plot(z, col = 1:2) # all on same plot in different colors
On Mon, Aug 23, 2010 at 4:16 PM, Gabor Grothendieck <ggrothendieck at gmail.com> wrote:> On Mon, Aug 23, 2010 at 3:58 PM, Lei Liu <liulei at virginia.edu> wrote: >> Hi there, >> >> I want to make trajectory plots for data as follows: >> >> ID ? ? ?time ? ?y >> 1 ? ? ? 1 ? ? ? 1.4 >> 1 ? ? ? 2 ? ? ? 2.0 >> 1 ? ? ? 3 ? ? ? 2.5 >> 2 ? ? ? 1.5 ? ? 2.3 >> 2 ? ? ? 4 ? ? ? 4.5 >> 2 ? ? ? 5.5 ? ? 1.6 >> 2 ? ? ? 6 ? ? ? 2.0 >> >> ... >> >> That is, I will plot a growth curve for each subject ID, with y in the y >> axis, and time in the x axis. I would like to have all growth curves in the >> same plot. Is there a simple way in R to do it? Thanks a lot! >> > > Try this. > > Lines <- "ID ? ? ?time ? ?y > 1 ? ? ? 1 ? ? ? 1.4 > 1 ? ? ? 2 ? ? ? 2.0 > 1 ? ? ? 3 ? ? ? 2.5 > 2 ? ? ? 1.5 ? ? 2.3 > 2 ? ? ? 4 ? ? ? 4.5 > 2 ? ? ? 5.5 ? ? 1.6 > 2 ? ? ? 6 ? ? ? 2.0" > > library(zoo) > > # z <- read.zoo("myfile.dat", header = TRUE, split = 1, index = 2) > z <- read.zoo(textConnection(Lines), header = TRUE, split = 1, index = 2) > > plot(z) # each in separate panel > plot(z, col = 1:2) # all on same plot in different colors >or better: plot(na.approx(z)) plot(na.approx(z), col = 1:2)
and some more options... dat <- structure(list(ID = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 2L), .Label = c("1", "2"), class = "factor"), time = c(1, 2, 3, 1.5, 4, 5.5, 6), y = c(1.4, 2, 2.5, 2.3, 4.5, 1.6, 2)), .Names = c("ID", "time", "y"), row.names = c(NA, -7L), class = "data.frame") library(lattice) xyplot(y ~ time|ID, data = dat, type = 'l') xyplot(y ~ time, data = dat, group = ID, type = 'l') library(ggplot2) qplot(time, y, data = dat, facets = .~ID, geom = 'line') qplot(time, y, data = dat, group = ID, color = ID, geom = 'line') hth, Kingsford Jones On Mon, Aug 23, 2010 at 1:58 PM, Lei Liu <liulei at virginia.edu> wrote:> Hi there, > > I want to make trajectory plots for data as follows: > > ID ? ? ?time ? ?y > 1 ? ? ? 1 ? ? ? 1.4 > 1 ? ? ? 2 ? ? ? 2.0 > 1 ? ? ? 3 ? ? ? 2.5 > 2 ? ? ? 1.5 ? ? 2.3 > 2 ? ? ? 4 ? ? ? 4.5 > 2 ? ? ? 5.5 ? ? 1.6 > 2 ? ? ? 6 ? ? ? 2.0 > > ... > > That is, I will plot a growth curve for each subject ID, with y in the y > axis, and time in the x axis. I would like to have all growth curves in the > same plot. Is there a simple way in R to do it? Thanks a lot! > > Lei Liu > Associate Professor > Division of Biostatistics and Epidemiology > Department of Public Health Sciences > University of Virginia School of Medicine > > http://people.virginia.edu/~ll9f/ > > ______________________________________________ > 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. >
On Mon, 2010-08-23 at 15:58 -0400, Lei Liu wrote:> That is, I will plot a growth curve for each subject ID, with y in > the y axis, and time in the x axis. I would like to have all growth > curves in the same plot. Is there a simple way in R to do it? Thanks a > lot!This article, entitled, "Fitting Value-added Models in R", by Harold Doran, is relevant and very useful and interesting. www-stat.stanford.edu/~rag/ed351longit/doran.pdf -- Stuart Luppescu -=- slu .at. ccsr.uchicago.edu University of Chicago -=- CCSR ???????? -=- Kernel 2.6.33-gentoo-r2 I have mentioned several times on this list that I'm in the process of developing a new and wonderful implementation of lme and I would prefer to continue working on that rather than modifying old-style code. -- Douglas Bates R-help (March 2004) >
Hi Lei, Hope you don't mind I'm moving this back to the list in case others may benefit. Answers below... On Mon, Aug 23, 2010 at 3:37 PM, Lei Liu <liulei at virginia.edu> wrote:> Hi Kingsford, > > Thanks a lot! I got some help from my colleague by using the following code: > > xyplot(y~month,group=id, type="l"), the same as you suggested. It worked > fine. > > However, when I tried to add an additional line for the mean at each time > point by the following code: > > y.mean=aggregate(y, by=list(time), FUN=mean)[, 2] > uniq.time=sort(unique(time)) > > lines(uniq.time, y.mean, type="l", lty=1, lw=2) > > I find the line of mean does not overlap well with the trajectory plot!!! It > seems to me that "lines" statement does work well under "xyplot"! I tried > different strategies, e.g., add xlim and ylim in both xyplot and lines > statements, but still the problem exists. I also tried the ggplot2 package > and it had the same problem. Any help here? Thanks!Both lattice and ggplot2 use grid graphics which is a different beast from the base graphics. I don't believe the lines function has methods to add to grid plots. There are many approaches you could take here. The first thing that comes to my mind is to add another subjects (named 'mean' below) whose values are the observed average within time points: #the original data (no replicates within time points) dat <- structure(list(ID = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 2L), .Label = c("1", "2"), class = "factor"), time = c(1, 2, 3, 1.5, 4, 5.5, 6), y = c(1.4, 2, 2.5, 2.3, 4.5, 1.6, 2)), .Names = c("ID", "time", "y"), row.names = c(NA, -7L), class = "data.frame") #adding another subject to introduce replicates id3 <- data.frame(ID=as.factor(rep(3, 4)),time = c(1, 1.5, 2, 5.5), y = c(1, 2.2, 3, 2)) dat <- rbind(dat, id3) mean.y <- aggregate(formula = y ~ time, data = dat, FUN = mean) mean.y <- cbind(ID = as.factor('mean'), mean.y) dat <- rbind(dat, mean.y) dat library(ggplot2) qplot(time, y, data=dat, group = ID, color = ID, geom = c('point', 'line')) best, Kingsford Jones