r-跨类别和列自动进行卡方运算

  • 本文关键字:方运算 运算 r chi-squared
  • 更新时间 :
  • 英文 :


我有一个调查数据框架,其中包含几个问题(列),编码为1=同意/0=不同意。受访者(行)根据"年龄"("年轻"、"中等"、"老年")、"地区"("东部"、"中部"、"西部")等指标进行分类。总共有大约30个类别(3个年龄、3个地区、2种性别、11种职业等)。在每个指标中,类别不重叠,大小不同。

这模拟了数据集的精简版本:

n<-400
set.seed(1)
data<-data.frame(age=sample(c('young','middle','old'),n,replace=T),region=sample(c('East','Mid','West'),n,replace=T),gender=sample(c('M','F'),n,replace=T),Q15a=sample(c(0,1),n,replace=T),Q15b=sample(c(0,1),n,replace=T))

我可以使用卡方来测试西方的反应是否与Q15a的总样本有显著差异,包括:

attach(data)
chisq.test(table(subset(data,region=='West')$Q15a),p=table(Q15a),rescale.p=T)

我想根据Q15a的总样本测试所有类别,然后测试大约20个其他问题。由于每个问题大约有30个测试,我想找到一种方法(高效或其他)来实现自动化,但我很难理解如何让R自己完成这项工作,或者如何编写循环来遍历类别。我已经搜索了[1],并使用pairwise.prop.test()进行了成对比较测试,但还没有找到任何真正的答案。

[1] 相似但不重复的问题(都是按列测试):

在R 中使用循环进行卡方检验

卡方分析在R 环路中的应用

这个怎么样?

# find all question columns containing Q, your "subset" may differ
nms <- names(data)
nms <- nms[grepl("Q", nms)]
result <- sapply(nms, FUN = function(x, data) {
qinq <- data[, c("region", x)]
by(data = qinq, INDICES = data$region, FUN = function(y, qinq) {
chisq.test(table(y[, x]), p =  table(qinq[, x]), rescale.p = TRUE)
}, qinq = qinq)
}, data = data, simplify = FALSE)
$Q15a
data$region: East
Chi-squared test for given probabilities
data:  table(y[, x])
X-squared = 0.7494, df = 1, p-value = 0.3867
--------------------------------------------------------------------------------------------- 
data$region: Mid
Chi-squared test for given probabilities
data:  table(y[, x])
X-squared = 0.2249, df = 1, p-value = 0.6353
--------------------------------------------------------------------------------------------- 
data$region: West
Chi-squared test for given probabilities
data:  table(y[, x])
X-squared = 1.5877, df = 1, p-value = 0.2077

$Q15b
data$region: East
Chi-squared test for given probabilities
data:  table(y[, x])
X-squared = 0.0697, df = 1, p-value = 0.7918
--------------------------------------------------------------------------------------------- 
data$region: Mid
Chi-squared test for given probabilities
data:  table(y[, x])
X-squared = 0, df = 1, p-value = 0.9987
--------------------------------------------------------------------------------------------- 
data$region: West
Chi-squared test for given probabilities
data:  table(y[, x])
X-squared = 0.056, df = 1, p-value = 0.8129

你可以提取任何你想要的东西。以下是提取p.value的方法。

lapply(result, FUN = function(x) lapply(x, "[", "p.value"))
$Q15a
$Q15a$East
$Q15a$East$p.value
[1] 0.3866613

$Q15a$Mid
$Q15a$Mid$p.value
[1] 0.6353457

$Q15a$West
$Q15a$West$p.value
[1] 0.2076507

$Q15b
$Q15b$East
$Q15b$East$p.value
[1] 0.7918426

$Q15b$Mid
$Q15b$Mid$p.value
[1] 0.9986924

$Q15b$West
$Q15b$West$p.value
[1] 0.8128969

格式很好。

您也可以使用EnQuireR包中的chisq.desc()函数。它对我来说运行得很好。尽管可用的支持非常少,而且这个包很旧(没有来自long的更新),所以很少有函数不起作用,但我发现chisq.desc()很有用。它根据选定的阈值,对包含卡方检验结果的表中的单元格进行着色,并跨越所有选定的分类变量。我无法发表评论,所以写作是一个答案。

最新更新