我有一个调查数据框,其中包含几个问题(列)编码为1 =同意/ 0 =不同意.受访者(行)根据指标“年龄”(“年轻”,“中间”,“旧”),“地区”(“东部”,“中部”,“西部”)等进行分类.大约有
这模拟了数据集的简化版本:
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
这个怎么样?# 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
快乐的格式.