Оценка данных и сохранение результата - PullRequest
1 голос
/ 19 июля 2011

Мой фрейм данных (m * n) содержит несколько сотен столбцов, мне нужно сравнить каждый столбец со всеми другими столбцами (таблица сопряженности), выполнить тест по критерию chisq и сохранить результаты для каждого столбца в другой переменной.

Он работает для одного столбца за раз, например,

s <- function(x) {
  a <- table(x,data[,1])
  b <- chisq.test(a)
}
c1 <- apply(data,2,s)

Результаты сохраняются в c1 для столбца 1, но как я зациклю это на всех столбцах и сохраню результаты для каждого столбца для дальнейшего анализа?

Ответы [ 2 ]

4 голосов
/ 19 июля 2011

Если вы уверены, что хотите это сделать (я бы не стал думать о проблеме мультитестинга), поработайте со списками:

Data <- data.frame(
    x=sample(letters[1:3],20,TRUE),
    y=sample(letters[1:3],20,TRUE),
    z=sample(letters[1:3],20,TRUE)
  )

# Make a nice list of indices
ids <- combn(names(Data),2,simplify=FALSE)

# use the appropriate apply
my.results <- lapply(ids,
      function(z) chisq.test(table(Data[,z]))
    )
# use some paste voodoo to give the results the names of the column indices
names(my.results) <- sapply(ids,paste,collapse="-")

# select all values for y :
my.results[grep("y",names(my.results))]

Не сложнее, чем это.Как я покажу вам в последней строке, вы можете легко получить все тесты для определенного столбца, поэтому нет необходимости составлять список для каждого столбца.Это просто занимает больше времени и занимает больше места, но дает ту же информацию.Вы можете написать небольшую вспомогательную функцию для извлечения нужных вам данных:

extract <- function(col,l){
    l[grep(col,names(l))]
}
extract("^y$",my.results)

, которая позволяет вам даже циклически перебирать различные имена столбцов вашего информационного кадра и получать список возвращаемых списков:

lapply(names(Data),extract,my.results)

Я настоятельно рекомендую вам ознакомиться с работой со списками, это один из самых мощных и чистых способов работы в R.

PS: имейте в виду, что вы сохраняете весь chisq.testобъект в вашем списке.Если вам нужно только значение для квадрата Хи или значение p, сначала выберите их.

4 голосов
/ 19 июля 2011

По сути, у вас есть несколько проблем:

  1. Вы в значительной степени полагаетесь на глобальные аргументы, а не на локальные.Это сбивает с толку двойное использование «данных».

  2. Аналогично, вы полагаетесь на жестко запрограммированное значение (столбец 1) вместо передачи его в качестве аргумента функции.

  3. Вы не извлекаете нужное значение из chisq.test ().Это означает, что ваш результат возвращается в виде списка.

  4. Вы не предоставили пример данных.Итак, вот некоторые из них:

    m <- 10 n <- 4 mytable <- matrix (runif (m * n), nrow = m, ncol = n) </p>

Как только вы исправите вышеуказанные проблемы, просто запустите цикл для различных столбцов (поскольку теперь вы избежали жесткого кодирования столбца) и сохраните результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...