quanteda中卡方关联/keyness计算及与chisq.test()差异咨询
理解textstat_keyness()与chisq.test()的卡方计算差异
我之前也碰到过这个困惑,其实核心差异在于两个函数默认使用的卡方统计量类型以及连续性修正设置不同,下面一步步拆解:
1. 默认统计量类型不同
textstat_keyness()(来自quanteda包)默认使用的是似然比卡方(Likelihood Ratio Chi-Squared,简称LR卡方),而R基础包的chisq.test()默认使用的是皮尔逊卡方(Pearson's Chi-Squared)。这两种统计量的计算逻辑完全不同:
似然比卡方(textstat_keyness默认)
公式为:
$$G^2 = 2 \sum \left( O \times \ln\left(\frac{O}{E}\right) \right)$$
其中:
- $O$ = 观测频数(目标组/参考组中关键词出现/不出现的次数)
- $E$ = 期望频数(基于整体频率的理论预期值)
皮尔逊卡方(chisq.test默认)
公式为:
$$\chi^2 = \sum \left( \frac{(O - E)^2}{E} \right)$$
这两个统计量的数值通常会有差异,尤其是在样本量不大的时候。
2. 连续性修正的差异
对于2×2的列联表(关键词出现/不出现 × 目标组/参考组),chisq.test()默认会启用Yates连续性修正(参数correct=TRUE),而textstat_keyness()默认不做任何修正。这也会进一步拉大结果的差距。
3. 验证示例
我们用一个简单的频数表来验证:
假设目标组中关键词出现10次,不出现90次;参考组中出现5次,不出现195次。
用textstat_keyness计算(默认似然比)
library(quanteda) # 构造语料库 corpus <- corpus(c(rep("target", 100), rep("reference", 200))) tokens <- tokens(corpus) dfm <- dfm(tokens) # 手动构造关键词频数 dfm$keyword <- c(rep(1,10), rep(0,90), rep(1,5), rep(0,195)) # 计算关键词显著性 keyness <- textstat_keyness(dfm, target = 1:100, measure = "lr") # 默认就是"lr" keyness$statistic # 查看似然比卡方值
用chisq.test计算
# 构造2×2列联表 tab <- matrix(c(10,5,90,195), nrow=2, dimnames=list(c("target","reference"), c("keyword","non-keyword"))) # 默认皮尔逊卡方(带连续性修正) chisq.test(tab)$statistic # 皮尔逊卡方(关闭连续性修正) chisq.test(tab, correct=FALSE)$statistic # 似然比卡方(和textstat_keyness匹配) chisq.test(tab, correct=FALSE, method="likelihood")$statistic
你会发现:
textstat_keyness()的结果和chisq.test(tab, correct=FALSE, method="likelihood")完全一致- 和默认的
chisq.test(tab)结果差异明显,这是因为统计量类型+连续性修正的双重影响
4. 让两个结果匹配的方法
如果你想让textstat_keyness()的结果和chisq.test()默认结果匹配,可以:
- 在
textstat_keyness()中指定measure="chi2"(使用皮尔逊卡方),同时手动对观测频数做连续性修正(函数本身不支持直接设置修正参数) - 或者在
chisq.test()中关闭修正并指定似然比方法,来匹配textstat_keyness()的默认输出
总结一下:两者的差异本质是统计方法的选择和修正策略不同,搞清楚这两点就能轻松对齐结果啦!
内容的提问来源于stack exchange,提问作者Riya
相关产品推荐
相关产品推荐

