Rolf Turner
2015-Jan-31 08:39 UTC
[R] How to use curve() function without using x as the variable name inside expression?
On 31/01/15 21:10, C W wrote:> Hi Bill, > > One quick question. What if I wanted to use curve() for a uniform > distribution? > > Say, unif(0.5, 1.3), 0 elsewhere. > > My R code: > func <- function(min, max){ > 1 / (max - min) > } > > curve(func(min = 0.5, max = 1.3), from = 0, to = 2) > > curve() wants an expression, but I have a constant. And I want zero > everywhere else.Well if that's what you want, then say so!!! func <- function(x,min,max) { ifelse(x < min | x > max, 0, 1/(max - min)) } curve(func(u,0.5,1.3),0,2,xname="u") Or, better (?) curve(func(u,0.5,1.3),0,2,xname="u",type="s") which avoids the slight slope in the "vertical" lines. cheers, Rolf Turner -- Rolf Turner Technical Editor ANZJS Department of Statistics University of Auckland Phone: +64-9-373-7599 ext. 88276 Home phone: +64-9-480-4619
peter dalgaard
2015-Jan-31 08:58 UTC
[R] How to use curve() function without using x as the variable name inside expression?
> On 31 Jan 2015, at 09:39 , Rolf Turner <r.turner at auckland.ac.nz> wrote: > > On 31/01/15 21:10, C W wrote: >> Hi Bill, >> >> One quick question. What if I wanted to use curve() for a uniform >> distribution? >> >> Say, unif(0.5, 1.3), 0 elsewhere. >> >> My R code: >> func <- function(min, max){ >> 1 / (max - min) >> } >> >> curve(func(min = 0.5, max = 1.3), from = 0, to = 2) >> >> curve() wants an expression, but I have a constant. And I want zero >> everywhere else. > > Well if that's what you want, then say so!!! > > func <- function(x,min,max) { > ifelse(x < min | x > max, 0, 1/(max - min)) > } >Oy! help(Uniform) called. I wants its density function back...> curve(func(u,0.5,1.3),0,2,xname="u") > > Or, better (?) curve(func(u,0.5,1.3),0,2,xname="u",type="s") > > which avoids the slight slope in the "vertical" lines.It might put the verticals in the wrong place though. I usually just increase the "n" parameter: curve(dunif(u,.5, 1.3), from=0, to=2, n=5001, xname="u") -- Peter Dalgaard, Professor, Center for Statistics, Copenhagen Business School Solbjerg Plads 3, 2000 Frederiksberg, Denmark Phone: (+45)38153501 Email: pd.mes at cbs.dk Priv: PDalgd at gmail.com
Philippe Grosjean
2015-Jan-31 09:03 UTC
[R] How to use curve() function without using x as the variable name inside expression?
Also note that ifelse() should be avoided as much as possible. To define a piecewise function you can use this trick: func <- function (x, min, max) 1/(max-min) * (x >= min & x <= max) The performances are much better. This has no impact here, but it is a good habit to take in case you manipulate such kind of functions in a more computing-intensive context (numerical integration, nls(), etc.). funcIfElse <- function (x, min, max) ifelse(x < min | x > max, 0, 1/(max - min)) min <- 100; max <- 200; x <- 1:300 microbenchmark::microbenchmark(func(x, min, max), funcIfElse(x, min, max)) ## Unit: microseconds ## expr min lq mean median uq max neval ## func(x, min, max) 10.242 16.0175 18.43348 18.446 19.8680 47.266 100 ## funcIfElse(x, min, max) 90.386 125.1605 148.18555 143.455 148.6695 1203.292 100 Best, Philippe Grosjean> On 31 Jan 2015, at 09:39, Rolf Turner <r.turner at auckland.ac.nz> wrote: > > On 31/01/15 21:10, C W wrote: >> Hi Bill, >> >> One quick question. What if I wanted to use curve() for a uniform >> distribution? >> >> Say, unif(0.5, 1.3), 0 elsewhere. >> >> My R code: >> func <- function(min, max){ >> 1 / (max - min) >> } >> >> curve(func(min = 0.5, max = 1.3), from = 0, to = 2) >> >> curve() wants an expression, but I have a constant. And I want zero >> everywhere else. > > Well if that's what you want, then say so!!! > > func <- function(x,min,max) { > ifelse(x < min | x > max, 0, 1/(max - min)) > } > > curve(func(u,0.5,1.3),0,2,xname="u") > > Or, better (?) curve(func(u,0.5,1.3),0,2,xname="u",type="s") > > which avoids the slight slope in the "vertical" lines. > > cheers, > > Rolf Turner > > -- > Rolf Turner > Technical Editor ANZJS > Department of Statistics > University of Auckland > Phone: +64-9-373-7599 ext. 88276 > Home phone: +64-9-480-4619 > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > 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.
Ben Tupper
2015-Jan-31 14:39 UTC
[R] How to use curve() function without using x as the variable name inside expression?
Hi Philippe,
Ah! Thanks for pointing out the pesky ifelse() issue. I have only recently
been learning (the hard way) that ifelse() is not a tool for the uninformed like
me, but it is ever so tempting!
I would like to offer another way to speed things up. findInterval() can be
quite fast, and the speed up is most noticeable when the size of the input grows
(note I made input x <- 1:3000).
func <- function (x, mn, mx) 1/(mx-mn) * (x >= mn & x <= mx)
funcIfElse <- function (x, mn, mx) ifelse(x < mn | x > mx, 0, 1/(mx -
mn))
funcFindInterval <- function(x, mn, mx) 1/(mx - mn) * (findInterval(x, c(mn,
mx), rightmost.closed = TRUE) == 1)
mn<- 100; mx <- 200; x <- 1:3000
microbenchmark::microbenchmark(func(x, mn, mx), funcIfElse(x, mn, mx),
funcFindInterval(x, mn, mx))
#Unit: microseconds
# expr min lq mean median uq
max neval
# func(x, mn, mx) 74.920 76.006 88.57119 76.5635 78.7065
897.333 100
# funcIfElse(x, mn, mx) 728.388 733.206 832.02225 735.4280 796.1910
1645.804 100
# funcFindInterval(x, mn, mx) 33.954 35.334 56.57323 36.5010 38.3340
993.193 100
r1 <- func(x, mn, mx)
r2 <- funcIfElse(x, mn, mx)
r3 <- funcFindInterval(x, mn, mx)
identical(r1, r2)
#[1] TRUE
identical(r2, r3)
#[1] TRUE
Cheers,
Ben
On Jan 31, 2015, at 4:03 AM, Philippe Grosjean <phgrosjean at
sciviews.org> wrote:
> Also note that ifelse() should be avoided as much as possible. To define a
piecewise function you can use this trick:
>
> func <- function (x, min, max) 1/(max-min) * (x >= min & x <=
max)
>
> The performances are much better. This has no impact here, but it is a good
habit to take in case you manipulate such kind of functions in a more
computing-intensive context (numerical integration, nls(), etc.).
>
> funcIfElse <- function (x, min, max) ifelse(x < min | x > max, 0,
1/(max - min))
> min <- 100; max <- 200; x <- 1:300
> microbenchmark::microbenchmark(func(x, min, max), funcIfElse(x, min, max))
> ## Unit: microseconds
> ## expr min lq mean
median uq max neval
> ## func(x, min, max) 10.242 16.0175 18.43348 18.446 19.8680
47.266 100
> ## funcIfElse(x, min, max) 90.386 125.1605 148.18555 143.455 148.6695
1203.292 100
>
> Best,
>
> Philippe Grosjean
>
>> On 31 Jan 2015, at 09:39, Rolf Turner <r.turner at
auckland.ac.nz> wrote:
>>
>> On 31/01/15 21:10, C W wrote:
>>> Hi Bill,
>>>
>>> One quick question. What if I wanted to use curve() for a uniform
>>> distribution?
>>>
>>> Say, unif(0.5, 1.3), 0 elsewhere.
>>>
>>> My R code:
>>> func <- function(min, max){
>>> 1 / (max - min)
>>> }
>>>
>>> curve(func(min = 0.5, max = 1.3), from = 0, to = 2)
>>>
>>> curve() wants an expression, but I have a constant. And I want
zero
>>> everywhere else.
>>
>> Well if that's what you want, then say so!!!
>>
>> func <- function(x,min,max) {
>> ifelse(x < min | x > max, 0, 1/(max - min))
>> }
>>
>> curve(func(u,0.5,1.3),0,2,xname="u")
>>
>> Or, better (?)
curve(func(u,0.5,1.3),0,2,xname="u",type="s")
>>
>> which avoids the slight slope in the "vertical" lines.
>>
>> cheers,
>>
>> Rolf Turner
>>
>> --
>> Rolf Turner
>> Technical Editor ANZJS
>> Department of Statistics
>> University of Auckland
>> Phone: +64-9-373-7599 ext. 88276
>> Home phone: +64-9-480-4619
>>
>> ______________________________________________
>> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
>> 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.
>
> ______________________________________________
> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
> 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.