【问题标题】:Descriptive statistics and boxplot for repeated measurements? [closed]重复测量的描述性统计和箱线图? [关闭]
【发布时间】:2021-11-24 04:30:26
【问题描述】:

更新:问题是由拼写错误引起的

  • 问题 1:summarize 没有组织每个组的输出,因为第三行的错字(median_dbp=(diastolic_bp) 应该是 median_dbp=median(diastolic_bp))。
  • 问题 2:箱线图没有按 drug 分组,因为对 fill=drug 的调用不在 aes 映射范围内,但它应该在内部(正确代码:ggplot(data=mydata, aes(x=timepoint, y=diastolic_bp, fill=drug))

对于一项任务,我有以下小型交叉研究的数据,其中比较了两种药物 A 和 B 对舒张压 (DBP) 的影响。研究中的每位患者以随机顺序接受两种治疗并及时分开(“清除”期),因此一种治疗不会影响在施用另一种治疗后获得的血压测量值(即排除结转影响)。数据如下:

library(tidyverse)
library(dplyr)
library(lubridate)
library(magrittr)

mydata <- structure(list(pt_id = c(1, 1, 2, 2, 3, 3, 4, 5, 5, 6, 6, 7, 
7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 
16, 17, 17, 18, 18, 19, 19), timepoint = structure(c(1L, 2L, 
1L, 2L, 1L, 2L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 
2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 2L, 1L, 2L, 1L, 2L, 
1L, 2L), .Label = c("Timepoint 1", "Timepoint 2"), class = "factor"), 
    drug = structure(c(1L, 2L, 2L, 1L, 1L, 2L, 1L, 2L, 1L, 1L, 
    2L, 2L, 1L, 1L, 2L, 1L, 2L, 2L, 1L, 2L, 1L, 1L, 2L, 1L, 2L, 
    1L, 2L, 2L, 1L, 2L, 1L, 2L, 2L, 1L, 2L, 1L), .Label = c("Drug A", 
    "Drug B"), class = "factor"), diastolic_bp = c(100, 112, 
    116, 114, 108, 110, 104, 114, 114, 98, 116, 102, 100, 96, 
    103, 92, 89, 103, 96, 116, 78, 127, 131, 129, 124, 106, 128, 
    133, 118, 108, 91, 109, 113, 98, 118, 112)), row.names = c(NA, 
-36L), class = "data.frame")

我的第一个问题是关于在每个时间点获得每个治疗组的平均值和标准差(以及平均值 + 百分位数)。我的代码:

mydata %>% 
  group_by(timepoint, drug) %>% 
  summarise(mean_dbp=mean(diastolic_bp, na.rm=TRUE), 
            sd_dbp=sd(diastolic_bp, na.rm=TRUE), 
            median_dbp=(diastolic_bp), 
            p25_dbp=quantile(diastolic_bp, probs=0.25), 
            p75_dbp=quantile(diastolic_bp, probs=0.75))

# This returns a line per patient:
# A tibble: 36 x 7
# Groups:   timepoint, drug [4]
   timepoint   drug   mean_dbp sd_dbp median_dbp p25_dbp p75_dbp
   <fct>       <fct>     <dbl>  <dbl>      <dbl>   <dbl>   <dbl>
 1 Timepoint 1 Drug A     105.  14.1         100     96     108 
 2 Timepoint 1 Drug A     105.  14.1         108     96     108 
 3 Timepoint 1 Drug A     105.  14.1          98     96     108 
 4 Timepoint 1 Drug A     105.  14.1          96     96     108 
 5 Timepoint 1 Drug A     105.  14.1          92     96     108 
 6 Timepoint 1 Drug A     105.  14.1         127     96     108 
 7 Timepoint 1 Drug A     105.  14.1         129     96     108 
 8 Timepoint 1 Drug A     105.  14.1         106     96     108 
 9 Timepoint 1 Drug A     105.  14.1          91     96     108 
10 Timepoint 1 Drug B     114.   9.64        116    110.    116.
# ... with 26 more rows

但这会为数据集中的每一行生成计算。我所期待的是drugtimepoint 的每个组合的第一名...

然后我尝试为每个时间点和组制作一个箱线图,如下所示:

ggplot(data=mydata, aes(x=timepoint, y=diastolic_bp), fill=drug) + geom_boxplot()

但这不包括分组变量drug

有什么帮助吗?

【问题讨论】:

  • 检查括号。您没有在 aes() 中包含 fill=drug
  • Stefan 为您解答!
  • 谢谢!将其包含在aes 中解决了有关箱线图的问题。您是否也知道如何解决有关summarise 的问题?例如,我试图在每个timepoint 处为每个drug 获取diastolic_bp 的平均值和SD,但我的代码没有给我那个。
  • 请不要用已有的问题来问其他问题(每个帖子应该只问一个可以回答的特定问题,并且在给出正确答案后不要移动球门柱......)跨度>
  • 也许:mydata %>% group_by(drug, timepoint) %>% summarise("q25" = quantile(diastolic_bp, c(0.25)), "q50" = quantile(diastolic_bp, c(0.50) )), "q75" = quantile(diastolic_bp, c(0.75)), mean = mean(diastolic_bp), sd = sd(diastolic_bp))

标签: r dplyr mean median


【解决方案1】:

也许这就是你想要的。 drug需要进入aes。

ggplot(data=mydata, aes(x=timepoint, y=diastolic_bp, fill=drug)) + geom_boxplot()

【讨论】:

  • 谢谢!这正是我想要的。此外,我试图用我的代码的summarise 参数生成中位数和第 25 和第 75 个百分位数,但它为每行数据生成一个中位数和百分位数,而不是分组。你也知道我在那里做错了吗?谢谢!
  • Try mydata %>% group_by(drug) %>% summarise(quantile = scales::percent(c(0.25, 0.5, 0.75)), diastolic_bp_quantiles = quantile(diastolic_bp, c(0.25, 0.5) , 0.75)))
  • 我的代码中 summarise 部分有错字:`median_dbp=(diastolic_bp),` 应该是 median_dbp=median(diastolic_bp),。再次感谢您的帮助!
猜你喜欢
  • 2019-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-12
相关资源
最近更新 更多