You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 22:10:28