【问题标题】:Chi Square Test of Independence of Whole Dataset整个数据集独立性的卡方检验
【发布时间】:2020-10-03 16:33:24
【问题描述】:

我有一个 3185x90​​ 的二进制值数据集,并希望对独立性进行卡方检验,将所有列变量相互比较。

我已经尝试使用来自 google 搜索的不同代码变体,包括 chisq.test() 和一些 for 循环,但到目前为止,它们都没有奏效。

我该怎么做?

这是我修改过的框架。我的数据集是橡木。

chi_trial <- data.frame(a = c(0,1), b = c(0,1))
for(row in 1:nrow(oak)){
  print(row)
  print(chisq.test(c(oak[row,1],d[row,2])))
}

我也试过这个:

apply(d, 1, chisq.test)

这给了我错误: FUN(newX[, i], ...) 中的错误: 'x' 的所有条目必须是非负的和有限的


dput(oak[1:2],)
structure(list(post_flu = structure(c(1, 1, 1, 1, 1, 0, 0, 0, 
0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 
0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 
1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,

label = "Receipt of Flu Vaccine - Encounter Survey", format.stata = "%10.0g")), row.names = c(NA, 
-3185L), class = c("tbl_df", "tbl", "data.frame"), label = "Main Oakland Clinic Analysis Dataset")

我在输出的最后几行中添加了一个数据样本。数据集的部分很小,但看起来都是这样的。

【问题讨论】:

  • 您好 Joseph,不清楚您要在哪些行或列上执行 chisq.test。你能澄清一下吗?您打算如何纠正多重测试?此外,如果您至少提供数据样本dput(d[1:20,]),那么提供帮助会容易得多。您可以edit您的问题并粘贴输出。请用三个反引号(```)包围输出以获得更好的格式。请参阅How to make a reproducible example 了解更多信息。
  • 我赞同伊恩的评论。另外,您说您的目标是“比较所有变量”,但是 for 循环中的比较是逐行的。数据框行是观察值,而 是变量。作为一项规则,χ2 对于观察比较也没有真正意义,尽管我认为可能偶尔会有例外。
  • +1 给@IanCampbell(和 gersht)。即使您得到了特定问题的答案,从长远来看,这也可能不会为您提供服务。在确定您所做的事情是否正确或适当之前,您需要考虑更深层次的问题。
  • 我添加了一些数据。我想知道变量/列频率是否存在显着差异。最后,我不打算从事编码工作。我今年夏天正在进行的研究需要使用 r。我使用的代码通常来自其他堆叠的帖子,所以我不确定哪些可以工作。

标签: r for-loop chi-squared


【解决方案1】:

这是一个使用combn 的解决方案,用于获取列号 2 乘 2 的所有组合。使用 @Edward's answer 中的数据进行测试。

chisq2cols <- function(X){
  y <- matrix(0, ncol(X), ncol(X))
  cmb <- combn(ncol(X), 2)
  y[upper.tri(y)] <- apply(cmb, 2, function(k){
    tbl <- table(X[k])
    chisq.test(tbl)$p.value
  })
  y
}

chisq2cols(oak)
#     [,1]      [,2]       [,3]
#[1,]    0 0.7847063 0.32012466
#[2,]    0 0.0000000 0.01410326
#[3,]    0 0.0000000 0.00000000

【讨论】:

    【解决方案2】:

    您可以使用类似于以下代码的代码,它类似于 R 的 cor 函数。我没有你的数据,所以我在模拟一些。请注意,我使用传统的截止值 0.05 得到了一个显着的 p 值。

    set.seed(3)
    nr=3185; nc=3
    
    oak <- as.data.frame(matrix(sample(0:1, size=nr*nc, replace=TRUE), ncol=nc))
    oak
    
    mult.chi <- function(data){
      nc <- ncol(data)
      res <- matrix(0, nrow=nc, ncol=nc) # or NA
      for(i in 1:(nc-1))
        for(j in (i+1):nc)
          res[i,j] <- suppressWarnings(chisq.test(oak[,i], oak[,j])$p.value)
      rownames(res) <- colnames(data)
      colnames(res) <- colnames(data)
      res
    }
    
    mult.chi(oak)
    
    #    V1        V2         V3
    # V1  0 0.7847063 0.32012466
    # V2  0 0.0000000 0.01410326
    # V3  0 0.0000000 0.00000000
    

    因此,请考虑应用 cmets 中提到的多重测试调整。

    【讨论】:

      猜你喜欢
      • 2020-10-12
      • 2013-11-02
      • 1970-01-01
      • 2019-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-17
      • 1970-01-01
      相关资源
      最近更新 更多