我正在关联几个矩阵,其中包含[lat,lon,time]维度。现在,我通过创建一个循环函数来实现这一点:
GetCorrelation <- function(x,y){
#defining dimension
out_tot <- matrix(NA,nrow=size[1],ncol=size[2])
for(i in 1:length(loni)){
for(j in 1:length(lati)){
out_tot[i,j] <- cor(x[i,j,],y[i,j,],method="spearman",use="na.or.complete")
}
}
return(out_tot)
}
我计算每个网格点的相关性,但我只是想知道是否有另一种方式使用apply或sapply并避免循环? 以同样的方式,如果我想要关联不仅2矩阵,而且10矩阵..我可以这样做吗?我读到的是使用data.frame是很常见的,但是如果我没有看到它,因为我想保持纬度和经度格式,任何想法或建议?
提前致谢。
答案 0 :(得分:1)
该命令实际上非常简单:cor(df):
ddf = structure(list(vnum1 = c(0.715897737792417, 0.299617190296728,
-1.02251319233659, -0.862117012932794, 1.44997632983787, 1.65615043993346,
0.945107258196299, 0.568115024409375, 1.20791502923882, -1.04639514112998
), vnum2 = c(0.287509825313464, 0.19995830883272, 0.848034866852686,
0.544316479703411, 0.160545825958252, 0.398045151494443, 0.121440409682691,
0.0364419857505709, 0.105769601417705, 0.217918869107962), vint1 = c(2L,
7L, 2L, 3L, 4L, 10L, 5L, 4L, 2L, 9L), vint2 = c(8L, 12L, 6L,
5L, 3L, 3L, 7L, 12L, 11L, 8L)), .Names = c("vnum1", "vnum2",
"vint1", "vint2"), row.names = c(NA, 10L), class = "data.frame")
ddf
vnum1 vnum2 vint1 vint2
1 0.7158977 0.28750983 2 8
2 0.2996172 0.19995831 7 12
3 -1.0225132 0.84803487 2 6
4 -0.8621170 0.54431648 3 5
5 1.4499763 0.16054583 4 3
6 1.6561504 0.39804515 10 3
7 0.9451073 0.12144041 5 7
8 0.5681150 0.03644199 4 12
9 1.2079150 0.10576960 2 11
10 -1.0463951 0.21791887 9 8
cor(ddf)
vnum1 vnum2 vint1 vint2
vnum1 1.00000000 -0.5660315 0.09141771 -0.08964374
vnum2 -0.56603151 1.0000000 -0.17904374 -0.47127521
vint1 0.09141771 -0.1790437 1.00000000 -0.15697672
vint2 -0.08964374 -0.4712752 -0.15697672 1.00000000
>
您可以根据自己的要求进行扩展。
对于以下矩阵可能有用:
https://stats.stackexchange.com/questions/24980/correlation-between-matrices-in-r
cor(matrix1, matrix2)
cor(c(matrix1), c(matrix2)).
cor(c(as.matrix(matrix1)), c(as.matrix(matrix2)))
diag(cor(a,b))
mapply(cor(a,b))
colCors(a,b)
http://pbil.univ-lyon1.fr/ADE-4/ade4-html/mantel.rtest.html Mantel测试(两个距离矩阵之间的相关性(在R中)。)
library(ade4)
mantel.rtest(m1, m2, nrepet = 99)
您也可以尝试将矩阵转换为向量(通过as.vector(m)或as.vector(t(m)),将这些向量组合为数据帧的列,然后运行cor(df)。由于每列都会代表一个矩阵,cor(df)代表矩阵之间的相关矩阵。