首页 > 解决方案 > 如何计算观察值之间的方差,当观察值是矩阵形式时

问题描述

我有一个包含 250 个观察值的集群。每个观察值都是一个 4 x 9 矩阵。4 是观察到的变量参数的数量,9 是收集观察的天数。

我想知道矩阵形式的 250 个观察值之间的差异。正如我到目前为止所研究的那样,方差是在一维变量之间计算的。对矩阵形式的数据有什么建议吗?

mat1 <- matrix(c(0:69),10,7)
mat2 <- matrix(c(3:72),10,7)
mat3 <- matrix(c(0:69),10,7)
...
var <- var(mat1,mat2, mat3,..)

对于这三个矩阵,var() 为所有元素返回一个 9.166667 的 7 x 7 矩阵。我不知道 r 在做什么。或如何做到这一点。

标签: rmatrixvariance

解决方案


var 的参数是:

> args(var)
function (x, y = NULL, na.rm = FALSE, use) 

所以 mat1 被传递给 x,mat2 被传递给 y,mat3 被传递给 na.rm。结果的元素 i, j 是 x[, i] 和 y[, j] 的协方差。

问题中的代码真的毫无意义,阅读 ?var 会有所帮助。目前尚不清楚“我想知道矩阵形式的 250 个观察值之间的方差”是什么意思。如果这意味着 v[i, j] 应该计算为 c(mat1[i,j], mat2[i, j], mat3[i, j]) 的方差,那么我们可以使用几个列表理解包之一或者只是迭代 sapply。他们都使用了这两个对于固定 i 和 j 相同的事实,除了第一个更通用。

var(sapply(L, `[`, i, j)) 
var(c(L[[1]][i, j], L[[2]][i,j], L[[3]][i,j]))

listcompr 替代方案的语法在这里似乎特别直观。

L <- list(mat1, mat2, mat3)
nr <- nrow(L[[1]])
nc <- ncol(L[[1]])  

library(listcompr)
v1 <- gen.matrix(var(sapply(L, `[`, i, j)), i = 1:nr, j = 1:nc)

# or
library(eList)
v2 <- Mat(for(j in 1:nc) for(i in 1:nr) var(sapply(L, `[`, i, j)))

# or (no packages):
v3 <- sapply(1:nc, \(j) sapply(1:nr, \(i) var(sapply(L, `[`, i, j))))

# checks

identical(v1, v2)
## [1] TRUE

identical(v1, v3)
## [1] TRUE

i <- 2; j <- 3
identical(v1[i, j], var(c(L[[1]][i, j], L[[2]][i,j], L[[3]][i,j])))
## [1] TRUE

推荐阅读