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

非均匀群体下重复测量与分布比较:McNemar检验的局限性

聚类数据下McNemar检验的偏差与替代方案

当前方法的偏差问题

你用的McNemar检验存在两个核心偏差,根源是你的数据属于聚类嵌套结构(16名儿童产出不同数量的名词/代词实例),而McNemar假设所有观测独立:

  • 第一类错误率膨胀:同一个儿童的多个发音实例是相关的(比如某个儿童可能整体更倾向于转化[s]音),但McNemar会把这些当作独立观测,导致标准误被低估,p值偏小,更容易错误得出“词类影响[s]音转化”的结论。
  • 权重失衡偏差:名词实例数(459)远多于代词(53),McNemar检验会被数量占优的名词组主导,完全忽略个体层面的差异——比如有的儿童在代词上的转化率远高于名词,但因为这类儿童贡献的实例少,会被大量名词数据掩盖。

更合适的分析方法

1. 广义线性混合模型(GLMM)——最推荐

这是处理嵌套聚类数据的标准方法,能把儿童作为随机效应纳入模型,控制个体间的发音差异,同时直接检验词类对[s]音转化的影响。需要你有个体水平的原始数据(每个[s]音实例对应儿童ID、词类、是否转化):

# 加载依赖包
library(lme4)

# 假设你的数据框phon_data包含:
# child_id:儿童编号,word_class:词类(nom/pron),transformed:是否转化(0=准确,1=转化)
glmm_model <- glmer(transformed ~ word_class + (1 | child_id), 
                    data = phon_data, 
                    family = binomial(link = "logit"))

# 查看模型结果,重点看word_class的系数和p值
summary(glmm_model)

如果只有汇总到儿童层面的数据(每个儿童的名词/代词准确/转化数),可以用glmmTMB处理成组水平的二项模型:

library(glmmTMB)
library(tidyr)

# 假设child_summary包含child_id, nom_total, nom_trans, pro_total, pro_trans
# 整理成长格式
long_data <- child_summary %>%
  pivot_longer(cols = c(nom_total, pro_total), names_to = "word_class", values_to = "total") %>%
  pivot_longer(cols = c(nom_trans, pro_trans), names_to = "trans_col", values_to = "trans") %>%
  filter(str_remove(word_class, "_total") == str_remove(trans_col, "_trans")) %>%
  select(child_id, word_class = str_remove(word_class, "_total"), total, trans)

# 构建模型
glmm_group <- glmmTMB(cbind(trans, total - trans) ~ word_class + (1 | child_id),
                      data = long_data,
                      family = binomial)
summary(glmm_group)

2. 个体层面的配对检验

如果不想用混合模型,可以先计算每个儿童的名词/代词[s]音转化比例,再用配对检验比较个体内的差异:

library(dplyr)

# 假设child_summary是儿童层面的汇总数据
child_summary <- child_summary %>%
  mutate(nom_trans_prop = nom_trans / (nom_acc + nom_trans),
         pro_trans_prop = pro_trans / (pro_acc + pro_trans)) %>%
  filter(!is.na(nom_trans_prop) & !is.na(pro_trans_prop)) # 过滤没有某类词实例的儿童

# 配对t检验(若转化比例近似正态)
t.test(child_summary$nom_trans_prop, child_summary$pro_trans_prop, paired = TRUE)

# 符号检验(非参数,适合样本量小的情况)
# 统计名词转化比例高于代词的儿童数
higher_nom <- sum(child_summary$nom_trans_prop > child_summary$pro_trans_prop)
# 总有效儿童数
n <- nrow(child_summary)
binom.test(higher_nom, n)

这种方法直接聚焦个体内的词类差异,避免了总实例数不均衡的问题,但缺点是丢失了实例数量的信息(比如某个儿童有100个名词实例和1个代词实例,比例的权重和只有1个名词1个代词的儿童一样)。

3. 聚类调整的McNemar检验

可以通过计算聚类调整的标准误来修正原检验,但实现起来不如前两种方法直观,且要求数据为配对结构(每个儿童的名词和代词观测一一对应),你的数据不均衡,适用性有限:

library(survey)
# 假设原始数据phon_data包含child_id和配对的名词/代词观测
# 定义聚类设计
design <- svydesign(id = ~child_id, data = phon_data)
# 执行调整的McNemar检验
svymcnemar(transformed ~ word_class, design = design)

内容的提问来源于stack exchange,提问作者SarahLing

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 19:48:17