R 在截止值和百分比之间建立连续关系曲线
我有原始数据,我想看看什么样的截止水平会导致什么百分比的观测值高于截止水平。以下是模拟:R 在截止值和百分比之间建立连续关系曲线,r,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))
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))
但正如你所同意的那样,这是一种粗糙而低效的方式。我不想没完没了地计算每个截止值各自的百分比,而是想建立一个表示这种关系的图,其中X轴表示所有可能的截止水平的范围,Y轴表示从0到100的百分比。类似于此:
请忽略绘图的轴标签等,这只是提供一个一般示例。有什么建议吗?我相信您正在寻找
ecdf()
函数来创建经验累积分布函数
data<-rnorm(1000,50,30)
a = ecdf(data)
plot(a)
数据您编写:
我有原始数据,我想看看什么样的截止水平的结果
超过截止水平的观察值的百分比是多少
从字面上看,你想要的是高于临界值的观察比例。假设截止值为X
。经验CDF给你值P(x x)
,你可以使用等式P(x>x)=1-P(x不完全:在我需要的曲线中,对于x值100,y将是0.048prop.table(table(data>100))
@Oposum绘图(1-a(seq(-50,150,by=0.1)),type=“l”)
?绘图(cumsum)(table)(cut(data,c(-Inf,seq(10,90,by=10)))/100))
,您可以为不同的截面更改breaks
参数。对于无法假设高斯分布的大量不同数据,我需要此参数,因此第一种方法是我需要的。如果我将type=“l”
添加到绘图命令中,我几乎可以得到我所需要的。“几乎”因为我想让曲线像样条曲线一样拟合平滑。我该怎么做呢?我的代码中没有假设高斯分布,所以这个问题不适用于上面的代码。如果你想用平滑线绘制曲线,请将geom_线
与geom_平滑
交换。我已经相应地调整了代码以显示你知道怎么做吗。就是这样,这个csn可以在基本图形中使用吗?我不再经常使用base了,但在谷歌搜索了一秒钟后,我发现一个可能的base
命令是leash.smooth()
。例如,绘图(dat$x,dat$over,type=“n”);线条(leash.smooth(dat$x,dat$over,span=1/6))
给了我合理的结果。您可能需要使用span
。
data<-rnorm(1000,50,30)
a = ecdf(data)
plot(a)
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)
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)
plot(dat$x, dat$above, type="n")
lines(loess.smooth(dat$x, dat$above, span=1/6))