从R中的成对相关数据构造方差-协方差矩阵
constructing variance-covariance matrix from pairwise correlation data in R
我有所有的成对相关性,想构建变协方差矩阵以便对该矩阵进行一些标准分析。这是协方差的示例数据,前两列是 "ids",而第三列显示 "ids".
之间的协方差
data<-data.frame("id1" = c("a","b","c","a","a","b"),
"id2" = c("a","b","c","b","c","c"),
"cov"=c(1,1,1,0.1,0.3,0.4))
一个简单的 dplyr 解决方案是在 pivot_wider
的帮助下使 data.frame 更宽,即
data<-data.frame("id1" = c("a","b","c","a","a","b"),
"id2" = c("a","b","c","b","c","c"),
"cov"=c(1,1,1,0.1,0.3,0.4))
tidyr::pivot_wider(data,
id_cols = c(cov, id2),
names_from = id1,
values_from = cov)
产生 输出
id2 a b c
<fct> <dbl> <dbl> <dbl>
1 a 1 NA NA
2 b 0.1 1 NA
3 c 0.3 0.4 1
因为协方差矩阵是对称的,所以它完成了。
Base-R 解决方案:
nm <- unique(data$id1) ## row/col names
v <- matrix(NA,length(nm),length(nm),dimnames=list(nm,nm)) ## set up template
v[cbind(data$id1,data$id2)] <- data$cov ## fill in upper triangle
v[is.na(v)] <- t(v)[is.na(v)] ## symmetrize
我有所有的成对相关性,想构建变协方差矩阵以便对该矩阵进行一些标准分析。这是协方差的示例数据,前两列是 "ids",而第三列显示 "ids".
之间的协方差data<-data.frame("id1" = c("a","b","c","a","a","b"),
"id2" = c("a","b","c","b","c","c"),
"cov"=c(1,1,1,0.1,0.3,0.4))
一个简单的 dplyr 解决方案是在 pivot_wider
的帮助下使 data.frame 更宽,即
data<-data.frame("id1" = c("a","b","c","a","a","b"),
"id2" = c("a","b","c","b","c","c"),
"cov"=c(1,1,1,0.1,0.3,0.4))
tidyr::pivot_wider(data,
id_cols = c(cov, id2),
names_from = id1,
values_from = cov)
产生 输出
id2 a b c
<fct> <dbl> <dbl> <dbl>
1 a 1 NA NA
2 b 0.1 1 NA
3 c 0.3 0.4 1
因为协方差矩阵是对称的,所以它完成了。
Base-R 解决方案:
nm <- unique(data$id1) ## row/col names
v <- matrix(NA,length(nm),length(nm),dimnames=list(nm,nm)) ## set up template
v[cbind(data$id1,data$id2)] <- data$cov ## fill in upper triangle
v[is.na(v)] <- t(v)[is.na(v)] ## symmetrize