On Tue, Jan 31, 2012 at 01:59:13PM -0500, Val wrote: > Hi petr, > > >Can the required density be understood as a piecewise > >linear function going through 4 or 5 given points? > > That is my problem. The function should be nonlinear. However, we can break > it down to the first 3 or 4 points could be linear and then nonlinear > function. On the later points can we apply sort of spline function or local > polynomials?
Hi. Generating numbers from a distribution, whose inverse distribution function is given by a spline, can be done as follows. library(splines) #prepare a spline for the inverse distribution function eps <- 0.27 xorig <- c(0, 0.1, 0.4, 0.6, 0.9, 1) yorig <- cumsum(c(0, 1, 1 + eps, 1 - 2*eps, 1 + eps, 1)) ispl <- interpSpline(xorig, yorig) #generate random sample z <- predict(ispl, runif(100))$y #plot the distribution function and original points invDist <- predict(ispl, seq(0, 1, length=501)) plot(invDist$y, invDist$x, type="l") points(yorig, xorig, col=2) #plot the density function invDeriv <- predict(ispl, seq(0, 1, length=501), deriv=1) xDensity <- invDist$y yDensity <- 1/invDeriv$y plot(xDensity, yDensity, type="l") The density function in the above example is bimodal, but in order to make it close to your graphs, the original points xorig, yorig should be changed. Note that the letters x, y correspond to the usual notation for the spline. Since the spline expresses the inverse distribution function, x and y are exchanged for the plots. Hope this helps. Petr Savicky. ______________________________________________ R-help@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.