运行 通过 R 中的循环列进行多个 Stuart-Maxwell 测试

Running multiple Stuart-Maxwell tests through looping columns in R

我有 20 列,每列代表一个问题(个人资料),调查中的受访者(在主题设计中)必须从 5 个选项(从 A 到 E 的李克特量表)中选择一个。 现在我想统计测试不同问题(配置文件)中答案的分布是否不同。为了做到这一点,我必须 运行 Stuart Maxwell 测试可能的配置文件成对比较的交叉表。

如果我只进行一次比较,那么过程真的很简单: -1 例如制作 Q1 和 Q2 响应的交叉表 (tab1) 2- 从 "irr" 包中进行 SM (stuart.maxwell.mh(tab1)) 测试。 3- 提取 p 值

但是20道题这样做太费时间了。 我需要一个函数或循环来进行测试并提取 p.values 并为我将它们打印在矩阵中。 有什么帮助吗?

data <- data.frame(Q1=sample(1:5, 20, replace=T),
               Q2=sample(1:5, 20, replace=T),
               Q3=sample(1:5, 20, replace=T),
               Q4=sample(1:5, 20, replace=T),
               Q5=sample(1:5, 20, replace=T),
               Q6=sample(1:5, 20, replace=T),
               Q7=sample(1:5, 20, replace=T),
               Q8=sample(1:5, 20, replace=T),
               Q9=sample(1:5, 20, replace=T),
               Q10=sample(1:5, 20,replace=T) )  #fake data

choose(n=10, k=2)   # possible pairwise comparisons  n!/k!(n-k)!

library(irr)   # to run Stuart-Maxwell test
crosstab1<-table(data$Q1,data$Q2)
test1<-stuart.maxwell.mh(crosstab1)    
p.value1 <- (test1$p)

您可以通过将 combnapply 配对来完成此操作。从 combn(names(data), m = 2, simplify = FALSE),您将获得 data 中所有列的成对组合的列表。然后,您可以从分析步骤中创建一个函数,并将其包装在对 sapply 的调用中,以对该列表的元素进行迭代。如果其中一些测试失败,您可以使用 try 然后根据是否存在尝试错误来调节输出。

set.seed(1)
n <- 10
data <- as.data.frame(replicate(n, sample(1:5, 20, replace=T)))
names(data) <- paste0("Q", seq(n))

sapply(combn(names(data), 2, simplify = FALSE), function(i) {

    require(irr)

    xtab <- table(data[,i[1]], data[,i[2]])

    test <- try(stuart.maxwell.mh(xtab))

    ifelse(class(test) == "try-error", NA, test$p)

})

结果(省略错误信息):

 [1] 0.60653066 0.14569903 0.76409383 0.67869842 0.30610257 0.56851257 0.29978059         NA 0.50186668 0.40946486         NA 0.96507339 0.79040671 0.65190962
[15] 0.04643301 0.31731051 0.19468671 0.13960650 0.32043451 0.18998439 0.05035511 0.26611587 0.31731051 0.10539922 0.42712948 0.79543629 0.43459821 0.12994287
[29] 0.15729921         NA 0.42313825 0.69285237 0.20373938 1.00000000 0.71653131 0.55782540 0.31890656 0.22313016 0.57637784 0.14830902 0.31731051 0.40839235
[43]         NA 0.05488579 0.31731051