使用 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&lt;=0.25][which.max(x[x&lt;=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)

斐波那契调用图中的值分区(调用图是二叉树)

如何将工作表放入 Tableau 中的一张饼图中?

根据下拉列表的值创建 2 个下拉列表和一个表

Oracle 10g中如何创建表

Oracle 10g中如何创建表