[R] Problem using with panel.average in Lattice package
Peter Ehlers
ehlers at ucalgary.ca
Mon Oct 5 00:20:34 CEST 2009
Deepayan,
Is something similar needed in the last example in ?xyplot? I don't
see panel.linejoin producing any lines.
Regards,
Peter Ehlers
Deepayan Sarkar wrote:
> On Fri, Oct 2, 2009 at 8:03 PM, Mark Dalphin <mark.dalphin at peblnz.com> wrote:
>> Hi,
>>
>> I'm having a problem getting the panel.average function to work as I
>> expect it to in a lattice plot. I wish to draw lines between the
>> averages of groups of y-values at specific x-values. I have created a
>> dataset below which is similar to my real data. I also show an example
>> of using panel.loess in place of panel.average; it performs in a
>> manner similar to what I want panel.average to do except it shows a
>> loess line rather than a straight line connecting the means of the
>> groups.
>>
>> Please see my coded examples, below.
>>
>> Regards,
>> Mark Dalphin
>>
>> =================================================================
>> My system information:
>>
>>> library(lattice)
>>> print(sessionInfo())
>> R version 2.9.1 (2009-06-26) i686-pc-linux-gnu
>> locale:
>> LC_CTYPE=en_NZ.UTF-8;LC_NUMERIC=C;LC_TIME=en_NZ.UTF-8;LC_COLLATE=en_NZ.UTF-8;
>> LC_MONETARY=C;LC_MESSAGES=en_NZ.UTF-8;LC_PAPER=en_NZ.UTF-8;LC_NAME=C;
>> LC_ADDRESS=C;LC_TELEPHONE=C;LC_MEASUREMENT=en_NZ.UTF-8;LC_IDENTIFICATION=C
>>
>> attached base packages:
>> [1] stats graphics grDevices utils datasets methods base
>> other attached packages:
>> [1] lattice_0.17-25
>>
>> loaded via a namespace (and not attached):
>> [1] grid_2.9.1 tools_2.9.1
>>
>> ##--------------------------------------------------------------
>> ## This dataset is too complicated, but it does show the type of plot I
>> want.
>> ##
>> ## Create a fake qPCR dataset: Eight 96-well plates over 4 days (2 per day),
>> ## 2 genes per plate (multiplexed), and 4 "Hi" positive control and
>> ## 4 "Lo" positive controls per plate.
>> ## Create the experimental data; by rights it is all identical, expect for
>> ## experimental errors with in days and between days.
>> ## For this simulation, each gene will be given a base value.
>> ## In qPCR the higher the "Ct" value, the lower the concentration.
>> library(lattice) # Add for ease of cut-n-paste of this code
>> date <- c('2009-09-07', '2009-09-08', '2009-09-10', '2009-09-14')
>> probe <- c('Gene.A1', 'Gene.A2', 'Gene.B1', 'Gene.B2')
>> conc <- c('Lo', 'Hi')
>> base.lo <- c(Gene.A1=29, Gene.A2=25, Gene.B1=28, Gene.B2=31)
>> base.hi <- base.lo - 8
>> day.err <- c(Day.1=0, Day.2=1, Day.3=1.5, Day.4=1.0)
>>
>> d <- data.frame()
>> for(i in seq(along=date)) {
>> for(j in seq(along=probe)) {
>> for(k in seq(along=conc)) {
>> d <- rbind(d, data.frame(Date=rep(date[i], length=4),
>> Probe=rep(probe[j], length=4),
>> Conc=rep(conc[k], length=4),
>> Ct=rnorm(4, sd=0.5) + (k-1)*8 +
>> base.hi[j] + day.err[i]
>> ))
>> }
>> }
>> }
>> d$Date <- as.POSIXct(d$Date)
>>
>> ##--------------------------------------------------
>> ## Example 1
>> ## Print with LOESS line showing the 'means' for the groups.
>> ## This is close, but I don't want a loess line; I want straight lines
>> ## between mean values.
>> print(xyplot(Ct ~ Date|Probe, group=Conc, data=d,
>> panel="panel.superpose",
>> panel.groups=function(x, y, ...) {
>> panel.loess(x, y, ...)
>> panel.xyplot(x, y, ...)
>> },
>> auto.key=TRUE))
>>
>> ##--------------------------------------------------
>> ## Example 2
>> ## Parallel construction to the loess example, above.
>> ## Note the loss of the lines. The 'horizontal' default
>> ## is different between 'panel.loess' and 'panel.average'.
>> print(xyplot(Ct ~ Date|Probe, group=Conc, data=d,
>> panel="panel.superpose",
>> panel.groups=function(x, y, ...) {
>> panel.average(x, y, horizontal=FALSE, ...)
>> panel.xyplot(x, y, ...)
>> },
>> auto.key=TRUE))
>
> Unfortunately, the implicit type="p" argument in panel.superpose is
> overriding the type="l" in panel.average (may be it should be
> unmodifiable). So, you need
>
> print(xyplot(Ct ~ Date|Probe, group=Conc, data=d,
> panel="panel.superpose",
> panel.groups=function(x, y, ..., type) {
> panel.average(x, y, ..., type = "l", horizontal = FALSE)
> panel.xyplot(x, y, ..., type = type)
> },
> auto.key=TRUE))
>
> It's more common to use the syntactic sugar provided by panel.xyplot:
>
> print(xyplot(Ct ~ Date|Probe, group=Conc, data=d,
> type = c("p", "a"),
> auto.key=TRUE))
>
>
>> ##--------------------------------------------------
>> ## Example 3
>> ## Don't pass along the '...' to the panel.average. Now I
>> ## get lines, but not matching colours to the points.
>> print(xyplot(Ct ~ Date|Probe, group=Conc, data=d,
>> panel="panel.superpose",
>> panel.groups=function(x, y, ...) {
>> panel.average(x, y, horizontal=FALSE)
>> panel.xyplot(x, y, ...)
>> },
>> auto.key=TRUE))
>>
>> ##**********************************************************************
>> Main question:
>>
>> I want to create a plot that looks like Example 3, but with the
>> coloured lines of Example 1. Suggestions? I've looked in RSiteSearch()
>> for both "panel.average" and "panel.linejoin" but found nothing addressing
>> this.
>>
>> Side question:
>>
>> I also read the source code to panel.average, panel.loess and
>> panel.superpose. Which leads to a side question; how do I determine
>> what parameters are being passed within '...'? I tried recreating my
>> panel.groups function above as an explicit (non-anonymous) function
>> and using debug() on it, but running formals() within that debugging session
>> didn't seem to show me the huge list of arguments from
>> panel.superpose, "do.call(panel.groups, args)", coming into my panel
>> function. Is there some way to "see" these arguments?
>
> I usually put in
>
> str(list(...))
>
> in the function. For interactive debugging, you could have
>
> dots <- list(...)
>
> and then debug.
>
> -Deepayan
>
> ______________________________________________
> 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.
More information about the R-help
mailing list