R 跨类别和列自动执行卡方检验

R 跨类别和列自动执行卡方检验,r,chi-squared,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),re

我有一个包含多个问题(列)的调查数据框架,编码为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的总样本测试所有类别,然后测试大约20个其他问题。由于每个问题大约有30个测试,我想找到一种方法(有效或其他)来自动化这个问题,但我很难看到如何让R自己做这件事,或者如何编写一个循环来循环分类。我已经搜索了[1],并使用pairwise.prop.test()进行了两两比较测试,但还没有找到任何真正能回答这个问题的方法

[1] 类似但不重复的问题(均为列式测试):

这个怎么样

# 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

愉快的格式设置。

您也可以使用Inquirer软件包中的chisq.desc()函数。这对我很管用。尽管可用的支持非常少,而且这个软件包非常旧(没有长时间的更新),所以很少有函数不起作用,但我发现chisq.desc()很有用。
它根据选定的阈值,对包含卡方检验结果的表格中的单元格进行着色,并与所有选定的分类变量交叉。我无法发表评论,因此请写下来作为答案。

我认为最好您提供一个可重复性最低的示例。我已经编辑了这个问题来补充。罗曼,很抱歉延迟回复。我还没有能够剖析这一点,但它肯定对我提供的df工作-出色的工作。它在我真正的df上不起作用,但我正在尝试解构您的解决方案以找出原因(到目前为止我还不知道您的代码是如何工作的!)。@GrahamJones insert
debug()。也许会有帮助。
# 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
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