Re: [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 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 > ## exprmin 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 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@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@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@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.
Re: [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 ## exprmin 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 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@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@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.
Re: [R] How to use curve() function without using x as the variable name inside expression?
> On 31 Jan 2015, at 09:39 , Rolf Turner 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@cbs.dk Priv: pda...@gmail.com __ R-help@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.
Re: [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 __ R-help@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.
Re: [R] How to use curve() function without using x as the variable name inside expression?
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. Thanks, Mike On Thu, Jan 29, 2015 at 10:34 PM, C W wrote: > Hi Bill, > > You solved by problem. For some reason, I thought xname was only > referring to name of the x-axis. > > I remember last time I fixed it, it was something about xname, couldn't > get it right this time. > > Thanks! Saved me hours from frustration. > > Mike > > On Thu, Jan 29, 2015 at 9:04 PM, William Dunlap wrote: > >> Does >>help(curve) >> talk about its 'xname' argument? >> >> Try >>curve(10*foofoo, from=0, to=17, xname="foofoo") >> >> You will have to modify your function, since curve() will >> call it once with a long vector for the independent variable >> and func(rnorm(10), rnorm(10), mu=seq(0,5,len=501)) won't >> work right. >> >> >> Bill Dunlap >> TIBCO Software >> wdunlap tibco.com >> >> On Thu, Jan 29, 2015 at 5:43 PM, C W wrote: >> >>> Hi Rui, >>> >>> Thank you for your help. That works for now, but eventually, I need to >>> be >>> pass in x and y. >>> >>> Is there a way to tell the curve() function, x is a fix vector, mu is a >>> variable! >>> >>> Thanks, >>> >>> Mike >>> >>> On Thu, Jan 29, 2015 at 5:25 PM, Rui Barradas >>> wrote: >>> >>> > Hello, >>> > >>> > The following will work, but I don't know if it's what you want. func2 >>> > will get x and y from the global environment. >>> > >>> > func2 <- function(mu){ >>> >x + y + mu ^ 2 >>> > } >>> > >>> > curve(func2, from = 0, to = 10) >>> > >>> > >>> > Hope this helps, >>> > >>> > Rui Barradas >>> > >>> > Em 29-01-2015 21:02, C W escreveu: >>> > >>> >> Hi all, >>> >> >>> >> I want to graph a curve as a function of mu, not x. >>> >> >>> >> Here's the R code: >>> >> >>> >> x <- rnorm(10) >>> >> y <- rnorm(10) >>> >> >>> >> func <- function(x, y, mu){ >>> >> x + y + mu ^ 2 >>> >> } >>> >> >>> >> curve(f = func(x = x, y = y, mu), from = 0, to = 10) >>> >> I know I can change variable mu to x, but is there a way to tell R >>> that mu >>> >> is the variable of interest, not x. >>> >> >>> >> Thanks in advance, >>> >> >>> >> Mike >>> >> >>> >> [[alternative HTML version deleted]] >>> >> >>> >> __ >>> >> R-help@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. >>> >> >>> >> >>> >>> [[alternative HTML version deleted]] >>> >>> __ >>> R-help@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. >>> >> >> > [[alternative HTML version deleted]] __ R-help@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.
Re: [R] How to use curve() function without using x as the variable name inside expression?
Hi Bill, You solved by problem. For some reason, I thought xname was only referring to name of the x-axis. I remember last time I fixed it, it was something about xname, couldn't get it right this time. Thanks! Saved me hours from frustration. Mike On Thu, Jan 29, 2015 at 9:04 PM, William Dunlap wrote: > Does >help(curve) > talk about its 'xname' argument? > > Try >curve(10*foofoo, from=0, to=17, xname="foofoo") > > You will have to modify your function, since curve() will > call it once with a long vector for the independent variable > and func(rnorm(10), rnorm(10), mu=seq(0,5,len=501)) won't > work right. > > > Bill Dunlap > TIBCO Software > wdunlap tibco.com > > On Thu, Jan 29, 2015 at 5:43 PM, C W wrote: > >> Hi Rui, >> >> Thank you for your help. That works for now, but eventually, I need to be >> pass in x and y. >> >> Is there a way to tell the curve() function, x is a fix vector, mu is a >> variable! >> >> Thanks, >> >> Mike >> >> On Thu, Jan 29, 2015 at 5:25 PM, Rui Barradas >> wrote: >> >> > Hello, >> > >> > The following will work, but I don't know if it's what you want. func2 >> > will get x and y from the global environment. >> > >> > func2 <- function(mu){ >> >x + y + mu ^ 2 >> > } >> > >> > curve(func2, from = 0, to = 10) >> > >> > >> > Hope this helps, >> > >> > Rui Barradas >> > >> > Em 29-01-2015 21:02, C W escreveu: >> > >> >> Hi all, >> >> >> >> I want to graph a curve as a function of mu, not x. >> >> >> >> Here's the R code: >> >> >> >> x <- rnorm(10) >> >> y <- rnorm(10) >> >> >> >> func <- function(x, y, mu){ >> >> x + y + mu ^ 2 >> >> } >> >> >> >> curve(f = func(x = x, y = y, mu), from = 0, to = 10) >> >> I know I can change variable mu to x, but is there a way to tell R >> that mu >> >> is the variable of interest, not x. >> >> >> >> Thanks in advance, >> >> >> >> Mike >> >> >> >> [[alternative HTML version deleted]] >> >> >> >> __ >> >> R-help@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. >> >> >> >> >> >> [[alternative HTML version deleted]] >> >> __ >> R-help@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. >> > > [[alternative HTML version deleted]] __ R-help@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.
Re: [R] How to use curve() function without using x as the variable name inside expression?
Does help(curve) talk about its 'xname' argument? Try curve(10*foofoo, from=0, to=17, xname="foofoo") You will have to modify your function, since curve() will call it once with a long vector for the independent variable and func(rnorm(10), rnorm(10), mu=seq(0,5,len=501)) won't work right. Bill Dunlap TIBCO Software wdunlap tibco.com On Thu, Jan 29, 2015 at 5:43 PM, C W wrote: > Hi Rui, > > Thank you for your help. That works for now, but eventually, I need to be > pass in x and y. > > Is there a way to tell the curve() function, x is a fix vector, mu is a > variable! > > Thanks, > > Mike > > On Thu, Jan 29, 2015 at 5:25 PM, Rui Barradas > wrote: > > > Hello, > > > > The following will work, but I don't know if it's what you want. func2 > > will get x and y from the global environment. > > > > func2 <- function(mu){ > >x + y + mu ^ 2 > > } > > > > curve(func2, from = 0, to = 10) > > > > > > Hope this helps, > > > > Rui Barradas > > > > Em 29-01-2015 21:02, C W escreveu: > > > >> Hi all, > >> > >> I want to graph a curve as a function of mu, not x. > >> > >> Here's the R code: > >> > >> x <- rnorm(10) > >> y <- rnorm(10) > >> > >> func <- function(x, y, mu){ > >> x + y + mu ^ 2 > >> } > >> > >> curve(f = func(x = x, y = y, mu), from = 0, to = 10) > >> I know I can change variable mu to x, but is there a way to tell R that > mu > >> is the variable of interest, not x. > >> > >> Thanks in advance, > >> > >> Mike > >> > >> [[alternative HTML version deleted]] > >> > >> __ > >> R-help@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. > >> > >> > > [[alternative HTML version deleted]] > > __ > R-help@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. > [[alternative HTML version deleted]] __ R-help@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.
Re: [R] How to use curve() function without using x as the variable name inside expression?
Hi Rui, Thank you for your help. That works for now, but eventually, I need to be pass in x and y. Is there a way to tell the curve() function, x is a fix vector, mu is a variable! Thanks, Mike On Thu, Jan 29, 2015 at 5:25 PM, Rui Barradas wrote: > Hello, > > The following will work, but I don't know if it's what you want. func2 > will get x and y from the global environment. > > func2 <- function(mu){ >x + y + mu ^ 2 > } > > curve(func2, from = 0, to = 10) > > > Hope this helps, > > Rui Barradas > > Em 29-01-2015 21:02, C W escreveu: > >> Hi all, >> >> I want to graph a curve as a function of mu, not x. >> >> Here's the R code: >> >> x <- rnorm(10) >> y <- rnorm(10) >> >> func <- function(x, y, mu){ >> x + y + mu ^ 2 >> } >> >> curve(f = func(x = x, y = y, mu), from = 0, to = 10) >> I know I can change variable mu to x, but is there a way to tell R that mu >> is the variable of interest, not x. >> >> Thanks in advance, >> >> Mike >> >> [[alternative HTML version deleted]] >> >> __ >> R-help@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. >> >> [[alternative HTML version deleted]] __ R-help@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.
Re: [R] How to use curve() function without using x as the variable name inside expression?
Hello, The following will work, but I don't know if it's what you want. func2 will get x and y from the global environment. func2 <- function(mu){ x + y + mu ^ 2 } curve(func2, from = 0, to = 10) Hope this helps, Rui Barradas Em 29-01-2015 21:02, C W escreveu: Hi all, I want to graph a curve as a function of mu, not x. Here's the R code: x <- rnorm(10) y <- rnorm(10) func <- function(x, y, mu){ x + y + mu ^ 2 } curve(f = func(x = x, y = y, mu), from = 0, to = 10) I know I can change variable mu to x, but is there a way to tell R that mu is the variable of interest, not x. Thanks in advance, Mike [[alternative HTML version deleted]] __ R-help@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@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] How to use curve() function without using x as the variable name inside expression?
Hi all, I want to graph a curve as a function of mu, not x. Here's the R code: x <- rnorm(10) y <- rnorm(10) func <- function(x, y, mu){ x + y + mu ^ 2 } curve(f = func(x = x, y = y, mu), from = 0, to = 10) I know I can change variable mu to x, but is there a way to tell R that mu is the variable of interest, not x. Thanks in advance, Mike [[alternative HTML version deleted]] __ R-help@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.