r - 如何计算观察值之间的方差,当观察值是矩阵形式时
问题描述
我有一个包含 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 在做什么。或如何做到这一点。
解决方案
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
推荐阅读
- angular - 如何使用 Angular 8 获取整个 http 响应
- html - 如何在 Flex 容器中对齐正确的项目
- wordpress - WordPress 网站无法加载。你能帮我解决这个问题吗?
- java - 移动到新服务器后的 Java.lang.NoClassDefFoundError
- scala - Spark Scala 地图因自定义功能而失败
- file - 在 nuxtjs 中集成一个小部件
- kotlin - GraphQL 服务器端流式实现
- asp.net-core - 来自全局错误处理程序的控制器和操作
- plot - Octave 中 3d 绘图的数据文件格式
- python - 将 docx 转换为文本文件并将它们保存在同一文件夹中