Как применить 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  *****

Спасибо за внимание.


person Prradep    schedule 12.06.2015    source источник
comment
Что ты имеешь в виду? Как вы предлагаете сделать chisq.test только на одном уровне фактора?   -  person thelatemail    schedule 12.06.2015
comment
@thelatemail Я хочу сравнить каждый уровень для разных результатов. Я попытался привести пример, это имеет смысл?   -  person Prradep    schedule 12.06.2015
comment
@NickK Даже мне было интересно, как подойти к этому после того, как один из моих коллег обратился ко мне с вопросом из эта статья. В таблице 1 они сравнили разные уровни образования по заболеванию. Пожалуйста, поправьте меня, если мое понимание и вопрос, заданный здесь, не связаны.   -  person Prradep    schedule 12.06.2015
comment
Для каждой из категорий, которые они оценили, для каждой они построили таблицу непредвиденных обстоятельств 2x2, например. высшее образование по сравнению с отсутствием высшего образования в строках и преэклампсией по сравнению с отсутствием преэклампсии в столбцах. Это отличается от того, что вы задали в своем вопросе. Ваши категории взаимоисключающие (для столбца 1 вы не можете быть A + B), тогда как их категории перекрываются (вы можете иметь высшее образование и ‹12 лет обучения по крайней мере в их наборе данных, хотя это кажется мне необычным).   -  person Nick Kennedy    schedule 12.06.2015
comment
@NickK Спасибо за объяснение, теперь я понял, что этот пример не имеет отношения к моему вопросу. Перекрывающиеся параметры образования для меня неоднозначны, в отличие от категориальной переменной Статус курения.   -  person Prradep    schedule 12.06.2015
comment
Я все еще не уверен, что дал тебе то, что ты хочешь. Я подозреваю, что вы можете захотеть либо делать А, либо не А, Б или не Б и т. д. Было бы проще, если бы вы дали больше контекста. Для статуса курения вы можете выбрать текущие и неактуальные и когда-либо или никогда.   -  person Nick Kennedy    schedule 12.06.2015
comment
@NickK Я получил информацию из твоего объяснения. Я посоветовал своему коллеге нести chi.sq в статусе курения, который имеет три уровня, и следовать тому же самому для других категориальных переменных, имеющих таблицу непредвиденных обстоятельств n * 2 (n > 1).   -  person Prradep    schedule 12.06.2015


Ответы (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
}
person Nick Kennedy    schedule 12.06.2015
comment
Спасибо, я новичок в R. Хотя я не понял решение, которое вы предоставили сейчас, надеюсь, я пойму в ближайшие несколько минут. - person Prradep; 12.06.2015