Итеративно / последовательно удаляйте и заменяйте переменную df и передавайте в функцию - PullRequest
1 голос
/ 20 января 2020

Я пытаюсь оценить стабильность корреляционного анализа путем итеративного отбрасывания переменной и повторного запуска анализа.

Насколько я понимаю, это требует от меня (1) создания матриц длины p -1, путем итеративного / последовательного удаления переменной из кадра данных, (2) запускает корреляционную функцию по ряду матриц и (3) передает вывод в общий кадр данных или список для последующего анализа.

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


#required library for cc function
library(CCA)

#set seed
set.seed(123)

#X and Y dataframes
X_df <- data.frame(replicate(4,sample(1:10,10,rep=TRUE)))
Y_df <- data.frame(replicate(3,sample(1:10,10,rep=TRUE)))

#X and Y as scaled matrices
X <- scale(X_df)
Y <- scale(Y_df)

#manually omit a variable/column from the X df
X1 <- scale(X_df[2:4]) 
X2 <- scale(X_df[c(1, 3:4)]) 
X3 <- scale(X_df[c(1:2, 4)]) 
X4 <- scale(X_df[1:3]) 

#manually omit a variable/column from the Y df
Y1 <- scale(Y_df[2:3]) 
Y2 <- scale(Y_df[c(1, 3)]) 
Y3 <- scale(Y_df[1:2]) 

#perform canonical correlation - X sets and Y
cX1 <- cc(X1,Y)$cor
cX2 <- cc(X2,Y)$cor
cX3 <- cc(X3,Y)$cor
cX4 <- cc(X4,Y)$cor

#perform canonical correlation - Y sets and X
cY1 <- cc(X,Y1)$cor
cY2 <- cc(X,Y2)$cor
cY3 <- cc(X,Y3)$cor

#get canonical correlation values into a df
XVALS <- as.data.frame(rbind(cX1, cX2, cX3, cX4))
YVALS <- as.data.frame(rbind(cY1, cY2, cY3))

Конечно, я знаю, что делать это вручную очень плохо, и мои реальные данные намного больше.

К сожалению, я довольно плохо знаком с R (и кодированием), и изо всех сил пытался выполнить любой из этих шагов лучшим способом. Я знаком с (существованием) функций применения, а также с некоторыми функциями в dplyr, которые, по моему мнению, вероятно, актуальны (например, select), но я просто не могу заставить его работать, несмотря на чтение документации и, казалось бы, похожих постов в течение нескольких часов. - Любое руководство будет с благодарностью.

1 Ответ

0 голосов
/ 20 января 2020

Не 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...