[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