Search code examples
rstatisticscranuniform-distribution

R function for CDF for Difference of Two Uniform Distributions


I'm having a hard time finding an R function that does what I want. Suppose I have two uniform distributions, A~U[alow,ahigh] and B~U(blow,bhigh).

There's a random variable Z=A-B, the difference between these two uniform distributions. I need a function CDF function for the distribution of Z.

I'd give this function a cutoff value x, and it would return the probability that Z was below the cutoff.

I'm in R, and the function call would ideally look something like this:

UniformDiffCDC(alow,ahigh,blow,bhigh,cutoff)

Unfortunately I don't know where to begin, or whether this has already been implemented in R somewhere. Help!


Solution

  • The basic idea is that the probability density function will form a trepezoid. I don't know of any built in functions for this because it's not a very common distribution, but using a bit of geometry you can solve for the values exactly.

    UniformDiffCDF <- Vectorize(function(alow,ahigh,blow,bhigh,cutoff) {
      breaks <- c(alow-bhigh, ahigh-bhigh, alow-blow, ahigh-blow)
      height <- 2/sum(breaks * c(-1, -1, 1, 1))
      if (cutoff > breaks[4]) return(1) 
      prob <- 0
      if (cutoff < breaks[1]) return(prob) 
      if (cutoff < breaks[2]) {
        prob <- prob + 1/2 * (cutoff - breaks[1]) * approx(breaks[1:2], c(0, height), cutoff)$y
        return(prob)
      } else {
        prob <- prob + 1/2 * (breaks[2]-breaks[1]) * height
      }
      if (cutoff < breaks[3]) {
        prob <- prob + (cutoff-breaks[2])*height
        return(prob)
      } else {
        prob <- prob + (breaks[3]-breaks[2])*height
      }
      tri <- 1/2 * (breaks[4]-breaks[3]) * height
      prob <- prob + tri - 1/2 * (breaks[4]- cutoff) * approx(breaks[4:3], c(0,height), cutoff)$y
      return(prob)  
    }, vectorize.args="cutoff")
    

    So for example

    curve(UniformDiffCDF(5,7,2,6, x), from=-2, to=6)
    

    different of uniforms CDF

    The corresponding PDF would be

    UniformDiffPDF <- Vectorize(function(alow,ahigh,blow,bhigh,cutoff) {
      breaks <- c(alow-bhigh, ahigh-bhigh, alow-blow, ahigh-blow)
      height <- 2/sum(breaks * c(-1, -1, 1, 1))
      if (cutoff > breaks[4]) return(0)
      if (cutoff < breaks[1]) return(0) 
      if (cutoff < breaks[2]) {
        return(approx(breaks[1:2], c(0, height), cutoff)$y)
      }
      if (cutoff < breaks[3]) {
        return(height)
      }
      return(approx(breaks[4:3], c(0,height), cutoff)$y)
    }, vectorize.args="cutoff")
    

    difference of uniforms PDF