根据某些条件创建箱线图

时间:2020-06-12 08:52:34

标签: r dplyr

给出的数据是从24名住院的美国标准饮食人群和同意接受1个月的素食饮食的胆固醇水平中抽取的样本。血清胆固醇的测定是在饮食前和饮食后的1个月进行的。

   Subject Before After Difference
1        1    195   146         49
2        2    145   155        -10
3        3    205   178         27
4        4    159   146         13
5        5    244   208         36
6        6    166   147         19
7        7    250   202         48
8        8    236   215         21
9        9    192   184          8
10      10    224   208         16
11      11    238   206         32
12      12    197   169         28
13      13    169   182        -13
14      14    158   127         31
15      15    151   149          2
16      16    197   178         19
17      17    180   161         19
18      18    222   187         35
19      19    168   176         -8
20      20    168   145         23
21      21    167   154         13
22      22    161   153          8
23      23    178   137         41
24      24    137   125         12

现在这是我要回答的问题。一些研究人员相信饮食的影响 胆固醇水平高而不是低水平的人们更容易发现胆固醇。如果您根据中位胆固醇的基线以上或以下来拆分数据,您是否可以描述性地评论此问题? 现在,我正在考虑根据此处的两个类别创建箱线图。我希望在这里使用dplyr进行数据操作。因此,我将基于Before小于或大于Before的中位数来创建新列。因此,我将有一个新的字符向量,其中“高”表示胆固醇前高,而“低”表示胆固醇前低。然后,我将基于新的分类列对Difference进行箱线图绘制。所以,这是我的代码。我将原始数据集称为df2

df2 %>% 
  mutate(new_col = if_else(Before < median(Before), "low", "high")) %>%
  group_by(new_col) %>%
  ggplot(aes(x= new_col, y=Difference)) +
  geom_boxplot()

以下是我得到的箱线图 enter image description here

因此,基于此,我得出结论,研究者的观点是正确的,饮食对胆固醇的影响在高胆固醇水平而非低胆固醇水平的人群中更为明显。我想知道这是否可以更有效地完成。

2 个答案:

答案 0 :(得分:1)

并不是真正的答案,而是更多的数据可视化方法。

library( data.table )
library( ggplot2 )

DT.melt <- melt( DT, id.vars = "Subject", measure.vars = c( "Before", "After" ) )

ggplot() +
  geom_line( data = DT.melt, 
             aes( x = variable, y = value, group = Subject ) ) +
  geom_line( data = DT.melt[, .(mean = mean(value)), by = variable ],
             aes( x = variable, y = mean, group = 1 ), color = "red", size = 2 ) +
  labs( x = "", y = "" )

enter image description here

使用的样本数据

DT <- fread(" Subject Before After Difference
        1    195   146         49
        2    145   155        -10
        3    205   178         27
        4    159   146         13
        5    244   208         36
        6    166   147         19
        7    250   202         48
        8    236   215         21
        9    192   184          8
    10    224   208         16
      11    238   206         32
      12    197   169         28
      13    169   182        -13
      14    158   127         31
      15    151   149          2
      16    197   178         19
      17    180   161         19
      18    222   187         35
      19    168   176         -8
      20    168   145         23
      21    167   154         13
      22    161   153          8
      23    178   137         41
      24    137   125         12")

答案 1 :(得分:1)

这更是一个统计计划问题,而不是编程问题,因此,它比起StackOverflow更属于stats.stackexchange。

无论如何,不​​建议根据中位数对变量进行分类,这是不建议使用的可视化关联方式,因为您要隐藏大量信息。您可以在Peter Flom的this very good article中阅读有关内容。

最好保留所有点并应用一些样条或平滑算法。

例如,您可以考虑以下内容:

ggplot(df2, aes(x= Before, y=Difference)) + 
  geom_point() + 
  geom_smooth()

enter image description here

在这里,这种关系清晰可见,同时保留了您想要的所有信息。

如果您确实需要生成子组,也可以尝试执行以下操作:

df2 %>% 
  mutate(new_col = if_else(Before < median(Before), "low", "high")) %>% 
  ggplot(aes(x= Before, y=Difference, group=new_col, color=new_col)) + 
  geom_point() + 
  geom_smooth(span=3) #try some other values here

但是,使用中位数仍然不是一个好主意,尤其是在具有大量数据点的情况下。您可能需要评估关系的功能形式,但这需要在stats.stackexchange.com上有一个特定的问题。