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

在R中如何执行Adjusted Chi-squared test,排除变量关联干扰?

解决国家与职业存在相关性时的独立检验问题

当你的元数据(国家、职业)存在相关性时,直接单独做卡方检验会混淆变量的真实效应,以下是几种可行的处理方法:

1. 分层卡方检验(Mantel-Haenszel检验)

这个方法可以控制其中一个变量的影响,独立检验另一个变量与养宠类型的关联,也就是你提到的Adjusted Chi-squared Test。比如:

  • 控制职业,检验国家对养宠类型的独立效应
  • 控制国家,检验职业对养宠类型的独立效应

R代码示例

首先把数据整理成长格式(更适合分层检验),这里模拟符合你列联表逻辑的原始数据:

set.seed(123)
# 模拟长格式问卷数据
data <- data.frame(
  country = rep(c("Italy", "Greece", "Hungary"), each = 30),
  occupation = rep(rep(c("Nurse", "Technician", "Teacher"), each = 10), 3),
  pet_type = sample(c("dog", "cat", "rabbit"), 90, replace = TRUE, prob = c(0.4, 0.3, 0.3))
)

# 控制职业,检验国家与养宠类型的独立关联
mantelhaen.test(table(data$country, data$pet_type, data$occupation))

# 控制国家,检验职业与养宠类型的独立关联
mantelhaen.test(table(data$occupation, data$pet_type, data$country))
  • 结果解读:若p-value小于0.05,说明控制了某个变量后,目标变量与养宠类型仍存在显著关联。

2. 多对数线性模型

这个方法可以同时分析国家、职业、养宠类型三者的关系,直接区分每个变量的独立效应,还能检验变量间的交互作用。推荐用MASS包的loglm函数:

R代码示例

library(MASS)

# 构建三维列联表
tab_3d <- table(data$country, data$occupation, data$pet_type)

# 拟合包含所有主效应的模型(假设变量无交互)
model_main <- loglm(~ country + occupation + pet_type, data = tab_3d)
summary(model_main)

# 拟合包含国家-职业交互的模型(因为二者存在相关性)
model_interact <- loglm(~ country*occupation + pet_type, data = tab_3d)
summary(model_interact)

# 比较两个模型,判断是否需要保留交互项
anova(model_main, model_interact)
  • 结果解读:
    • 看每个变量对应的Deviance和p-value,若country效应显著,说明国家对养宠类型有独立影响;同理判断occupation。
    • 模型比较的anova结果若显著,说明国家和职业的交互作用必须纳入模型,此时需要结合二者的联合效应解释结果。

3. 标准化残差分析(补充验证)

不管用哪种方法,都可以通过标准化残差定位具体哪些组别(比如某国某职业人群)的养宠类型分布与预期差异显著:

# 计算分层列联表的皮尔逊标准化残差
tab_stratified <- table(data$country, data$pet_type, data$occupation)
residuals(tab_stratified, type = "pearson")
  • 绝对值大于2的残差,通常认为对应单元格的观测值与预期值存在显著差异。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 13:01:55