[R] Fwd: User defined panel functions in lattice

David Winsemius dwinsemius at comcast.net
Sat Apr 21 04:15:18 CEST 2012


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