[R] Fwd: User defined panel functions in lattice
Duncan Mackay
mackay at northnet.com.au
Sun Apr 22 04:29:43 CEST 2012
Hi Bert
Thank you for your comments.
I do use latticeExtra a lot - about 50% of my graphs at the moment
have useOuterStrips some involving combineLimits .
Many are complicated - one I have just finished involves
useOuterStrips in 8,3 (r,c) panels after
http://finzi.psych.upenn.edu/R/Rhelp02/archive/43626.html
+ 2 different panel.heights for some of the rows and that is just the start
I have used other functions when needed
I think that I will have to abandon a general function partly on
arguments and the graphs I have done in the past an the possibilities
in the future
I somebody would explain the rules 1 plus many others would be grateful
Duncan
At 00:19 22/04/2012, you wrote:
>Oh ... one more thing.
>
>You might explore the latticeExtra package. It permits use of a
>layering paradigm -- like ggplot -- that largely obviates the need for
>panel functions. There are also options in it to gracefully handle
>(ignore) replicated arguments.
>
>-- Bert
>
>On Sat, Apr 21, 2012 at 2:28 AM, Duncan Mackay <mackay at northnet.com.au> wrote:
> > 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
> >
> >
> > ______________________________________________
> > 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