[R] Fwd: User defined panel functions in lattice

Duncan Mackay mackay at northnet.com.au
Sat Apr 21 11:28:19 CEST 2012


Bert
I have read Deepayan's book and done all the examples but there is no 
mention of panel.number and panel.groups in the books example.

I just cannot get the fully meaning of what has been written 
regarding passing arguments to panel functions.

Regards

Duncan



At 14:31 21/04/2012, you wrote:
>A comment...
>
>On Fri, Apr 20, 2012 at 8:32 PM, Duncan Mackay <mackay at northnet.com.au> wrote:
> > Hi David, ilai
> >
> > The root cause of the problem is the passing of arguments to 
> panel functions
> > to me and my colleagues.
> > Just going through the archives there seems to be different ways for very
> > similar/same outcomes and
> > trying to get a pattern is hard to discern.
>
>Bad strategy!  Trying to infer the rules from examples in complex
>cases -- and as you said, different equivalent ways -- is nuts. You
>need to read the docs carefully (including Deepayan's book, possibly)
>and use the examples for understanding what is explained there.
>
>Finally, I don't know if this is relevant or helpful but:
>
>## this code works fine
>  xyplot(rnorm(5) ~ 1:5, type="l",
>   panel = function(...)panel.xyplot(...,lwd=2))
>
>## This code throws an error about repeat lwd arguments. Is it obvious why?
>  xyplot(rnorm(5) ~ 1:5,  lwd=1,type="l",
>   panel = function(...) panel.xyplot(...,lwd=2))
>
>-- Bert
>
> > I frequently have to use the subscripts or group.number to access other
> > data.
> > I thought I had things sorted out in my head with the panel.groups and
> > group.number but this has shattered it.
> >
> > Thanks
> >
> > Duncan
> >
> > At 12:15 21/04/2012, you wrote:
> >
> >> On Apr 20, 2012, at 9:14 PM, ilai wrote:
> >>
> >>> Oops - that is "reply all"
> >>> On Fri, Apr 20, 2012 at 5:29 PM, David Winsemius <dwinsemius at comcast.net
> >>> > wrote:
> >>>>
> >>>>
> >>>> I'm a bit puzzled by this exchange. I know there is a
> >>>> 'panel.locfit', but
> >>>> you two are spelling it differently. Can you explain why you are
> >>>> doing so?
> >>>
> >>>
> >>> Hi David,
> >>> Thanks for stepping in. panel.Locfit is the OP's local function (or
> >>> just a wrapper ?) which I believe is here
> >>> http://www.mail-archive.com/r-help@r-project.org/msg167164.html
> >>>
> >>> Note the two errors OP encountered (solved down the thread) were
> >>> caused by the way he called the function in xyplot, not by
> >>> panel.Locfit itself, which I did not modify. I guess now the issue is
> >>> how to generalize panel.Locfit somehow, but I am not sure how. I
> >>> suspect the problem is not my understanding but that there really
> >>> isn't any one specific problem here for the list to solve, though,
> >>> again, I am known for misinterpreting OP requests... :)
> >>>
> >>>>> ?panel.locfit
> >>>
> >>>
> >>> As I said, I am unfamiliar with the package - but this doesn't
> >>> surprise me. Thank you for pointing it out, wish you've noticed the
> >>> exchange sooner...
> >>
> >>
> >> Another puzzle. In the original posting there was this segment:
> >> ---
> >> but gives an error message without par.settings if i want to add
> >>                       panel.Locfit(x,y,nn= 0.9,lwd = c(1,2,3), ...)
> >>
> >> Error using packet 1
> >> formal argument "Iwd" matched by multiple actual arguments
> >> ---
> >>
> >> On my mailer that formal argument starts with a capital "I" but the
> >> code seemed to be attempting a lowercase "l".
> >>
> >> I could never see reason offered for defining a new panel.locfit, but
> >> I'm wondering if the sometimes similar representation of those two
> >> different letters could be causing an obscure conflict?
> >>
> >> --
> >> David.
> >>>
> >>>
> >>> Cheers
> >>>
> >>>
> >>>>> ?panel.Locfit
> >>>>
> >>>> No documentation for 'panel.Locfit' in specified packages and
> >>>> libraries:
> >>>> you could try '??panel.Locfit'
> >>>>
> >>>>> ?panel.locfit
> >>>>
> >>>>
> >>>> {locfit}        R Documentation
> >>>> Locfit panel function
> >>>>
> >>>> Description
> >>>>
> >>>> This panel function can be used to add locfit fits to plots
> >>>> generated by
> >>>> trellis.
> >>>>
> >>>>
> >>>>
> >>>>> I am trying to construct a function/s to cover as many of the normal
> >>>>> situations as possible.
> >>>>> Usually I have to amend colours lines etc to distinguish the data.
> >>>>>
> >>>>> I want to cover a number of situations
> >>>>> 1 Conditioned by panel no groups
> >>>>> 2 Conditioned by panel and groups.
> >>>>> 3 Multiple values for above - to show colleagues (EDA)
> >>>>> 4 Conditioned by panel and groups + an overall fit for all the
> >>>>> data within
> >>>>> a panel
> >>>>> 5 Several y values in a panel eg Y1+Y2 and outer = FALSE with a
> >>>>> fit for
> >>>>> each of Y1 and Y2
> >>>>>
> >>>>> I am trying to cover as many of the above situations in 1 function
> >>>>> before
> >>>>> resulting to trellis.focus or
> >>>>> overlaying. The graphs that I normally create are not simple,
> >>>>> generally
> >>>>> involving useOuterStrips
> >>>>> which may have different y scales for panel rows (combindeLimits/
> >>>>> manual)
> >>>>> and different panel row heights.
> >>>>>
> >>>>> locfit is like loess but 2 arguments for smoothing; the degree of
> >>>>> smoothing produced by the defaults
> >>>>> is approximately that of loess but I normally need less smoothing
> >>>>> (the
> >>>>> same would be apply for loess).
> >>>>>
> >>>>> Most of the questions to Rhelp are for 1 with just a small number
> >>>>> for 5
> >>>>> and they are not applicable here
> >>>>> and understanding the requirements for passing arguments in these
> >>>>> different situations I find difficult.
> >>>>> I would like to reduce the number of panel functions to the
> >>>>> minimum to
> >>>>> cover the general situaltions because
> >>>>> my graphs are usually not normal and then add to them for a
> >>>>> particular
> >>>>> situation.
> >>>>>
> >>>>> Regards
> >>>>>
> >>>>> Duncan
> >>>>>
> >>>>>
> >>>>> At 01:38 21/04/2012, you wrote:
> >>>>>>
> >>>>>>
> >>>>>> Duncan,
> >>>>>> First off, I admit it is not clear to me what you are trying to
> >>>>>> achieve and more importantly, why? by "why" I mean 1) I don't see
> >>>>>> the
> >>>>>> advantage of writing one general panel function for completely
> >>>>>> different situations (one/multiple smoothers, grouping levels
> >>>>>> etc.) 2)
> >>>>>> your intended result as I understand it seems rather cluttered,
> >>>>>> google
> >>>>>> <chartjunk>. 3) I am unfamiliar with locfit package, but are we
> >>>>>> reinventing the wheel here ? i.e. will modifying settings in
> >>>>>> xyplot(y
> >>>>>> ~x, xx, groups = Farm, type=c('p','smooth')) achieve the same ?
> >>>>>>
> >>>>>> With your initial reproducible example (thank you) it was easy to
> >>>>>> eliminate the errors, but clearly the resulting plots are not
> >>>>>> what you
> >>>>>> intended (continue inline):
> >>>>>>
> >>>>>> On Thu, Apr 19, 2012 at 4:23 PM, Duncan Mackay <mackay at northnet.com.au
> >>>>>> >
> >>>>>> wrote:
> >>>>>> <snip>
> >>>>>>>
> >>>>>>> 3. What I want to be able to add in the above is extra lines with
> >>>>>>> different
> >>>>>>> values of nn.
> >>>>>>>  I think I will have to modify panel.Locfit so that it goes
> >>>>>>> through
> >>>>>>> different values of nn in each of the panels and groups if I want
> >>>>>>> different
> >>>>>>> colours for extra lines with different nn values
> >>>>>>
> >>>>>>
> >>>>>> Yes you could. There are several options:
> >>>>>> add group.number to the arguments of panel.locfit and use it to
> >>>>>> make
> >>>>>> nn a vector, along the lines of
> >>>>>>  panel.foo <- function(x,y,group.number,theta,...){
> >>>>>>    smpar <- theta[group.number]
> >>>>>>    panel.loess(x,y,smpar,...)
> >>>>>>    panel.xyplot(x,y,...)
> >>>>>>  }
> >>>>>>
> >>>>>> xyplot (y ~ x ,xx ,group
> >>>>>> =Farm,theta=c(4,1,.4),panel=panel.superpose,panel.groups=panel.foo)
> >>>>>>
> >>>>>> # or
> >>>>>> xyplot(y~x|Farm,xx,group=Padd,theta=c(.6,1),
> >>>>>>  panel=panel.superpose,panel.groups=panel.foo)
> >>>>>>
> >>>>>> Here you will need to modify the Farm group to 6 levels - 3*two
> >>>>>> smoothers.
> >>>>>>
> >>>>>> You could make nn a list and loop over it inside the panel
> >>>>>> function.
> >>>>>> Looks like you tried something like that with specifying 2
> >>>>>> panel.Locfit, one suggestion to your code:
> >>>>>>
> >>>>>>                   panel.Locfit(x,y,...) # default 0.7
> >>>>>>                      panel.Locfit(x,y,nn=0.9)   # i.e. remove the
> >>>>>> ... to avoid clashes
> >>>>>>
> >>>>>> Finally, use ?trellis.focus to plot the second smoother "post-hoc".
> >>>>>> also the latticeExtra package has many useful tools to create
> >>>>>> layers
> >>>>>> of the same (or different) plot with different settings.
> >>>>>>
> >>>>>>> 4 Produce an extra line for a fit for all the groups in 1/2+
> >>>>>>> panels.
> >>>>>>>  As for 3 but I do not know how to group all the x and y's  for
> >>>>>>> each
> >>>>>>> of the
> >>>>>>> panes using panel.groups
> >>>>>>
> >>>>>>
> >>>>>> Why does it matter ? seems you have failed to learn the lesson from
> >>>>>> the first post - the same functionality applies to 1 as to multiple
> >>>>>> panels. Does each panel have a different grouping structure ? use
> >>>>>> packet.number() for panels similar to group.number idea.
> >>>>>>
> >>>>>>> I need to do this and then scale up for a panel function to
> >>>>>>> include
> >>>>>>> confidence bands
> >>>>>>
> >>>>>>
> >>>>>> than expand the xlim,ylim or scales in ?xyplot
> >>>>>>
> >>>>>>>
> >>>>>>> For the record making Farm and Padd factors. With 1 panel and
> >>>>>>> groups =
> >>>>>>> Farm
> >>>>>>> works with the extra line the same colour for its group
> >>>>>>> a similar situation for the three panels when conditioned by
> >>>>>>> Farm and
> >>>>>>> groups
> >>>>>>> = Pad
> >>>>>>
> >>>>>>
> >>>>>> ????
> >>>>>>
> >>>>>> Like I said I am a little lost on this problem but I hope this
> >>>>>> helps
> >>>>>> giving some direction.
> >>>>>> Cheers
> >>>>>>
> >>>>>>
> >>>>>>>
> >>>>>>>  xyplot(y ~x, xx,
> >>>>>>>        groups = Farm,
> >>>>>>>
> >>>>>>>        par.settings = list(strip.background = list(col =
> >>>>>>> "transparent"),
> >>>>>>>                            superpose.line   = list(col =
> >>>>>>> c("black","grey"),
> >>>>>>>                                                            lwd =
> >>>>>>> c(1,2,3),
> >>>>>>>                                                            lty =
> >>>>>>> c(2,1,3)),
> >>>>>>>                            superpose.symbol = list(cex = c(0.8,
> >>>>>>> 0.7,0.7),
> >>>>>>>                                                    col =
> >>>>>>> c("red","black","blue"),
> >>>>>>>                                                    pch =
> >>>>>>> c(20,4,16))
> >>>>>>>                  ),
> >>>>>>>        auto.key=list(lines=T,points = T,rectangles=F),
> >>>>>>>
> >>>>>>>        panel  = panel.superpose,
> >>>>>>>        panel.groups=function(x,y, ...){
> >>>>>>>
> >>>>>>>                       panel.xyplot(x,y,...)
> >>>>>>>                       panel.Locfit(x,y,...) # default 0.7
> >>>>>>>                       panel.Locfit(x,y,nn=0.9,...)
> >>>>>>>
> >>>>>>>                     }
> >>>>>>>  ) ## xyplot
> >>>>>>>
> >>>>>>>
> >>>>>>> Regards
> >>>>>>>
> >>>>>>> Duncan
> >>>>>>>
> >>>>>>>
> >>>>>>> At 02:12 20/04/2012, you wrote:
> >>>>>>>>
> >>>>>>>>
> >>>>>>>> On Thu, Apr 19, 2012 at 2:30 AM, Duncan Mackay
> >>>>>>>> <mackay at northnet.com.au>
> >>>>>>>> wrote:
> >>>>>>>>>
> >>>>>>>>> Hi
> >>>>>>>>>
> >>>>>>>>>  xyplot(y ~x|Farm,xx,
> >>>>>>>>>        groups = Padd,
> >>>>>>>>>        panel = panel.superpose,
> >>>>>>>>>        panel.groups=function(x,y, ...){
> >>>>>>>>>                       panel.Locfit(x,y,...)
> >>>>>>>>>                       panel.xyplot(x,y,...)
> >>>>>>>>>                     }
> >>>>>>>>>  ) ## xyplot
> >>>>>>>>>
> >>>>>>>>> The above works nicely and also without par.setting giving
> >>>>>>>>> lattice
> >>>>>>>>> defaults.
> >>>>>>>>> The par.setting is handy for a lot of graphs that I do.
> >>>>>>>>>
> >>>>>>>>> But when I tried a 1 panel plot I get the error message.
> >>>>>>>>>
> >>>>>>>>>  xyplot(y ~x,xx,
> >>>>>>>>>        groups = Farm,
> >>>>>>>>>        auto.key=TRUE,
> >>>>>>>>>        panel = function(x,y, ...){
> >>>>>>>>>
> >>>>>>>>>                       panel.Locfit(x,y,...)
> >>>>>>>>>                       panel.xyplot(x,y,...)
> >>>>>>>>>                     }
> >>>>>>>>>        )
> >>>>>>>>
> >>>>>>>>
> >>>>>>>> These two plots are NOT THE SAME. Did you want the same as the
> >>>>>>>> first
> >>>>>>>> but with groups being Farm and Padd ignored ? in that case you
> >>>>>>>> (again)
> >>>>>>>> need a panel.groups:
> >>>>>>>>
> >>>>>>>>  xyplot(y ~x,xx,
> >>>>>>>>      groups = Farm,
> >>>>>>>>      auto.key=TRUE,
> >>>>>>>>      panel = panel.superpose,panel.groups=function(x,y,...){
> >>>>>>>>                     panel.Locfit(x,y,...)
> >>>>>>>>                     panel.xyplot(x,y,...)
> >>>>>>>>                   }
> >>>>>>>>      )
> >>>>>>>>
> >>>>>>>>
> >>>>>>>>> If I want to plot another curve with different smoothing
> >>>>>>>>> but gives an error message without par.settings if i want to add
> >>>>>>>>>                       panel.Locfit(x,y,nn= 0.9,lwd =
> >>>>>>>>> c(1,2,3), ...)
> >>>>>>>>>
> >>>>>>>>> Error using packet 1
> >>>>>>>>> formal argument "Iwd" matched by multiple actual arguments
> >>>>>>>>
> >>>>>>>>
> >>>>>>>> It is all in the way you initially specified how to pass the
> >>>>>>>> arguments
> >>>>>>>> for panel.Locfit. This works without error:
> >>>>>>>>
> >>>>>>>>  xyplot(y ~x,xx,
> >>>>>>>>      groups = Farm,
> >>>>>>>>      auto.key=TRUE,lwd=1:3,
> >>>>>>>>      panel = panel.superpose,panel.groups=function(x,y,nn,...){
> >>>>>>>>                     panel.Locfit(x,y,nn=.9,...)
> >>>>>>>>                     panel.xyplot(x,y,...)
> >>>>>>>>                   }
> >>>>>>>>      )
> >>>>>>>>
> >>>>>>>>
> >>>>>>>> HTH
> >>>>>>>>
> >>>>>>>>
> >>>>>>>>
> >>>>>>>>> I also need to plot a smoothed line for all groups trying
> >>>>>>>>> groups,
> >>>>>>>>> subscripts
> >>>>>>>>> and panel.groups as arguments without success
> >>>>>>>>>
> >>>>>>>>> Any solutions to solve the above will be gratefully received and
> >>>>>>>>> faithfully
> >>>>>>>>> applied.
> >>>>>>>>>
> >>>>>>>>> Duncan
> >>>>>>>>>
> >>>>>>>>> sessionInfo()
> >>>>>>>>> R version 2.15.0 (2012-03-30)
> >>>>>>>>> Platform: i386-pc-mingw32/i386 (32-bit)
> >>>>>>>>>
> >>>>>>>>> locale:
> >>>>>>>>> [1] LC_COLLATE=English_Australia.1252
> >>>>>>>>>  LC_CTYPE=English_Australia.1252
> >>>>>>>>> LC_MONETARY=English_Australia.1252 LC_NUMERIC=C
> >>>>>>>>> LC_TIME=English_Australia.1252
> >>>>>>>>>
> >>>>>>>>> attached base packages:
> >>>>>>>>> [1] datasets  utils     stats     graphics  grDevices grid
> >>>>>>>>>  methods
> >>>>>>>>> base
> >>>>>>>>>
> >>>>>>>>> other attached packages:
> >>>>>>>>> [1] locfit_1.5-7        R.oo_1.9.3          R.methodsS3_1.2.2
> >>>>>>>>> foreign_0.8-49
> >>>>>>>>>     chron_2.3-42        MASS_7.3-17 latticeExtra_0.6-19
> >>>>>>>>> RColorBrewer_1.0-5
> >>>>>>>>> [9] lattice_0.20-6
> >>>>>>>>>
> >>>>>>>>> loaded via a namespace (and not attached):
> >>>>>>>>> [1] tools_2.15.0
> >>>>>>>>>
> >>>>>>>>>
> >>>>
> >>>>
> >>>>
> >>>> David Winsemius, MD
> >>>> West Hartford, CT
> >>>>
> >>>>
> >>>> ______________________________________________
> >>>> 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.
> >>
> >>
> >> David Winsemius, MD
> >> West Hartford, CT
> >>
> >
> > ______________________________________________
> > 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.
>
>
>
>--
>
>Bert Gunter
>Genentech Nonclinical Biostatistics
>
>Internal Contact Info:
>Phone: 467-7374
>Website:
>http://pharmadevelopment.roche.com/index/pdb/pdb-functional-groups/pdb-biostatistics/pdb-ncb-home.htm



More information about the R-help mailing list