Не scale
.
Прежде всего, нет необходимости в масштабируемых векторах, как показано в приведенном ниже коде.
Причина масштабирования векторов - вариант R FAQ 7.31 , см. Также ТАК . У более старых процессоров потеря точности была реальной проблемой, приводящей к явно ошибочным результатам. Это больше не так, по крайней мере, в общем случае.
#perform canonical correlation - original X sets and Y
cX1b <- cc(X_df[2:4], Y)$cor
cX2b <- cc(X_df[c(1, 3:4)], Y)$cor
cX3b <- cc(X_df[c(1:2, 4)], Y)$cor
cX4b <- cc(X_df[1:3], Y)$cor
XVALSb <- as.data.frame(rbind(cX1b, cX2b, cX3b, cX4b))
XVALS
и XVALSb
имена строк различны, сделайте их равными, чтобы угодить all.equal()
.
row.names(XVALS) <- 1:4
row.names(XVALSb) <- 1:4
Результаты не совсем равны, но находятся в пределах точности с плавающей точкой. В этом случае я проверяю равенство с all.equal
по умолчанию .Machine$double.eps^0.5
.
identical(XVALS, XVALSb)
#[1] FALSE
all.equal(XVALS, XVALSb)
#[1] TRUE
XVALS - XVALSb
# V1 V2 V3
#1 0.000000e+00 1.110223e-16 0.000000e+00
#2 -1.110223e-16 1.110223e-16 5.551115e-17
#3 1.110223e-16 -2.220446e-16 2.220446e-16
#4 1.110223e-16 4.440892e-16 1.110223e-16
Вопрос.
Чтобы получить все комбинации столбцов, оставив один, есть функция combn
. Функция cc_df_one_out
сначала вызывает combn
для каждого из своих аргументов, затем apply
для этих индексов анонимная функция, вычисляющая CCA::cc
.
Обратите внимание, что порядок строк не такой, как в опубликованном примере, поскольку combn
не соответствует порядку индексов столбцов.
cc_df_one_out <- function(X, Y){
f <- function(x) combn(ncol(x), ncol(x) - 1)
X_inx <- f(X)
Y_inx <- f(Y)
ccX <- t(apply(X_inx, 2, function(i) cc(X[, i], Y)$cor))
ccY <- t(apply(Y_inx, 2, function(i) cc(X, Y[, i])$cor))
list(XVALS = as.data.frame(ccX), YVALS = as.data.frame(ccY))
}
cc_df_one_out(X_df, Y_df)
#$XVALS
# V1 V2 V3
#1 0.8787169 0.6999526 0.5073979
#2 0.8922514 0.7244302 0.2979096
#3 0.8441566 0.7807032 0.3331449
#4 0.9059585 0.7371382 0.1344559
#
#$YVALS
# V1 V2
#1 0.8975949 0.7309265
#2 0.8484323 0.7488632
#3 0.8721945 0.7452478