cor() 中方法的默认值
default value for method in cor()
我正在使用 GGally::ggscatmat
生成相关矩阵图。在帮助文件 ?ggscatmat
中它说它调用 cor()
来计算相关性。它没有列出默认值。如果未指定方法,我开始查看 cor
以找出默认值。
?corr
列出 cor(x, y = NULL, use = "everything", method = c("pearson", "kendall", "spearman"))
所以为了解释这个我试图理解函数 cor
本身:
function (x, y = NULL, use = "everything", method = c("pearson",
"kendall", "spearman"))
{
na.method <- pmatch(use, c("all.obs", "complete.obs",
"pairwise.complete.obs", "everything", "na.or.complete"))
if (is.na(na.method))
stop("invalid 'use' argument")
method <- match.arg(method)
if (is.data.frame(y))
y <- as.matrix(y)
if (is.data.frame(x))
x <- as.matrix(x)
if (!is.matrix(x) && is.null(y))
stop("supply both 'x' and 'y' or a matrix-like 'x'")
if (!(is.numeric(x) || is.logical(x)))
stop("'x' must be numeric")
stopifnot(is.atomic(x))
if (!is.null(y)) {
if (!(is.numeric(y) || is.logical(y)))
stop("'y' must be numeric")
stopifnot(is.atomic(y))
}
Rank <- function(u) {
if (length(u) == 0L)
u
else if (is.matrix(u)) {
if (nrow(u) > 1L)
apply(u, 2L, rank, na.last = "keep")
else row(u)
}
else rank(u, na.last = "keep")
}
if (method == "pearson")
.Call(C_cor, x, y, na.method, FALSE)
else if (na.method %in% c(2L, 5L)) {
if (is.null(y)) {
.Call(C_cor, Rank(na.omit(x)), NULL, na.method, method ==
"kendall")
}
else {
nas <- attr(na.omit(cbind(x, y)), "na.action")
dropNA <- function(x, nas) {
if (length(nas)) {
if (is.matrix(x))
x[-nas, , drop = FALSE]
else x[-nas]
}
else x
}
.Call(C_cor, Rank(dropNA(x, nas)), Rank(dropNA(y,
nas)), na.method, method == "kendall")
}
}
else if (na.method != 3L) {
x <- Rank(x)
if (!is.null(y))
y <- Rank(y)
.Call(C_cor, x, y, na.method, method == "kendall")
}
else {
if (is.null(y)) {
ncy <- ncx <- ncol(x)
if (ncx == 0)
stop("'x' is empty")
r <- matrix(0, nrow = ncx, ncol = ncy)
for (i in seq_len(ncx)) {
for (j in seq_len(i)) {
x2 <- x[, i]
y2 <- x[, j]
ok <- complete.cases(x2, y2)
x2 <- rank(x2[ok])
y2 <- rank(y2[ok])
r[i, j] <- if (any(ok))
.Call(C_cor, x2, y2, 1L, method == "kendall")
else NA
}
}
r <- r + t(r) - diag(diag(r))
rownames(r) <- colnames(x)
colnames(r) <- colnames(x)
r
}
else {
if (length(x) == 0L || length(y) == 0L)
stop("both 'x' and 'y' must be non-empty")
matrix_result <- is.matrix(x) || is.matrix(y)
if (!is.matrix(x))
x <- matrix(x, ncol = 1L)
if (!is.matrix(y))
y <- matrix(y, ncol = 1L)
ncx <- ncol(x)
ncy <- ncol(y)
r <- matrix(0, nrow = ncx, ncol = ncy)
for (i in seq_len(ncx)) {
for (j in seq_len(ncy)) {
x2 <- x[, i]
y2 <- y[, j]
ok <- complete.cases(x2, y2)
x2 <- rank(x2[ok])
y2 <- rank(y2[ok])
r[i, j] <- if (any(ok))
.Call(C_cor, x2, y2, 1L, method == "kendall")
else NA
}
}
rownames(r) <- colnames(x)
colnames(r) <- colnames(y)
if (matrix_result)
r
else drop(r)
}
}
}
<bytecode: 0x0000024e4d4e22b0>
<environment: namespace:stats>
不幸的是,这超出了我理解 R 的能力。有人可以解释一下 cor
如何在未指定方法的情况下决定应用哪种方法吗?
TLDR:列出的第一个,所以是“pearson”
更多信息:
第 8 行指定 method <- match.arg(method)
。
这意味着如果用户指定 method="something"
则使用 "something"
。
但是,如果用户没有指定 method
参数,则使用默认值 method = c("pearson", "kendall", "spearman")
。啊,但是你会问,哪个?那里列出了 3 个!答案在于 match.arg
函数的工作原理。请参阅 ?match.arg
,其中指出使用了 first 元素。
所以在这种情况下,如果您调用 cor(x, y)
而不指定 method
参数,它与 cor(x, y, method="pearson")
相同。 @missuse 在顶部的评论中提供了一个示例,我已将其复制到此处:
set.seed(123)
x <- rnorm(100)
y <- rnorm(100)
all.equal( cor(x, y),
cor(x, y, method = "pearson") )
我正在使用 GGally::ggscatmat
生成相关矩阵图。在帮助文件 ?ggscatmat
中它说它调用 cor()
来计算相关性。它没有列出默认值。如果未指定方法,我开始查看 cor
以找出默认值。
?corr
列出 cor(x, y = NULL, use = "everything", method = c("pearson", "kendall", "spearman"))
所以为了解释这个我试图理解函数 cor
本身:
function (x, y = NULL, use = "everything", method = c("pearson",
"kendall", "spearman"))
{
na.method <- pmatch(use, c("all.obs", "complete.obs",
"pairwise.complete.obs", "everything", "na.or.complete"))
if (is.na(na.method))
stop("invalid 'use' argument")
method <- match.arg(method)
if (is.data.frame(y))
y <- as.matrix(y)
if (is.data.frame(x))
x <- as.matrix(x)
if (!is.matrix(x) && is.null(y))
stop("supply both 'x' and 'y' or a matrix-like 'x'")
if (!(is.numeric(x) || is.logical(x)))
stop("'x' must be numeric")
stopifnot(is.atomic(x))
if (!is.null(y)) {
if (!(is.numeric(y) || is.logical(y)))
stop("'y' must be numeric")
stopifnot(is.atomic(y))
}
Rank <- function(u) {
if (length(u) == 0L)
u
else if (is.matrix(u)) {
if (nrow(u) > 1L)
apply(u, 2L, rank, na.last = "keep")
else row(u)
}
else rank(u, na.last = "keep")
}
if (method == "pearson")
.Call(C_cor, x, y, na.method, FALSE)
else if (na.method %in% c(2L, 5L)) {
if (is.null(y)) {
.Call(C_cor, Rank(na.omit(x)), NULL, na.method, method ==
"kendall")
}
else {
nas <- attr(na.omit(cbind(x, y)), "na.action")
dropNA <- function(x, nas) {
if (length(nas)) {
if (is.matrix(x))
x[-nas, , drop = FALSE]
else x[-nas]
}
else x
}
.Call(C_cor, Rank(dropNA(x, nas)), Rank(dropNA(y,
nas)), na.method, method == "kendall")
}
}
else if (na.method != 3L) {
x <- Rank(x)
if (!is.null(y))
y <- Rank(y)
.Call(C_cor, x, y, na.method, method == "kendall")
}
else {
if (is.null(y)) {
ncy <- ncx <- ncol(x)
if (ncx == 0)
stop("'x' is empty")
r <- matrix(0, nrow = ncx, ncol = ncy)
for (i in seq_len(ncx)) {
for (j in seq_len(i)) {
x2 <- x[, i]
y2 <- x[, j]
ok <- complete.cases(x2, y2)
x2 <- rank(x2[ok])
y2 <- rank(y2[ok])
r[i, j] <- if (any(ok))
.Call(C_cor, x2, y2, 1L, method == "kendall")
else NA
}
}
r <- r + t(r) - diag(diag(r))
rownames(r) <- colnames(x)
colnames(r) <- colnames(x)
r
}
else {
if (length(x) == 0L || length(y) == 0L)
stop("both 'x' and 'y' must be non-empty")
matrix_result <- is.matrix(x) || is.matrix(y)
if (!is.matrix(x))
x <- matrix(x, ncol = 1L)
if (!is.matrix(y))
y <- matrix(y, ncol = 1L)
ncx <- ncol(x)
ncy <- ncol(y)
r <- matrix(0, nrow = ncx, ncol = ncy)
for (i in seq_len(ncx)) {
for (j in seq_len(ncy)) {
x2 <- x[, i]
y2 <- y[, j]
ok <- complete.cases(x2, y2)
x2 <- rank(x2[ok])
y2 <- rank(y2[ok])
r[i, j] <- if (any(ok))
.Call(C_cor, x2, y2, 1L, method == "kendall")
else NA
}
}
rownames(r) <- colnames(x)
colnames(r) <- colnames(y)
if (matrix_result)
r
else drop(r)
}
}
}
<bytecode: 0x0000024e4d4e22b0>
<environment: namespace:stats>
不幸的是,这超出了我理解 R 的能力。有人可以解释一下 cor
如何在未指定方法的情况下决定应用哪种方法吗?
TLDR:列出的第一个,所以是“pearson”
更多信息:
第 8 行指定 method <- match.arg(method)
。
这意味着如果用户指定 method="something"
则使用 "something"
。
但是,如果用户没有指定 method
参数,则使用默认值 method = c("pearson", "kendall", "spearman")
。啊,但是你会问,哪个?那里列出了 3 个!答案在于 match.arg
函数的工作原理。请参阅 ?match.arg
,其中指出使用了 first 元素。
所以在这种情况下,如果您调用 cor(x, y)
而不指定 method
参数,它与 cor(x, y, method="pearson")
相同。 @missuse 在顶部的评论中提供了一个示例,我已将其复制到此处:
set.seed(123)
x <- rnorm(100)
y <- rnorm(100)
all.equal( cor(x, y),
cor(x, y, method = "pearson") )