我有原始数据,我想看看什么样的截止水平会导致高于截止水平的观察百分比。下面是模拟:
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
但正如您所同意的那样,这是一种粗略且低效的方式。除了无休止地计算每个截止值的相应百分比之外,我想构建一个图来表示这种关系,其中 X 轴代表所有可能的截止水平的范围,Y 轴代表从 0 到 100 的百分比。类似于以下内容:
请忽略图中的轴标签等,这只是提供一个一般示例。有什么建议么?
最佳答案
你写:
从字面上看你写的东西,然后你想要高于截止值的观察比例。假设截止是 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。在这种情况下,正如文森特的答案中已经概述的那样,您可以只绘制
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
-要实现与基本图类似的东西,您可以使用
plot(dat$x, dat$above, type="n")
lines(loess.smooth(dat$x, dat$above, span=1/6))
尽管您可能需要使用 span 参数。这将给出以下图像:
关于r - 建立截止和百分比之间的连续关系曲线,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36967905/