Канонический корреляционный анализ в R

Я использую R (и пакет CCA) и пытаюсь выполнить регуляризованный канонический корреляционный анализ с двумя переменными наборами (обилие видов и количество продуктов питания, хранящихся в виде двух матриц Y и X соответственно), в которых количество единиц (N = 15) меньше числа переменных в матрицах, что составляет > 400 (большинство из них являются потенциальными "пояснительными" переменными с 12-13 "ответными" переменными). Gonzalez et al. (2008, http://www.jstatsoft.org/v23/i12/paper) обратите внимание, что пакет "включает в себя упорядоченную версию CCA для обработки наборов данных с большим количеством переменных, чем единиц", что конечно, то, что у меня есть только с 15 "единицами". Таким образом, я пытаюсь выполнить упорядоченный канонический корреляционный анализ с использованием пакета CCA, чтобы посмотреть на отношения в моих наборах переменных. Я слежу за процессом Gonzalez и др. (2008) в своей статье. Однако я получаю сообщение об ошибке Error in chol.default(Bmat) : the leading minor of order 12 is not positive definite, и я не знаю, что это значит или что с этим делать. Вот код, и любые идеи или знания по этому вопросу будут оценены.

library(CCA)
correl <- matcor(X, Y)
img.matcor(correl, type = 2)
res.regul <- estim.regul(X, Y, plt = TRUE,
    grid1 = seq(0.0001, 0.2, l=51),
    grid2 = seq(0, 0.2, l=51))

Error in chol.default(Bmat) : the leading minor of order 12 is not positive definite

(Примечание: estim.regul() занимает много времени (~ 30-40 минут), чтобы завершить, когда вы используете образец данных из CCA).

Любые советы? Кто-нибудь знает, что делать с этой ошибкой? Это потому, что у некоторых моих столбцов есть NA? Может ли это быть из-за столбцов со слишком большим количеством 0? Заранее благодарим за любую помощь, которую вы можете предложить этой комбинированной статистике и R novice.

Ответ 1

Фон

Канонический корреляционный анализ (CCA) представляет собой метод анализа разведочных данных (EDA), обеспечивающий оценки корреляционной зависимости между двумя наборами переменных, собранными на тех же экспериментальных единицах. Как правило, пользователи будут иметь две матрицы данных: X и Y, где строки представляют экспериментальные единицы, nrow (X) == nrow (Y).

В R базовый пакет предоставляет функцию cancor() для включения CCA. Это ограничено случаями, когда число наблюдений больше числа переменных (признаков), nrow (X) > ncol (X).

CCA R-пакета является одним из нескольких, которые обеспечивают расширенные функции CCA. Пакет CCA предлагает набор функций обертки вокруг cancor(), которые позволяют учитывать случаи, когда счетчик функций превышает количество экспериментальных единиц, ncol (X) > nrow (X). Gonzalez et al (2008) CCA: пакет R для расширения канонического корреляционного анализа, описывает работу в деталях. Версия 1.2 package CCA (опубликованная 2014-07-02) актуальна на момент написания.

Возможно, стоит также упомянуть, что пакеты kinship и accuracy, упомянутые в более раннем ответе, больше не размещаются в CRAN.

Диагностика

Прежде чем перейти к другим пакетам или применить неизвестные методы к вашим (предположительно трудно выигравшим!) данным, возможно полезно попробовать и диагностировать проблему с данными.

Матрицы, переданные в любую из описанных здесь подпрограмм CCA, в идеале должны быть численно полными (без пропущенных значений). Матрицы, переданные в любую из описанных здесь подпрограмм CCA, в идеале должны быть численно полными (без пропущенных значений). Число канонических коррелятов, оцененное по процедуре, будет равно минимальному рангу столбца X и Y, то есть <= min (ncol (X), ncol (Y)). В идеале столбцы каждой матрицы будут линейно независимыми (не линейными комбинациями других).

Пример:

library(CCA)
data(nutrimouse)
X <- as.matrix(nutrimouse$gene[,1:10])
Y <- as.matrix(nutrimouse$lipid)

cc(X,Y) ## works

X[,1] <- 2 * X[,9] ## column 9 no longer provides unique information

cc(X,Y)

Error in chol.default(Bmat) :
  the leading minor of order 9 is not positive definite

Это симптом, наблюдаемый в исходном посте. Один простой тест - попробовать установить без этой колонки

cc(X[,-9],Y) ## works

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

Кроме того, иногда численная нестабильность может быть решена с помощью стандартных (см. ?scale) переменных для одной (или обеих) входных матриц:

X <- scale(X)

Пока мы здесь, возможно, стоит отметить, что регуляризованный CCA - это, по сути, двухэтапный процесс. Для оценки параметров регуляризации (с использованием estim.regul()) проводится перекрестная проверка, и эти параметры затем используются для выполнения регуляризованного CCA (с rcc()).

Пример, приведенный в статье (аргументы, используемые дословно в исходном сообщении)

res.regul <- estim.regul(X, Y, plt = TRUE,
                               grid1 = seq(0.0001, 0.2, l=51),
                               grid2 = seq(0, 0.2, l=51))

вызывает перекрестную проверку в сетке ячейки 51 * 51 = 2601. Хотя это создает хорошую графику для бумаги, это не разумные настройки для первоначальных тестов на ваши собственные данные. Как утверждают авторы, "вычисление не очень требовательно. Оно продолжалось менее одного часа на компьютере" текущего использования "для 51 х 51 сетки". С 2008 года ситуация немного улучшилась, но сетка по умолчанию 5 х 5, созданная

estim.regul(X,Y,plt=TRUE) 

- отличный выбор для поисковых целей. Если вы собираетесь ошибаться, вы можете сделать их как можно быстрее.

Ответ 2

Ваша X-дисперсионно-ковариационная матрица не является положительно-определенной, поэтому ошибка при внутреннем вызове fda::geigen.

Там аналогичная функция для регуляризованного CCA в пакете mixOmics, но я предполагаю, что это приведет к тому же сообщению об ошибке, поскольку оно в основном использует тот же подход (за исключением того, что они подключили функцию geigen непосредственно к функции rcc). Я действительно не могу вспомнить, как я могу работать с моими данными, для связанной проблемы (но я рассмотрю мой старый код, как только найду его снова: -)

Одним из решений было бы использовать обобщенное разложение Холецкого. Есть один в kinship (gchol; будьте осторожны, он возвращает нижнюю треугольную матрицу) или accuracy (sechol). Конечно, это означает изменение кода внутри функции, но это не проблема, IMO. Или вы можете попытаться сделать Var (X) PD с make.positive.definite из пакета corpcor.

В качестве альтернативы вы можете рассмотреть возможность использования пакета RGCCA, который предлагает унифицированный интерфейс для PLS (моделирование путей) и методов CCA с k блоками.