上一次我问如何计算一个变量(procras)的平均分,这个变量已经被多个受访者重复测量,所以我的(简化的)长格式数据集看起来像下面这样(这里有两个学生,5个时间点,没有分组变量):
studentID week procras
1 0 1.4
1 6 1.2
1 16 1.6
1 28 NA
1 40 3.8
2 0 1.4
2 6 1.8
2 16 2.0
2 28 2.5
2 40 2.8
使用dplyr,我会得到每个测量场合的平均得分
mean_data <- group_by(DataRlong, week)%>% summarise(procras = mean(procras, na.rm = TRUE))
看起来像这样,例如:
Source: local data frame [5 x 2]
occ procras
(dbl) (dbl)
1 0 1.993141
2 6 2.124020
3 16 2.251548
4 28 2.469658
5 40 2.617903
使用ggplot2,我现在可以绘制平均值随时间的变化,并且通过轻松调整dplyr的group_data(),我还可以获得每个亚组的均值(例如,男性和女性每个事件的平均评分)。现在我想在mean_data表中添加一列,其中包括每个事件平均评分周围的95% CI的长度。
http://www.cookbook-r.com/Graphs/Plotting_means_and_error_bars_(ggplot2)/解释了如何获取和绘制CI,但是当我想对任何子组进行此操作时,这种方法似乎就出现了问题,对吗?那么,是否有一种方法可以让dplyr也将CI(基于组大小等)自动包含在mean_data中?之后,将新值作为CI绘制到图表中应该相当容易,我希望如此。谢谢。
6条答案
按热度按时间yvfmudvl1#
您可以使用
mutate
手动执行此操作,summarise
中有一些额外的函数toe950272#
我使用 gmodels 包中的 ci 命令:
ulydmbyx3#
如果您想使用
boot
包的多功能性,我找到了this blog post useful(下面的代码就是从那里得到的灵感)由reprex package(v0.3.0)于2020年1月22日创建
代码的一些解释:
与
nest()
嵌套时,列表列(默认情况下称为data
),其包含2个 Dataframe ,是由vs
分组的整个mtcars
的2个子集(其包含2个唯一值0和1)。然后,使用mutate()
和map()
,我们通过将来自boot
包的函数boot()
应用于列表列data
来创建列表列boot_res
。然后通过将boot.ci()
函数应用于boot_res
列表列来创建boot_res_ci
列表列,依此类推。对于select()
,我们删除不再需要的列表列。接下来是取消嵌套和取消分组最终结果。不幸的是,代码不容易导航,但它服务于另一个示例的目的。
使用
broom::tidy()
我刚刚意识到
broom
包实现了一个方法来处理boot()
的输出,正如here所指出的那样,这使得代码更简洁,输出更完整,包括偏差和统计数据的标准误差(这里是平均值):由reprex package(v0.3.0)于2020年1月22日创建
data.table
简明语法但是,请注意,我使用
data.table
包而不是dplyr
得到了一个更简洁的语法:由reprex package于2020年1月23日创建(版本0.3.0)
一次使用数据表的多个变量
由reprex package(v0.3.0)于2020年1月23日创建
carvr3hs4#
更新tidyr 1.0.0
@Valentin给出的所有解决方案都是可行的,但我想提示一个新的替代方案,它对你们中的一些人来说更容易阅读。它用一个相对较新的[tidyr 1.0.0][1]函数
unnest_wider
替换了所有summarise
解决方案。其给出:
不使用 Bootstrap 法计算置信区间甚至更简单:
2hh7jdfx5#
对于正态分布:
ki0zmccv6#
添加一个答案,以防其他人,像我一样,发现这篇文章有用,但仍在寻找调整。
下面是一个基于@sboysel的响应并使用他的“nobs”函数的替代手动解决方案。如果你想对数据中的多个组和多个变量进行汇总,这个解决方案很有用(改变
across()
以适应你的数据--这里,它是为以特定字符串开头的变量编写的):或者,使用gmodels包中的
ci
(如@carfisma所说)来获得更简洁的代码:注意,
ci()
输出的第4个元素是std err,而不是carfisma解决方案中可能建议的sd。使用dplyr版本1.0.10和gmodels 2.18.1.1