Skip to content

cumulative density question

2 messages · s viswanath, Spencer Graves

#
Hi,

I am interested in looking at cumulative density functions. If F(x) is a cumulative density of monthly fund returns over the interval of a to b, and I am interested in returns above and below a specified point r, then I would like to find the number that is made up of
 
1.(integral from r to b)(1-F(x))dx  
2. (integral from a to r)(F(x)dx)

3. the ratio of #1/#2 above


In financial literature this ratio has been called the Omega function.

My first guess in obtaining this equation using R
is to use the integrate function but I am have two problems: 

I. can I use a nonparametric density in the integrate function(how?), 
II. how can i get the ratio of #3 above as the integrate function gives the number plus the absolute error
0.9749704 with absolute error < 2.1e-07
so using a ratio  in #3 above i get the following error:
 : non-numeric argument to binary operator



Thank you in advance.
Sri Viswanath
#
1.  I assume you are looking at the cumulative DISTRIBUTION function 
(cdf), F(x), which is the probability that a random variable X is less 
than or equal to x;  the cdf is the integral of the density function. 

    2.  The maximum likelihood nonparametric estimate of the cdf is the 
"empirical cdf" (ecdf) in library(stepfun).  However, this is NOT a 
function appropriate for "integrate".  The following looks like it gives 
me the correct answer: 


pecdf <- function(x, y=1:3, lower.tail=TRUE){
   nx <- length(x)
   F. <- rep(NA, nx)
   for(i in 1:nx){
     F.[i] <- sum(y<=x[i])
   }
   F. <- F./length(y)
   if(lower.tail) F. else (1-F.)
}

pecdf(0:4)
pecdf(0:4, lower.tail=FALSE)

Omega <-
function(r){
  numerator <- integrate(pecdf, 1, r)
  denominator <- integrate(pecdf, r, 3, lower.tail=FALSE)
  numerator$value/denominator$value
}

Omega(2)

      3.  For "data" y = 1:3, I get the following expressions for the 
numerator and denominator: 

      numerator(r) = ((ifelse(r<=2, (5-2*r), (3-r))/3)

      denominator(r) = ((ifelse(r<=2, (r-1), (2*r-3))/3)

One could probably develop a more general form of this for arbitrary "y". 

      hope this helps.  spencer graves
s viswanath wrote: