卡方矩阵残差

Chi square matrix residuals

下面是一个从多个卡方检验中提取 p 值并将其显示为矩阵的函数。我正在尝试做同样的事情,但改为提取残差。感谢任何帮助。

示例数据:

df <- data.frame(first_column  = c(rep("E1_C1",5), rep("E1_C2",3), rep("E2_C2",7),rep("E3_C3",5)),
                  second_column = c(rep("E1_C1",3), rep("E1_C2",10), rep("E2_C2",4),rep("E3_C3",3)),
                  third_column = c(rep("E1_C1",7), rep("E1_C2",4), rep("E2_C2",3),rep("E3_C3",6)),
                  fourth_column = c(rep("E1_C1",4), rep("E1_C2",6), rep("E2_C2",6),rep("E3_C3",4))
)

P 值的卡方矩阵函数:

chisqmatrix <- function(x) {
  names = colnames(x);  num = length(names)
  m = matrix(nrow=num,ncol=num,dimnames=list(names,names))
  for (i in 1:(num-1)) {
    for (j in (i+1):num) {
      #browser()
      m[j,i] = chisq.test(x[, i, drop = TRUE],x[, j, drop = TRUE])$p.value
    }
  }
  return (m)
}

生成卡方 p 值矩阵

res <- chisqmatrix(df)
res[, -ncol(res)]

只需将您的函数从请求 $p.value 更改为请求 $residuals。这将提供(观察到的 - 预期的)/ sqrt(预期的)。如果您需要标准化残差请求 $stdres.

  chisqmatrix <- function(x) {
    names = colnames(x);  num = length(names)
    m = matrix(nrow=num,ncol=num,dimnames=list(names,names))
    for (i in 1:(num-1)) {
      for (j in (i+1):num) {
        #browser()
        m[j,i] = chisq.test(x[, i, drop = TRUE],x[, j, drop = TRUE])$residuals
      }
    }
    return (m)
  }

在您的例子中,返回的残差是一个 4x4 矩阵。下面的解决方案不是使用矩阵来获取结果,而是使用列表。这样你就可以拥有不同大小的矩阵。

对您的原始代码进行极少的更改:

chisqlist <- function(x) {
  names = colnames(x);  num = length(names)
  m = list()
  index = 1
  for (i in 1:(num-1)) {
    for (j in (i+1):num) {
      #browser()
      m[[index]] = chisq.test(x[, i, drop = TRUE],x[, j, drop = TRUE])$residuals
      index=index+1
    }
  }
  return (m)
}

编辑: 我确实更喜欢@Onyambu 的回答,但我没有看到。它会比嵌套的 for 循环更快。