Критерий хи-квадрат независимости для всех комбинаций столбцов в кадре данных в R

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

У меня есть данные о наличии / отсутствии (бинарные) по 72 видам растений на 323 участках одного водосбора. Фрейм данных состоит из 323 строк, каждая из которых представляет график, с 72 столбцами, каждая из которых представляет вид. Это образец первых 4 столбцов (некоторые номера строк отсутствуют, потому что 323 графика являются подмножеством большего количества заранее назначенных графиков, не все из которых были исследованы):

> head(plots[,1:4])
 Agrostis.canina Agrostis.capillaris Alchemilla.alpina Anthoxanthum.odoratum
1               1                   0                 0                     0
3               0                   0                 0                     0
4               0                   0                 0                     0
5               0                   0                 0                     0
6               0                   0                 0                     0
8               0                   0                 0                     0

Я хочу определить, связаны ли какие-либо виды растений в этом водосборе с другими, и если да, то является ли это положительной или отрицательной ассоциацией. Для этого я хочу провести тест независимости хи-квадрат для каждой комбинации видов. Мне нужно создать таблицу сопряженности 2x2 для каждого сравнения видов и видов, запустить тест хи-квадрат для каждой из этих таблиц сопряженности и сохранить результат. В конечном итоге я хотел бы закончить списком или матрицей всех видов по видам тестов, которые показывают, имеет ли эта комбинация видов положительную, отрицательную или никакую значимую связь. Я также хотел бы включить некоторый код, который показывает связь как положительную, только если все ожидаемые значения были больше 5.

Я начал с написания следующей функции:

CHI <- function(sppx, sppy) 
{test <- chisq.test(table(sppx, sppy)) 
result <- c(test$statistic, test$p.value,
        sign((table(sppx, sppy) - test$expected)[2,2]))
return(result)
}

Это возвращает следующее:

> CHI(plots$Agrostis.canina, plots$Agrostis.capillaris)

X-squared                             
1.095869e-27  1.000000e+00 -1.000000e+00 
Warning message:
In chisq.test(chitbl) : Chi-squared approximation may be incorrect

Теперь я пытаюсь найти способ применить эту функцию к каждой комбинации видов и видов во фрейме данных. По сути, я хочу, чтобы R взял каждый столбец, применил функцию CHI к этому столбцу и каждому другому столбцу последовательно, и так далее по всем столбцам, вычитая каждый столбец из фрейма данных, как это делается, чтобы одна и та же пара видов не тестировалась дважды . Я пробовал различные методы, пытаясь использовать циклы «for» или «применить» функции, но не смог понять этого. Надеюсь, это достаточно ясно. Любая помощь здесь будет очень признательна. Я попытался найти существующие решения этой конкретной проблемы в Интернете, но не смог найти ничего, что действительно помогло. Если бы кто-нибудь мог связать меня с существующим ответом на этот вопрос, это тоже было бы здорово.


person YJS    schedule 23.05.2016    source источник


Ответы (3)


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

apply(combn(1:ncol(plots), 2), 2, function(ind) CHI(plots[, ind[1]], plots[, ind[2]]))
person Psidom    schedule 23.05.2016

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

require(datasets)
ind<-combn(NCOL(iris),2)
lapply(1:NCOL(ind), function (i) CHI(iris[,ind[1,i]],iris[,ind[2,i]]))
person Jeonifer    schedule 23.05.2016
comment
@Psidom, ты был супер быстрым; извините, я не могу удалить свой ответ, так как нет кнопки удаления. Это научит меня обновляться перед публикацией. - person Jeonifer; 23.05.2016
comment
Большое спасибо за вашу помощь! Я пробовал использовать этот код для своих данных: `› plotc ‹- combn (NCOL (plots), 2)› ›lapply (1: NCOL (data), function (i) CHI (plots [, plotc [1, i]] , plots [, plotc [2, i]])) [[1]] X-squared 1.095869e-27 1.000000e + 00 -1.000000e + 00 `Это возвращает единственный результат. Я хотел бы вывести результат каждого отдельного теста хи-квадрат - по одному для каждого элемента в таблице комбинаций. Извините, возможно, это было неясно в моем первоначальном вопросе. Вы знаете, как этого добиться? Спасибо еще раз - person YJS; 24.05.2016
comment
Вы указали в своем коде только один вывод. Если вы хотите, чтобы все они удалили [[1]] в конце вашего кода и оставили только plotc <- combn(NCOL(plots),2); lapply(1:NCOL(data), function (i) CHI(plots[,plotc[1,i]],plots[,plotc[2,i]])) - person Jeonifer; 24.05.2016
comment
Извините, это было плохое форматирование с моей стороны - я думал, что если поставить `на любой стороне моего сегмента кода, он отобразится как код, но, по-видимому, нет. [[1]] - это первая строка вывода R консоли, а не мой код. Я запускаю код, поскольку вы только что отобразили его в своем комментарии, и он возвращает список длиной 1. - person YJS; 24.05.2016
comment
Я вижу, где проблема в замене NCOL(data) на NCOL(plotc). В моем коде я изначально назвал переменную data, а не ind, и не менял ее в lapply. Я отредактирую свой код. - person Jeonifer; 24.05.2016
comment
Хм ... Я попытался изменить NCOL (данные) на NCOL (plotc), и теперь я получаю следующее сообщение: Ошибка в (table (sppx, sppy) - test $ expected) [2, 2]: индекс за пределами Это то же сообщение об ошибке, которое я получил, когда попробовал код в ответе Псидома. Я попытался запустить код по-разному (1: NCOL (ind), ... и это произвело правильные значения, но только создало список из 10. Я чувствую, что это становится все ближе! - person YJS; 24.05.2016
comment
Посмотрите, работает ли изменение функции CHI. CHI <- function(sppx, sppy) {test <- chisq.test(sppx, sppy) result <- c(test$statistic, test$p.value,sign((test$observed - test$expected)[2,2])) return(result) } - person Jeonifer; 24.05.2016
comment
Пытался изменить функцию CHI, как вы описали, но все равно получил список из 10. Очень странно .. - person YJS; 24.05.2016
comment
Что такое dim(plotc) и class(plotc)? - person Jeonifer; 24.05.2016
comment
dim 22556, матрица классов. - person YJS; 24.05.2016

Приведенный ниже код R запускает тест chisquare для каждой категориальной переменной / каждого фактора кадра данных r против заданной переменной (параметр chisquare x или y остается стабильным, явно определен):

Определите свою переменную. Пожалуйста, измените df $ variable1 на желаемую факторную переменную и df на желаемый фрейм данных, который содержит все факторные переменные, протестированные против данной df $ variable1

Определите свой фрейм данных. Создается новый фрейм данных (df2), который будет содержать все значения хи-квадрат / dfs, значение p данной переменной и сравнения фреймов данных

Код, созданный / завершенный / измененный из похожих сообщений в stackoverflow, ни один из них не дал желаемого результата. Значения статистики / df / p в таблицах хи-квадрат для переменной и параметра «2» фрейма данных определяют сравнения по всему столбцу - отметьте опцию «Применить» (MARGIN).

df2 <- t(round(cbind(apply(df, 2, function(x) {
  ch <- chisq.test(df$variable1, x)
  c(unname(ch$statistic), ch$parameter, ch$p.value )})), 3))
person Elias EstatisticsEU    schedule 14.05.2017