如何在ggplot中用stat_compare_means对甲虫选择计数数据做t检验?
问题分析与解决
首先,你当前用t检验的思路不对——t检验是用来比较连续变量的组间均值差异的,而你的数据是二分类计数(甲虫的两种选择),应该用卡方拟合优度检验(检验两种选择的比例是否偏离均匀分布,也就是是否有显著偏向)或者二项式检验(直接检验某一种选择的比例是否与预期值不同,比如0.5)。
stat_compare_means是可以实现这类检验的,但需要调整参数,而非用默认的t检验。下面是具体修正方案:
情况1:原始长格式数据(每一行对应一只甲虫的选择)
如果你的dat是长格式(每一行记录一只甲虫的choice,取值为"朝向"或"远离"),可以用以下代码:
卡方拟合优度检验(检验两种选择比例是否有差异)
library(ggplot2) library(ggsignif) # 必须加载这个包才能使用stat_compare_means ggplot(dat %>% na.omit(), aes(x = choice)) + geom_bar(fill = "steelblue") + stat_compare_means( method = "chisq", ref.group = ".all.", label = "p.format", label.y = max(table(dat$choice)) * 1.1 # 把p值放在柱子上方合适位置 )
method="chisq"指定用卡方检验,ref.group=".all."表示做拟合优度检验(比较各水平计数与均匀分布的期望)。
二项式检验(检验某一选择的比例是否等于0.5)
如果你想直接检验"朝向"的比例是否显著偏离50%,可以用二项式检验:
ggplot(dat %>% na.omit(), aes(x = choice)) + geom_bar(fill = "coral") + stat_compare_means( method = "binom", p = 0.5, # 指定预期比例,这里设为0.5 label = "p.format", label.y = max(table(dat$choice)) * 1.1 )
情况2:汇总后的计数数据
如果你的数据是汇总好的(比如一行是"朝向"对应计数count,一行是"远离"对应计数count),需要调整aes并指定stat="identity":
# 假设dat结构为:choice | count ggplot(dat %>% na.omit(), aes(x = choice, y = count)) + geom_bar(stat = "identity", fill = "forestgreen") + stat_compare_means( method = "chisq", ref.group = ".all.", label = "p.format", label.y = max(dat$count) * 1.1 )
关键提醒
- 必须加载
ggsignif包,stat_compare_means是该包的函数,并非ggplot2原生功能。 - 绝对不要用t检验处理这类二分类计数数据,结果完全不可靠,一定要用适合分类数据的检验方法。
内容的提问来源于stack exchange,提问作者twohats
相关产品推荐
相关产品推荐

