[R] Direction and scaling of cumulative distribution in ecdfplot

Jeff Stevens stev0175 at googlemail.com
Mon Mar 15 13:18:54 CET 2010


Hi Ken,

Many thanks for the solution to plotting the log-log scale cumulative 
distribution function Pr(X>=x).  With a minor tweak (adding scales 
argument) and renaming to fit your example, it worked.

x <- c(0.23, 0.09, 0.05, 0.02, 0.38, 1, 0.04, 0.01, 0.17, 0.04, 0.01, 
0.17, 0.5)
F <- c(rep(1, 5), rep(2, 4), rep(3, 4))
ecdflt <- function(x) {
	cdf <- as.vector(
	sapply(sort(x, decreasing = TRUE),
               function(y) sum(x >= y)/length(x))
	)
	cbind(sort(x, decreasing = TRUE), cdf)
	}
	
panel.ecdflt <- function(x, logY = TRUE, ...) {
	xy <- ecdflt(x)
	if (logY) xy[, 2] <- log10(xy[, 2])
	panel.xyplot(xy[, 1], xy[, 2], ...)
	}

xyplot(x ~ x | F, scales = list(y = list(log = TRUE), x = list(log = TRUE)),
	panel = function(x, y = NULL, ...){
	panel.ecdflt(x, ...)
	})

Cheers,
Jeff


Ken Knoblauch wrote:
> Jeff Stevens <stev0175 <at> googlemail.com> writes:
>> I have two questions regarding the ecdfplot function in the
>> latticeExtra package.
>> 1. How can I plot the fraction of values >= x rather than <=x, like
>> the what = "1-F" argument in the Ecdf function in the Hmisc package?
>>
>> 2. When I try to log-transform the y-axis, I get a warning that it
>> can't have log Y-scale, and it fails to scale properly:
>> How can I log-transform the y-axis in ecdfplot?  Here is a test
>> example of my analysis in R version 2.10.1 in Ubuntu 9.10:
>>> resp <- c(0.23, 0.09, 0.05, 0.02, 0.38, 1, 0.04, 0.01, 0.17, 0.04, 0.01, 
> 0.17, 0.5)
>>> id <- c(rep(1, 5), rep(2, 4), rep(3, 4))
>>> testdata <- data.frame(id, resp)
>>> ecdfplot(~resp | id, data = testdata, scales = list(x = list(relation = 
> "free",
>  log = TRUE),y = list(log =
>> TRUE)), type = "p")
>> Warning message:
>> In densityplot.formula(x = ~resp | id, data = list(id = c(1, 1,  :
>>   Can't have log Y-scale
> 
> If I understand what you are trying to do, I put this together
> a while back (which was not optimal but it worked at the
> time), but I haven't tested it since.
> 
> ecdflt <- function(x) {
> 	cdf <- as.vector(
> 	sapply(sort(x, decreasing = TRUE), 
>               function(y) sum(x >= y)/length(x))
> 	)
> 	cbind(sort(x, decreasing = TRUE), cdf)
> 	}
> 	
> panel.ecdflt <- function(x, logY = TRUE, ...) {
> 	xy <- ecdflt(x)
> 	if (logY) xy[, 2] <- log10(xy[, 2])
> 	panel.xyplot(xy[, 1], xy[, 2], ...)
> 	}
> 
> xyplot(X ~ X | F, panel = function(x, y = NULL, ...){
> 	panel.ecdflt(x, ...)
> 	})
> 
>> Many thanks,
>> Jeff
>>
>> --
>> Jeff Stevens
>> Research Scientist
>> Center for Adaptive Behavior and Cognition
>> Max Planck Institute for Human Development
>> Lentzealle 94
>> 14195 Berlin, Germany
>>

Jeff Stevens
Center for Adaptive Behavior and Cognition
Max Planck Institute for Human Development
Lentzealle 94
14195 Berlin, Germany



More information about the R-help mailing list