跨类别和列自动化卡方

时间:2014-03-06 13:15:28

标签: 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]类似但不重复的问题(两者都是列式测试):

Using loops to do Chi-Square Test in R

Chi Square Analysis using for loop in R

2 个答案:

答案 0 :(得分:2)

这个怎么样?

# 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

快乐格式化。

答案 1 :(得分:1)

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