非均匀群体下重复测量与分布比较: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
相关产品推荐
相关产品推荐

