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

通过R中的循环列运行多个Stuart Maxwell测试,r,matrix,multiple-columns,crosstab,R,Matrix,Multiple Columns,Crosstab,我有20个栏目,每个栏目代表一个问题简介,在我的调查中,主题设计中的受访者必须从5个选项中选择一个,如从a到E的ERT量表。 现在我想在统计上测试答案在不同问题档案中的分布是否不同。为了做到这一点,我必须在可能的档案成对比较的交叉表上运行Stuart Maxwell测试 所以,如果我只进行一次比较,那么这个过程其实很简单: -例如,我将Q1和Q2上的响应做成交叉表tab1 2-从irr包中进行SM stuart.maxwell.MHTAB1测试。 3-提取p值 但这样做太耗时了,超过20个问题。

我有20个栏目,每个栏目代表一个问题简介,在我的调查中,主题设计中的受访者必须从5个选项中选择一个,如从a到E的ERT量表。 现在我想在统计上测试答案在不同问题档案中的分布是否不同。为了做到这一点,我必须在可能的档案成对比较的交叉表上运行Stuart Maxwell测试

所以,如果我只进行一次比较,那么这个过程其实很简单: -例如,我将Q1和Q2上的响应做成交叉表tab1 2-从irr包中进行SM stuart.maxwell.MHTAB1测试。 3-提取p值

但这样做太耗时了,超过20个问题。 我需要一个函数或循环来进行测试,提取p.值并将它们打印到矩阵中。 需要帮忙吗

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)

您可以通过将combn与apply配对来完成此操作。从combnnamesdata,m=2,simplify=FALSE,可以得到数据中所有列的成对组合的列表。然后,您可以从分析步骤中生成一个函数,并将其封装在对sapply的调用中,以在该列表的元素上进行迭代。如果其中一些测试失败,您可以使用try,然后根据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)

})

编写一个函数,为单个成对比较生成所需的输出;使用combnsimplify=FALSE获取所有可能的成对比较的列表;使用lappy在该列表的元素上迭代函数;然后根据需要简化结果列表。你能在这里举个简单的例子吗?不,来吧,伙计,这由你决定。如果您发布的数据与您的数据和开始使用的代码类似,那么我们可以从中提取。这会产生一个错误:太多相等的边距,由于所有对比较中的消费者响应不相同,无法计算。我认为需要对公式进行调整,以适应SM测试给出的错误的成对比较,即在P值矩阵中打印NA,这对我来说是可行的。我添加了用于生成数据和结果的步骤。我想知道问题是否出在你实际数据的结构和你建议的玩具数据之间。是的。我懂了。谢谢,事实上它很管用。但在实际情况中,我发现一些配对比较不会产生任何测试结果,因为消费者的反应在两个配置文件中并不完全相同。因此,如果我们可以调整公式,允许打印其余的p值,并将NA用于不适用的值。继续将目标帖子移到这里并不酷。为什么不尝试按您想要的方式格式化sapply返回的向量?提示:将combn的结果作为一个对象,然后使用它为向量命名。不,对不起,我必须继续。
 [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