Applying a function to a vector
On Mon, 31 Oct 2005, Thomas Lumley wrote:
On Mon, 31 Oct 2005, Florent Bresson wrote:
I just have a try with sapply. The problem is that my function pbeta2 has two parameters z and p (wich is a vector of two parameters). If I use sapply , R returns a message incicating that parameter p is missing. It is a problem since both z and p are varying along my data.frame.
You would need mapply(). It won't help, though. Most of the time is presumably being spent in all the calls to integrate, so mapply() or sapply() won't be much faster than a loop. According to Google, the VGAM R package http://www.stat.auckland.ac.nz/~yee/ claims to have the beta distributions of the second kind.
It has ML fitting for such distributions. I think a reasonable answer is to make a function to approximate the indefinite integral via linear or spline interpolation. Then you can replace 22,000 numerical integrations by interpolation from a few hundred values (at most).
On Mon, 31 Oct 2005, Florent Bresson wrote:
beta distribution of the second kind (the existing beta distribution of th stats package is the beta distribution of the first kind). It works perfectly for a single value, but I want to apply it to a
vector
of 22 000 values. I can use a loop for the
calculation
of each value but it runs very very slowly. So, what can I change ? Here's the function : p <- c(1,1) y <- 1 z <- 1 truc <- function(y)
{y^(p[1]-1)/(1+y)^(p[1]+p[2])}
pbeta2 <- function(z,p) 1/beta(p[1],p[2])*integrate(truc,0,z)$value machin <- pbeta2(vector,p) just return a single
value
Brian D. Ripley, ripley at stats.ox.ac.uk Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/ University of Oxford, Tel: +44 1865 272861 (self) 1 South Parks Road, +44 1865 272866 (PA) Oxford OX1 3TG, UK Fax: +44 1865 272595