假设我有一个用户定义的相关系数C,因此我创建了函数C(x,y)来计算两个变量之间的相关性.此函数提供三个输出(它是一个向量)A、B和C,其中C是相关性.假设我有一个包含许多变量(x、y、z、w等)的数据集,并且我希望获得具有所有成对C系数的相关矩阵.如何在R中实现这一点?我希望输出结果类似于R中已有的cor()函数给出的输出.我try 了很多方法(循环、组合、应用,但似乎都不能很好地工作).
假设我有一个用户定义的相关系数C,因此我创建了函数C(x,y)来计算两个变量之间的相关性.此函数提供三个输出(它是一个向量)A、B和C,其中C是相关性.假设我有一个包含许多变量(x、y、z、w等)的数据集,并且我希望获得具有所有成对C系数的相关矩阵.如何在R中实现这一点?我希望输出结果类似于R中已有的cor()函数给出的输出.我try 了很多方法(循环、组合、应用,但似乎都不能很好地工作).
假设您有一个用户定义的函数,该函数计算作为单个标量的两个向量之间的相关性,可能如下所示:
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
一个数据帧,它将计算列之间的所有成对相关性,输出一个矩阵,因为我们可以看到,如果我们将内置iris
数据集的前4列传递给它:
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
使用我们自己的手滚函数实现相同类型输出的最直接方法是构建一个矩阵,并迭代它的两个维度,使用双循环使用数据帧的ith和jth列的相关性填充每个条目[i, j]:
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