[R] Fwd: User defined panel functions in lattice

Duncan Mackay mackay at northnet.com.au
Sat Apr 21 05:32:13 CEST 2012


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.
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
>



More information about the R-help mailing list