Как применить Chisq.test на уровнях разных категориальных переменных?
Я хочу выступить 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
Мне интересно сравнить уровни при разных результатах.
# for col1 levels different outcomes
table(x$col1,x$out)
#output
1 2
A 8 12
B 18 10
C 12 11
D 18 11
Например, чтобы сравнить уровень B в col1
для разных результатов 1,2 в out
,
Я хотел бы знать, как это можно распространить (или другим способом) на каждый уровень категориальной переменной?
# Expected output
p.value
col1.A *****
col1.B *****
col1.C *****
.
.
.
col3.E *****
Спасибо за внимание.
1 ответ
Решение
Это то, как вы бы это сделали, если бы вы хотели сделать критерий хи-квадрат для заданных вероятностей (с 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
В качестве альтернативы, если вы на самом деле хотите, чтобы A было против A, B против B и т. Д., Вы могли бы заменить определение getP
с:
getP <- function(lev, x, i) {
tab <- table(x$out, x[, i] == lev)
chisq.test(tab)$p.value
}