R 如何在不同类别变量的水平上应用Chisq.test?

R 如何在不同类别变量的水平上应用Chisq.test?,r,statistics,sapply,chi-squared,R,Statistics,Sapply,Chi Squared,我想对分类变量的每个级别执行chisq.test() 目前,我已经使用下面的代码在每个分类变量上实现了这一点 # Random generation of values for categorical data set.seed(12) x <- data.frame(col1 = sample( LETTERS[1:4], 100, replace=TRUE ), col2 = sample( LETTERS[3:6], 100, replace=TRU

我想对分类变量的每个级别执行
chisq.test()

目前,我已经使用下面的代码在每个分类变量上实现了这一点

# Random generation of values for categorical data
set.seed(12)
x <- data.frame(col1 = sample( LETTERS[1:4], 100, replace=TRUE ), 
                col2 = sample( LETTERS[3:6], 100, replace=TRUE ),
                col3 = sample( LETTERS[2:5], 100, replace=TRUE ),
                out = sample(c(1,2),100, replace=TRUE))

# performing chisq.test
pval <- as.data.frame(sapply(c(1:3),function(i)chisq.test(x[,i],x[,'out'])$p.value ))

#output
    p.value
1 0.33019256
2 0.08523487
3 0.79403367
例如,比较
col1
中的B级,以获得
out
中的不同结果1,2

我想知道如何将其扩展(或以另一种聪明的方式)到分类变量的每个级别

# Expected output
       p.value

col1.A  *****
col1.B  *****
col1.C  *****
.
.
.
col3.E  *****

感谢您的关注。

如果您想对给定的概率进行卡方检验(使用
p=rep(0.5,2)
),您可以这样做

我将其分解,以便更容易理解:

getP <- function(lev, x, i) {
  tab <- table(x$out[x[, i] == lev])
  chisq.test(tab)$p.value
}
pvalList <- lapply(1:3, function(i) {
  df <- data.frame(Column = i, Category = levels(x[, i]))
  df$p.value <- sapply(df$Category, getP, x, i)
  df
})
pval <- do.call("rbind", pvalList) # Convert to single data frame

什么意思?您打算如何只对一个因素的一个水平进行
chisq.test
。@latemail我想比较每个水平的不同结果。我试着举个例子,这有意义吗?@NickK甚至在我的一位同事向我提出了一个问题后,我都在想如何处理这个问题。在表1中,他们对该疾病的不同教育水平进行了比较。如果我的理解和这里提出的问题不相关,请纠正我。对于他们评估的每个类别,他们已经为每个类别构建了一个2x2列联表,例如行中的高等教育与无高等教育,列中的子痫前期与无子痫前期。这与你在问题中提出的不同。您的类别是相互排斥的(对于第1列,您不能是A+B),而它们是重叠的(你可以接受高等教育,@NickK谢谢你的解释,我现在明白了这个例子与我的问题无关。与吸烟状况分类变量不同,重叠的教育参数对我来说是模糊的。谢谢,我是一个R初学者。虽然我不理解你现在提供的解决方案,但希望我能理解再过几分钟。
getP <- function(lev, x, i) {
  tab <- table(x$out[x[, i] == lev])
  chisq.test(tab)$p.value
}
pvalList <- lapply(1:3, function(i) {
  df <- data.frame(Column = i, Category = levels(x[, i]))
  df$p.value <- sapply(df$Category, getP, x, i)
  df
})
pval <- do.call("rbind", pvalList) # Convert to single data frame
getP <- function(lev, x, i) {
  tab <- table(x$out, x[, i] == lev)
  chisq.test(tab)$p.value
}