首页 > 解决方案 > 迭代/顺序删除并替换 df 变量并输入函数

问题描述

我试图通过迭代删除变量并重新运行分析来评估相关分析的稳定性。

据我了解,这需要我 (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(和编码)还很陌生,并且一直在努力以更好的方式实现这些步骤中的任何一个。我熟悉 apply 函数(存在)以及我认为可能相关的 dplyr 中的一些函数(例如,select),但是尽管阅读了几个小时的文档和看似相似的帖子,但我还是无法让它工作——任何指导将不胜感激。

标签: r

解决方案


不要scale

首先,不需要缩放向量,如下面的代码所示。
向量缩放的原因是R FAQ 7.31的变体,另请参阅此SO 帖子。对于较旧的处理器,精度损失是一个真正的问题,导致明显错误的结果。这不再是真的,至少在一般情况下不是这样。

#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))

XVALSXVALSb行名不同,为了取悦让它们相等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

这个问题。

要获得所有列的组合,留下一个列有 function 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

推荐阅读