假设我有一个用户定义的相关系数 C,因此我创建了函数 C(x,y) 来计算两个变量之间的相关性。该函数给出三个输出(它是一个向量)A、B 和 C,其中 C 是相关性。假设我有一个包含许多变量(x、y、z、w 等)的数据集,并且我想获得包含所有成对 C 系数的相关矩阵。如何在 R 中实现这一点?我希望输出类似于 R 中已有的 cor() 函数给出的输出。我尝试了很多东西(循环、combn、apply,但似乎都不起作用)。
假设您有一个用户定义的函数,将两个向量之间的相关性计算为单个标量,可能是这样的:
C <- function(x, y) {
n <- length(x)
(n * sum(x * y) - sum(x) * sum(y)) /
sqrt(abs(n * sum(x^2) - sum(x)^2) * abs(n * sum(y^2) - sum(y)^2))
}
事实上,如果我们在两个随机向量上测试它,我们会看到我们得到与
cor
相同的输出:
set.seed(1)
x <- 1:5/10 + rnorm(5)
y <- 2:6/10 + rnorm(5)
C(x, y)
#> [1] 0.410903
cor(x, y)
#> [1] 0.410903
但是,一个重要的区别是,我们可以给
cor
一个数据框,它将计算列之间的所有成对相关性,输出一个矩阵,正如我们可以看到,如果我们将内置 的前 4 列传递给它iris
数据集:
cor(iris[1:4])
#> Sepal.Length Sepal.Width Petal.Length Petal.Width
#> Sepal.Length 1.0000000 -0.1175698 0.8717538 0.8179411
#> Sepal.Width -0.1175698 1.0000000 -0.4284401 -0.3661259
#> Petal.Length 0.8717538 -0.4284401 1.0000000 0.9628654
#> Petal.Width 0.8179411 -0.3661259 0.9628654 1.0000000
但显然这不适用于我们的手卷功能
C
:
C(iris[1:4])
#> Error in C(iris[1:4]): argument "y" is missing, with no default
使用我们自己的手动函数实现相同类型输出的最直接方法是构建一个矩阵,并迭代它的两个维度,用 i 的相关性填充每个条目 [i, j]使用双循环的数据帧的th和jth列:
C_dataframe <- function(x) {
m <- matrix(0, ncol = ncol(x), nrow = ncol(x),
dimnames = list(names(x), names(x)))
for(i in seq(nrow(m))) {
for(j in seq(ncol(m))) {
m[i, j] <- C(x[[i]], x[[j]])
}
}
m
}
现在测试这一点,仅使用我们自己的用户定义函数,我们从
C_dataframe
得到的输出与从 cor
得到的输出完全相同:
C_dataframe(iris[1:4])
#> Sepal.Length Sepal.Width Petal.Length Petal.Width
#> Sepal.Length 1.0000000 -0.1175698 0.8717538 0.8179411
#> Sepal.Width -0.1175698 1.0000000 -0.4284401 -0.3661259
#> Petal.Length 0.8717538 -0.4284401 1.0000000 0.9628654
#> Petal.Width 0.8179411 -0.3661259 0.9628654 1.0000000