#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 есть исправление, так что, надеюсь, это решит проблему!