[R] Fwd: User defined panel functions in lattice

Bert Gunter gunter.berton at gene.com
Sat Apr 21 06:31:27 CEST 2012


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