пакет yacca cca: Ошибка в cor(x, o$canvarx, use = использовать): «y» должно быть числовым

#r

Вопрос:

Я пытаюсь использовать yacca пакет для выполнения анализа CCA. Пример кода выглядит следующим образом:

 library(yacca)
x <- matrix(data = rnorm(50*5), ncol=5)
y<- matrix(data = rnorm(50*10), ncol=10)
my_cca <- cca(x, y)
 

Ошибка, которую я получаю, такова:

Ошибка в cor(x, o$canvarx, use = использовать) : «y» должно быть числовым.

Я понимаю, что ввод cor должен быть числовым. Но я считаю, что мои данные являются числовыми. Например, str(y) str(x) ) говорит мне:

число [1:50, 1:5] 0.144 -0.392 0.464 -1.169 0.734 …

И, class(y) class(x) ) говорит мне:

[1] «матрица» «массив»

Я полагаю, что o$canvarx это переменная, полученная путем умножения матрицы на коэффициенты x и x, как описано здесь: https://rdrr.io/cran/yacca/src/R/cca.R. Но я не уверен в том, что может пойти не так. Любая помощь будет очень признательна.

Комментарии:

1. Я не знаю CCA, но кажется, что если x и y имеют одинаковые размеры, код работает. Например, определение y как matrix(data = rnorm(50 * 5), ncol = 5) . Помогает ли это? Имеет ли это для вас какой-то смысл?

2. Привет! Большое спасибо. Я заметил это только что, хотя, к сожалению, я не уверен, что с этим делать. CCA допускает, чтобы наборы » x » и » y » были разного размера (т. е. содержали разное количество столбцов, представляющих переменные/функции), хотя наблюдения (строки) должны быть одинакового размера. Но, возможно, это намек на то, что якка делает с матрицей (?).

3. Используя browser() я заметил, что вычисляются комплексные числа. Вот почему он говорит o$canvarx , что должен быть числовым-эта матрица прямо сейчас сложна. Строка, генерирующая комплексные числа, выглядит следующим образом: ey <- eigen(qr.solve(cyy, cyx) %*% qr.solve(cxx, cxy)) . И эти матрицы-всего лишь ковариационные матрицы: cxx <- cov(x, use = use); cyy <- cov(y, use = use); cxy <- cov(x, y, use = use); cyx <- t(cxy) . Опять же, нет большого представления о том, что происходит, но, возможно, использование browser() и исходный код yacca::cca могут помочь.

Ответ №1:

Оказывается, что для некоторых наборов входных матриц eigen() создавались решения с очень малыми (например, 1e-17) мнимыми компонентами. Затем это вызвало проблемы для нижестоящих функций, которые принимали реальные аргументы, что привело к ошибке, которую вы видели. (Странно, что это не всплыло в прошлом , и действительно, когда я запустил ваш пример, но обменялся x и y , я не получил ошибку. Но числовой шум может быть очень привередливым.) В любом случае, теперь на github есть исправление, так что, надеюсь, это решит проблему!