在截止值和百分比之间建立连续的关系曲线

时间:2016-05-01 14:44:42

标签: r

我有原始数据,我希望看到什么样的截止水平导致超过截止水平的观察百分比。这是模拟:

data<-rnorm(100,50,30)
prop.table(table(data>10))
prop.table(table(data>20))
prop.table(table(data>30))
prop.table(table(data>40))
prop.table(table(data>50))
prop.table(table(data>60))
prop.table(table(data>70))
prop.table(table(data>80))
prop.table(table(data>90))

这是输出:

FALSE  TRUE 
  0.1   0.9 

FALSE  TRUE 
 0.16  0.84 

FALSE  TRUE 
 0.29  0.71 

FALSE  TRUE 
 0.36  0.64 

FALSE  TRUE 
 0.51  0.49 

FALSE  TRUE 
 0.61  0.39 

FALSE  TRUE 
 0.75  0.25 

FALSE  TRUE 
 0.86  0.14 

FALSE  TRUE 
 0.91  0.09 

但是你会同意这是一种粗糙而低效的方式。为无限地计算每个截止值的相应百分比的Instread,我想构建一个表示该关系的图,其中X轴表示所有可能的截止水平的范围,Y轴表示从0到100的百分比。类似于此:

enter image description here

请忽略图的轴标签等,这只是提供一般的例子。有什么建议吗?

2 个答案:

答案 0 :(得分:6)

我相信您正在寻找ecdf()函数来创建经验累积分布函数。

data<-rnorm(1000,50,30)
a = ecdf(data)
plot(a)

example

答案 1 :(得分:4)

你写道:

  

我有原始数据,我希望看到什么样的截止水平结果   高于截止水平的观察百分比。

根据你的字面意思,然后你想要观察的比例高于截止值。假设截止值为X。经验CDF为您提供值P(x <= X),即低于截止值的比例。如果您想要与P(x > X)对应的值,则可以使用相等P(x > X) = 1-P(x <= X)

例如:

data<-rnorm(100,50,30)            # your data
dat <- data.frame(x = sort(data)) # into sorted dataframe
dat$ecdf <- ecdf(data)(dat$x)     # get cdf values for each x value
dat$above <- with(dat, 1-ecdf)    # get values above

plot(dat$x, dat$above)

说完这一切之后,你毕竟呈现了高斯分布的ECDF,这可能表明你正在寻找ECDF。在这种情况下,正如Vincent的答案中所述,您只需绘制ecdf而不是above的相应值。这里是我绘制两者的例子。

要解决您的评论,请使用smooth代替geom_smooth打印一个geom_line行。

library(ggplot2); library(scales) 
ggplot(dat, aes(x=x)) +   
geom_line(aes(y=ecdf), col="red" ) +      # P(x<=X) in red
geom_smooth(aes(y=above), col="blue") +   # Smooth version of P(x > X) 
labs(y="Proportion", x="Variate") +   
scale_y_continuous(labels=percent)

如果您希望在没有周围错误间隔的情况下打印平滑线,则可以添加选项se=F。请参阅?geom_smooth -

enter image description here

要实现与基本情节类似的东西,您可以使用

 plot(dat$x, dat$above, type="n")
 lines(loess.smooth(dat$x, dat$above, span=1/6)) 

虽然您可能需要使用span参数。这将给出以下图像:

enter image description here