【问题标题】:how to plot mean proportion of binary data?如何绘制二进制数据的平均比例?
【发布时间】:2020-11-17 02:05:08
【问题描述】:

我在 R 中有一个数据框,其结构与下面的玩具数据框相似。向受试者展示一些对象,并对以下类别做出 TRUE 或 FALSE 的回答。

subject     object      animal     pet      furry

1           A           TRUE       TRUE     FALSE
1           B           TRUE       TRUE     TRUE
1           C           TRUE       FALSE    TRUE
1           D           TRUE       FALSE    FALSE
2           A           TRUE       TRUE     FALSE
2           B           FALSE      FALSE    FALSE
3           A           TRUE       TRUE     FALSE
3           B           FALSE      TRUE     FALSE
3           C           TRUE       TRUE     TRUE
...         ...         ...        ...      ...

如果一个对象被标记为动物 = TRUE、宠物 = TRUE 和毛茸茸 = TRUE,那么该对象就是蜥蜴。或者 FALSE-FALSE-FALSE 是植物。对象实际上是什么并不重要,但有 8 种可能的组合,如下所示:

TRUE-TRUE-TRUE
TRUE-TRUE-FALSE
TRUE-FALSE-FALSE
FALSE-FALSE-FALSE
TRUE-FALSE-TRUE
FALSE-FALSE-TRUE
FALSE-TRUE-TRUE
FALSE-TRUE-FALSE

我正在尝试按主题查找 平均组合比例,并在堆积条形图中(在 ggplot2 中)表示这一点。但我不知道如何处理我的二进制数据。总的来说,我试图代表的是受试者如何标记这些对象的平均比例。例如,subject_1 包含 60% TRUE-TRUE-FALSE、20% FALSE-TRUE-FALSE、20% TRUE-TRUE-TRUE,其余类别为 0%。

如果有任何不清楚的地方,我们深表歉意。很高兴根据反馈编辑内容。

【问题讨论】:

  • 你能显示预期的输出吗?是串联的字符串吗?
  • @akrun — 感谢您的提问。我实际上不确定像这样的二进制数据是如何转换的,但我希望有一个看起来像这样sebastiansauer.github.io/images/2017-01-20/… 的图。组(例如,0、1 等)将改为 TRUE-TRUE-TRUE、TRUE-TRUE-FALSE 等。这有帮助吗?

标签: r dataframe ggplot2 plot


【解决方案1】:

为了让您的数据准备好与ggplot2::geom_bar() 一起使用,您可能需要重新组织您的数据,以便有一个主题列,一个指示 T/F 组合类型的列(下面的combo_str),以及另一列,其中包含特定主题出现特定组合的次数比例(prop 下面):

library(dplyr)
library(ggplot2)

# re-creating your data example:
df <- data.frame(subject = c(rep(1, 4), rep(2, 2), rep(3, 3)),
                 object = c("A", "B", "C", "D", "A", "B", "A", "B", "C"),
                 animal = c(rep(T, 5), F, T, F, T),
                 pet = c(T, T, F, F, T, F, rep(T,3)),
                 furry = c(F, T, T, rep(F, 5), T))

# by subject, summarize the proportion of these T/F combinations 
df <- df %>%
  # create a unique identifier for each combination (e.g. "TRUE-TRUE-FALSE")
  mutate(combo_str = paste(animal, pet, furry, sep = "-"))%>%
  group_by(subject) %>%
  # count the number of times this subject occurs in df:
  mutate(n_objects = n()) %>% 
  group_by(subject, combo_str) %>%
  # prop of times each combo type occurs for a given subject:
  summarize(prop = n()/n_objects) 

然后您可以使用geom_bar() 绘制您的数据,就像@DanielJachetta 显示的那样:

ggplot(data = df, aes(fill = combo_str, y = prop, x = subject))+
  geom_bar(stat = 'identity')

【讨论】:

    【解决方案2】:

    对于您想要的情节,您将需要此代码,但已针对您的数据进行了修改

    
     # library
    library(ggplot2)
     
    # create a dataset
    specie <- c(rep("sorgho" , 3) , rep("poacee" , 3) , rep("banana" , 3) , rep("triticum" , 3) )
    condition <- rep(c("normal" , "stress" , "Nitrogen") , 4)
    value <- abs(rnorm(12 , 0 , 15))
    data <- data.frame(specie,condition,value)
     
    # Stacked + percent
    ggplot(data, aes(fill=condition, y=value, x=specie)) + 
        geom_bar(position="fill", stat="identity")
    
    

    code came from here

    【讨论】:

    • 谢谢!你能解释一下我应该如何调整我的二进制数据吗?我还不太明白。
    • 不确定我是否理解这个问题。你有所有这些 TRUE 和 FALSE,但只有 8 种不同的结果,为什么不只是可视化结果的分布。例如:3 条狗、8 条蜥蜴、2 条鱼等?那么它可以只是一个直方图
    猜你喜欢
    • 1970-01-01
    • 2021-05-26
    • 1970-01-01
    • 1970-01-01
    • 2017-04-04
    • 2021-07-24
    • 1970-01-01
    • 2020-03-27
    • 1970-01-01
    相关资源
    最近更新 更多