Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I extract ecdf values out of ecdfplot()

If I use the ecdfplot() function of the latticeExtra package how do I get the actual values calculated i.e. the y-values which correspond to the ~x|g input?

I've been looking at ?ecdfplot but there's not discription to it. For the usual highlevel function ecdf() it works with the command plot=FALSE but this does not work for ecdfplot().

The reason I want to use ecdfplot() rather than ecdf() is that I need to calculate the ecdf() values for a grouping variable. I know I could do this handish too but I'm quite convinced that there is a highroad too.

Here a small expample

u <- rnorm(100,0,1)
mygroup <- c(rep("group1",50),rep("group2",50))
ecdfplot(~u, groups=mygroup)

enter image description here

I would like to extract the y-values given each group for the corresponding x-values.

like image 709
Druss2k Avatar asked Dec 06 '22 12:12

Druss2k


2 Answers

If you stick with the ecdf() function in the base package, you can simply do as follows:

  1. Create ecdf function with your data:

    fun.ecdf <- ecdf(x) # x is a vector of your data
    
  2. Now use this "ecdf function" to generate the cumulative probabilities of any vector you feed it, including your original, sorted data:

    my.ecdf <- fun.ecdf(sort(x))
    
like image 167
Joel S Avatar answered Dec 28 '22 08:12

Joel S


I know you said you don't want to use ecdf, but in this case it is much easier to use it than to get the data out of the trellis object that ecdfplot returns. (After all, that's all that ecdfplot is doing- it's just doing it behind the scenes).

In the case of your example, the following will get you a matrix of the y values (where x is your entire input u, though you could choose a different one) for each ECDF:

ecdfs = lapply(split(u, mygroup), ecdf)
ys = sapply(ecdfs, function(e) e(u))
# output:
#       group1 group2
#  [1,]   0.52   0.72
#  [2,]   0.68   0.78
#  [3,]   0.62   0.78
#  [4,]   0.66   0.78
#  [5,]   0.72   0.80
#  [6,]   0.86   0.94
#  [7,]   0.10   0.26
#  [8,]   0.90   0.94
# ...

ETA: If you just want each column to correspond to the 50 x-values in that column, you could do:

ys = sapply(split(u, mygroup), function(g) ecdf(g)(g))

(Note that if the number of values in each group aren't identical, this will end up as a list rather than a matrix with columns).

like image 32
David Robinson Avatar answered Dec 28 '22 08:12

David Robinson