假设我有一个用户定义的相关系数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

使用我们自己的手滚函数实现相同类型输出的最直接方法是构建一个矩阵,并迭代它的两个维度,使用双循环使用数据帧的ithjth列的相关性填充每个条目[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

R相关问答推荐

使用sensemakr和fixest feols模型(R)

在R底座中更改白天和夜晚的背景 colored颜色

terra nearest()仅为所有`to_id`列返回NA

pickerInput用于显示一条或多条geom_hline,这些线在图中具有不同 colored颜色

如何得到R中唯一的组合群?

为什么我的基准测试会随着样本量的增加而出现一些波动?

提取第一个下划线和最后一个下划线之间的任何内容,例外情况除外

在R中按行按列范围查找最大值的名称

识别连接的子网(R-igraph)

为左表中的所有行使用值Fill滚动左连接

从多个可选列中选取一个值到一个新列中

R如何将列名转换为更好的年和月格式

我将工作代码重构为一个函数--现在我想不出如何传递轴列参数

循环遍历多个变量,并将每个变量插入函数R

R中的Desolve:返回的导数数错误

如何使用list_rind在列表中保留已命名但不包含第0行的记录?

R,将组ID分配给另一个观测ID变量中的值的组合

删除r中每个因素级别的最后2行

如何在基数R中根据矩阵散点图中的因子给数据上色?

用LOOCV进行K近邻问题