我希望在xtable
中使用Sweave
的p值的相关矩阵。我试过这个
library(ltm)
library(xtable)
mat <- matrix(rnorm(1000), 100, 10, dimnames = list(NULL, LETTERS[1:10]))
rcor.test(mat)
xtable(rcor.test(mat))
并抛出此错误:
Error in UseMethod("xtable") :
no applicable method for 'xtable' applied to an object of class "rcor.test"
我想知道如何在[{1}}中使用xtable
的p值得到相关矩阵。在此先感谢您的帮助。
答案 0 :(得分:6)
要了解发生了什么,我总是建议保存感兴趣的对象,然后使用str
查看其结构。
library(ltm)
library(xtable)
mat <- matrix(rnorm(1000), 100, 10, dimnames = list(NULL, LETTERS[1:10]))
out <- rcor.test(mat)
str(out)
看起来正在打印的表实际上并未存储在此处。那么让我们来看看rcor.test的打印方法
getAnywhere(print.rcor.test)
我们看到该方法实际上构造了打印出来但不返回的矩阵。因此,为了获得矩阵以便我们可以使用xtable,我们只需...窃取代码来构造该矩阵。不是打印出矩阵然后返回原始对象,而是返回构造的矩阵。
get.rcor.test.matrix <- function (x, digits = max(3, getOption("digits") - 4), ...)
{
### Modified from print.rcor.test
mat <- x$cor.mat
mat[lower.tri(mat)] <- x$p.values[, 3]
mat[upper.tri(mat)] <- sprintf("%6.3f", as.numeric(mat[upper.tri(mat)]))
mat[lower.tri(mat)] <- sprintf("%6.3f", as.numeric(mat[lower.tri(mat)]))
ind <- mat[lower.tri(mat)] == paste(" 0.", paste(rep(0, digits),
collapse = ""), sep = "")
mat[lower.tri(mat)][ind] <- "<0.001"
ind <- mat[lower.tri(mat)] == paste(" 1.", paste(rep(0, digits),
collapse = ""), sep = "")
mat[lower.tri(mat)][ind] <- ">0.999"
diag(mat) <- " *****"
cat("\n")
## Now for the modifications
return(mat)
## and ignore the rest
#print(noquote(mat))
#cat("\nupper diagonal part contains correlation coefficient estimates",
# "\nlower diagonal part contains corresponding p-values\n\n")
#invisible(x)
}
现在让我们得到我们的矩阵并在其上使用xtable。
ourmatrix <- get.rcor.test.matrix(out)
xtable(ourmatrix)
答案 1 :(得分:1)
你也可以使用这样的自己的功能:
mat <- matrix(rnorm(1000), nrow = 100, ncol = 10,
dimnames = list(NULL, LETTERS[1:10]))
cor_mat <- function(x, method = c("pearson", "kendall", "spearman"),
alternative = c("two.sided", "less", "greater")) {
stopifnot(is.matrix(x) || is.data.frame(x))
stopifnot(ncol(x) > 1L)
if (is.data.frame(x)) x <- data.matrix(x)
alternative <- match.arg(alternative)
method <- match.arg(method)
n <- ncol(x)
idx <- combn(n, 2L)
p.vals <- numeric(ncol(idx))
for (i in seq_along(p.vals)) {
p.vals[i] <- cor.test(x = x[, idx[1L, i]], y = x[, idx[2L, i]],
method = method, alternative = alternative)$p.value
}
res <- matrix(NA, ncol = n, nrow = n)
res[lower.tri(res)] <- p.vals
return(res)
}
library(xtable)
xtable(cor_mat(mat))