我试图通过因子变量的不同级别创建一组相关矩阵。
此问题之前已经回答过(spearman correlation by group in R),但对于矩阵没有回答,而且就我所见,矢量结果似乎没有概括。
下面的代码有效,但不能写入csv,因为()输出一个列表 - 错误是“不能强制类”“by”“到”data.frame“
cor1<- by(data, INDICES=data$factor0, FUN = function(x) cor(x[,c("x","y","z","a",
"b","c")],method="spearman",use="pairwise"))
所以我正在寻找一种方法来将上述内容强制转换为data.frame,这样我就可以将它写入csv,或者通过输出数据帧的替代方法产生上述结果
任何帮助非常感谢
答案 0 :(得分:0)
获得列表的原因是因为如果x
是一个矩阵,那么cor(x)
也将是一个矩阵,而不是标量。在这种情况下,它将是一个6x6矩阵。因此,结果是一个6x6矩阵列表,每个因子级别一个。
在我看来,这是表示结果的自然方式。如果需要,您可以将其设置为单个数据框,但我不确定您希望行和列准确表示什么。这是一个选择。
data<-matrix(rnorm(500),100,5)
colnames(data)<-letters[1:5]
factors<-sample(LETTERS[1:3],100,T)
cors<-by(data,factors,cor)
cors[[1]]
# a b c d e
# a 1.00000000 0.05389618 -0.16944040 0.25747174 0.21660217
# b 0.05389618 1.00000000 0.22735796 -0.06002965 -0.30115444
# c -0.16944040 0.22735796 1.00000000 -0.06625523 -0.01120225
# d 0.25747174 -0.06002965 -0.06625523 1.00000000 0.10402791
# e 0.21660217 -0.30115444 -0.01120225 0.10402791 1.00000000
corsMatrix<-do.call(rbind,lapply(cors,function(x)x[upper.tri(x)]))
names<-outer(colnames(data),colnames(data),paste,sep="X")
colnames(corsMatrix)<-names[upper.tri(names)]
corsMatrix
# aXb aXc bXc aXd bXd cXd
# A 0.05389618 -0.16944040 0.22735796 0.25747174 -0.06002965 -0.06625523
# B -0.34231682 -0.14225269 0.20881053 -0.14237661 0.25970138 0.27254840
# C 0.27199944 -0.01333377 0.06402734 0.02583126 -0.03336077 -0.02207024
# aXe bXe cXe dXe
# A 0.216602173 -0.3011544 -0.01120225 0.10402791
# B 0.347006942 -0.2207421 0.33123175 -0.05290809
# C 0.007748369 -0.1257357 0.23048709 0.16037247
我不确定这是否是你要找的。另一种选择是将每个相关矩阵导出到它自己的csv文件。
答案 1 :(得分:0)
您的查询不是那么清楚,至少对我而言。如果我正确使用它,您可能需要在计算相关性之前先使用成对矩阵。
您可能需要在SciencesPo
中尝试以下功能。
需要(SciencesPo)
m<-rprob(mtcars, df = nrow(mtcars) - 2)
以下内容将叠加矩阵,因此更容易检查r和相关的p值。
rstack(m)
答案 2 :(得分:0)
您可以使用包ddply
中的library(plyr)
:
library(plyr)
n <- 1e2
mdat <- data.frame(factor0 = factor(LETTERS[sample(26, n, TRUE)]), x = rnorm(n),
y = rnorm(n), z = rnorm(n), a = rnorm(n), b = rnorm(n),
c = rnorm(n))
ddply(mdat, .(factor0), function(d) {
ret <- as.data.frame(cor(d[, letters[c(1:3, 24:26)]], method="spearman",use="pairwise"))
ret$col <- letters[c(1:3, 24:26)]
ret[, c(7, 1:6)]})