使用 ecdf 图中的值创建一个表
Posted
技术标签:
【中文标题】使用 ecdf 图中的值创建一个表【英文标题】:Create a table with values from ecdf graph 【发布时间】:2020-05-20 13:35:15 【问题描述】:我正在尝试。我在下面重新创建了一个示例。
#数据 数据(mtcars) #按mpg排序 mtcars % mutate(Rank = dense_rank(mpg)) #选择百分比变量 mtcars哪个创建了这个情节
当整体 Percent_Picked 为 25%、50% 和 75% 时,我想为每种圆柱类型的值创建一个表。所以显示 4-cylander 为 0%,6 为 28% 左右,8 为 85% 左右。
按组计算量数不会给我想要的东西(它显示当挑选25%,50%,75%的特定汽缸类型时挑选的所有气缸的百分比)。 (例如,tbradley1013 on their blog 的建议仅有助于每个特定圆柱的分位数,而不是 Percent_Picked 在给定分位数下每个圆柱的整体 cdf。)
任何线索将不胜感激!
【问题讨论】:
而且,我还应该说,如果上面的部分代码看起来很粗略,请告诉我应该做些什么不同的事情! 【参考方案1】:所以环顾四周,我找到了this question。您通过询问组特定的 ecdf 值对此进行了一点扩展,因此我们可以使用 dplyr (here's an example] 中的 do
函数来执行此操作。在比较这个表和你的ggplot中的值我不完全确定为什么会这样。可能只是mtcars数据集有点小,所以如果你在更大的数据集上运行它,我希望它是更接近实际值。
#Sort by mpg
mtcars <- mtcars[order(mtcars$mpg),]
#Make arbitrary ranking variable based on mpg
mtcars <- mtcars %>% mutate(Rank = dense_rank(mpg))
#Make variable for percent picked
mtcars <- mutate(mtcars, Percent_Picked = Rank/max(mtcars$Rank))
#Make cyl categorical
mtcars$cyl<-cut(mtcars$cyl, c(3,5,7,9), right=FALSE, labels=c(4,6,8))
#Make the graph
ggplot(mtcars, aes(Percent_Picked, color = cyl)) +
stat_ecdf(size=1) +
scale_x_continuous(labels = scales::percent) +
scale_y_continuous(labels = scales::percent)
create_ecdf_vals <- function(vec)
df <- data.frame(
x = unique(vec),
y = ecdf(vec)(unique(vec))*length(vec)
) %>%
mutate(y = scale(y, center = min(y), scale = diff(range(y)))) %>%
union_all(data.frame(x=c(0,1),
y=c(0,1))) # adding in max/mins
return(df)
mt.ecdf <- mtcars %>%
group_by(cyl) %>%
do(create_ecdf_vals(.$Percent_Picked))
mt.ecdf %>%
summarise(q25 = y[which.max(x[x<=0.25])],
q50 = y[which.max(x[x<=0.5])],
q75 = y[which.max(x[x<=0.75])])
ggplot(mt.ecdf,aes(x,y,color = cyl)) +
geom_step()
~编辑~
在ggplot2
文档中进行了一些挖掘之后,我们实际上可以使用layer_data
函数明确地从图中提取数据。
my.plt <- ggplot(mtcars, aes(Percent_Picked, color = cyl)) +
stat_ecdf(size=1) +
scale_x_continuous(labels = scales::percent) +
scale_y_continuous(labels = scales::percent)
plt.data <- layer_data(my.plt) # magic happens here
# and here's the table you want
plt.data %>%
group_by(group) %>%
summarise(q25 = y[which.max(x[x<=0.25])],
q50 = y[which.max(x[x<=0.5])],
q75 = y[which.max(x[x<=0.75])])
【讨论】:
感谢您的帮助!我认为 ecdf 图中略有不同的问题是,使用您创建的函数的那个在每个 cyl 的第一个实例之后才开始计数/累积。 So for example, when the first 4-cylander car is chosen, the y variable does not increase - it only starts to increase after the next 4-cylander car is chosen.我无法弄清楚代码中发生了什么 - 你知道吗? 刚刚找到了一个更好的答案 - 让我在这里修改一下我给你的内容 更新就像一个魅力。我不知道 layer_data 存在,谢谢! 作为更新,我不得不将一些汇总函数更新为q25 = y[x<=0.25][which.max(x[x<=0.25])]
- 更多详情请参阅***.com/questions/60728218/…【参考方案2】:
一个更简短的答案,我不敢相信我之前没有看到。本质上,我只是将等于或小于 0.25、0.5 和 0.75 的行数除以每个 cyl 的总行数。
cyl.table<-mtcars %>%
group_by(cyl) %>%
summarise("25% Picked" = sum(Percent_Picked<=0.25)/(sum(Percent_Picked<=1)),
"50% Picked" = sum(Percent_Picked<=0.5)/(sum(Percent_Picked<=1)),
"75% Picked" = sum(Percent_Picked<=0.75)/(sum(Percent_Picked<=1)))
cyl.table
【讨论】:
以上是关于使用 ecdf 图中的值创建一个表的主要内容,如果未能解决你的问题,请参考以下文章
R语言ggplot2可视化使用stat_ecdf函数可视化一个分布的ECDF经验累积概率分布函数图(Simple ECDF Plot with ggplot2)