r - 迭代/顺序删除并替换 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
),但是尽管阅读了几个小时的文档和看似相似的帖子,但我还是无法让它工作——任何指导将不胜感激。
解决方案
不要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))
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
这个问题。
要获得所有列的组合,留下一个列有 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
推荐阅读
- python - kivy - GridLayout 中的第一行是空白的,最后一行是隐藏的,ScrollView
- arrays - 在 malloc 数组的中间添加一个元素
- python - 使用while方法时,会抛出错误名称错误
- c# - 从 docker linux 的 appsettings.json 访问文件路径
- graphql - 为 apollo nuxt 启用批处理
- r - 如何仅从日期(仅月、日)中获取唯一值?
- python - 求平均值时,我该如何解决只能将str(不是“int”)连接到str?
- c# - 在初始化组件之前使用异步方法初始化 Blazor 范围服务
- ios - Xcode 11.3.1 - 命令 PhaseScriptExecution 失败,退出代码为非零
- java - 在junit spring boot应用程序中模拟