[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