Как построить график «Обратный» кумулятивной частоты с ECDF - PullRequest
3 голосов
/ 19 марта 2010

У меня нет проблем с построением следующего кумулятивного частоты графика как это.

     library(Hmisc)
     pre.test <- rnorm(100,50,10)
     post.test <- rnorm(100,55,10)
     x <- c(pre.test, post.test)
     g <- c(rep('Pre',length(pre.test)),rep('Post',length(post.test)))
     Ecdf(x, group=g, what="f", xlab='Test Results', label.curves=list(keys=1:2))

Но я хочу показать график в виде «обратной» совокупной частоты значений> x. (то есть что-то эквивалентное тому, что = "1-f").

Есть ли способ сделать это?

Также приветствуются и другие предложения в R, кроме использования Hmisc.

Ответы [ 4 ]

5 голосов
/ 19 марта 2010

Более общая функция Ecdf из Hmisc имеет опцию what= для этого:

Аргументы:

   x: a numeric vector, data frame, or Trellis/Lattice formula

what: The default is ‘"F"’ which results in plotting the fraction
      of values <= x.  Set to ‘"1-F"’ to plot the fraction > x or
      ‘"f"’ to plot the cumulative frequency of values <= x.

Таким образом, мы можем изменить ответ из вашего предыдущего вопроса и добавить what="1-F":

 # Example showing how to draw multiple ECDFs from paired data
 pre.test <- rnorm(100,50,10)
 post.test <- rnorm(100,55,10)
 x <- c(pre.test, post.test)
 g <- c(rep('Pre',length(pre.test)),rep('Post',length(post.test)))
 Ecdf(x, group=g, what="1-F", xlab='Test Results', label.curves=list(keys=1:2))
4 голосов
/ 19 марта 2010

Используя предложение Мусы:

pre.ecdf <- ecdf(pre.test)
post.ecdf <- ecdf(post.test)

r <- range(pre.test,post.test)
curve(1-pre.ecdf(x), from=r[1], to=r[2], col="red", xlim=r)
curve(1-post.ecdf(x), from=r[1], to=r[2], col="blue", add=TRUE)

Proportions

Вы можете установить некоторые параметры, такие как заголовок, легенда и т. Д.

Если вы хотите, чтобы частота вместо пропорции простое решение будет:

pre.ecdf <- ecdf(pre.test)
post.ecdf <- ecdf(post.test)

rx <- range(pre.test,post.test)
ry <- max(length(pre.test),length(post.test))
curve(length(pre.test)*(1-pre.ecdf(x)), from=rx[1], to=rx[2], col="red", xlim=rx, ylim=c(0,ry))
curve(length(post.test)*(1-post.ecdf(x)), from=rx[1], to=rx[2], col="blue", add=TRUE)

Frequencies

2 голосов
/ 19 марта 2010
df <- data.frame(x, g)
df$y <- apply(df, 1, function(v){nrow(subset(df, g == v[2] & x >= v[1]))})
library(ggplot2)
qplot(x, y, data=df, geom='line', colour=g)
1 голос
/ 19 марта 2010

Если у вас есть только один вектор x, то вы можете сделать следующее:

f <- ecdf(x)
plot(1-f(x),x)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...