【问题标题】:Running multiple Stuart-Maxwell tests through looping columns in R通过 R 中的循环列运行多个 Stuart-Maxwell 测试
【发布时间】:2017-05-12 09:49:28
【问题描述】:

我有 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)

【问题讨论】:

  • 编写一个函数,为单个成对比较产生所需的输出;使用combn(simplify = FALSE) 获取所有可能的成对比较的列表;使用lapply 在该列表的元素上迭代函数;然后根据需要简化结果列表。
  • 你能在这里做一个简单的例子吗?
  • 不,来吧,伙计,这取决于你。如果您发布与您的数据和您开始使用的代码相似的数据,那么我们可以从那里获取。

标签: r matrix multiple-columns crosstab


【解决方案1】:

您可以通过将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

【讨论】:

  • 它给出了一个错误:“太多相等的边际,无法计算”,因为在所有配对比较中消费者的反应不一样。我认为公式需要针对 SM 测试给出错误的成对比较进行调整,即在 P 值矩阵中打印“NA”
  • 它对我有用。我添加了用于制作数据和结果的步骤。我想知道问题是否在于您的实际数据结构与您建议的玩具数据之间的差异。
  • 是的。我懂了。谢谢它实际上有效。但在实际情况下,我遇到一些配对比较不会产生任何测试结果的情况,因为消费者的反应在两个配置文件中并不相同。因此,如果我们可以调整公式以允许打印其余 p 值并将 NA 用于那些不适用的值。
  • 在这里继续移动球门柱并不酷。你为什么不尝试按照你想要的方式格式化sapply 返回的向量呢?提示:获取combn 的结果作为对象,然后用它为你的向量命名。
  • 不,抱歉,我得继续。
猜你喜欢
  • 1970-01-01
  • 2015-12-25
  • 1970-01-01
  • 1970-01-01
  • 2019-04-28
  • 1970-01-01
  • 2019-10-22
  • 2013-10-04
  • 1970-01-01
相关资源
最近更新 更多