【发布时间】:2020-01-29 04:02:24
【问题描述】:
我知道我可以从已经创建的矩阵中提取子矩阵,但我希望能够先创建子矩阵,然后组合创建的子矩阵以形成更大的矩阵以节省空间和时间。例如,在我的示例中,我希望能够为具有 NA (1-10) 的 ID 和不具有 NA (11-20) 的 ID 创建一个子矩阵,然后将这两个矩阵组合在一起以形成一个更大的矩阵,但我没有得到它,如果有人可以建议我的代码中应该包含的内容,那么我将对使用 NA 和不使用 NA 进行相同的计算。
P.S:我还希望能够在将这些子矩阵合并到一个奇异矩阵(20x20)之前单独保存它们
dorm<-function(data)
{
library(Matrix)
n<-max(as.numeric(fam[,"ID"]))
t<-min(as.numeric(fam[,"ID"]))
A <- sparseMatrix(i = n, j=n, x=n)
while(t <=n) {
for( t in t:n ){
s <- max(fam[t,"dad"],fam[t,"mum"])
d <- min(fam[t,"dad"],fam[t,"mum"])
if( !is.na(s) ){
if( !is.na(d) ){
A[t,t] = 2-0.5^(fam[t,"GEN"]-1)+0.5^(fam[t,"GEN"])*A[fam[t,"dad"],fam[t,"mum"]]
tmp = 0.5 * (A[1:(t-1),s] + A[1:(t-1),d])
A[t, 1:(t-1)] = tmp
A[1:(t-1), t] = tmp
} else {
A[t,t] = 2-0.5^(fam[t,"GEN"]-1)
tmp = 0.5 * A[1:(t-1),s]
A[t, 1:(t-1)] = tmp
A[1:(t-1), t] = tmp
}
} else {
A[t,t] = 2-0.5^(fam[t,"GEN"]-1)
}
message(" MatbyGEN: ", t)
}
return(A)
}
}
fam <- structure(list(ID = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L,
11L, 12L, 13L, 14L, 18L, 15L, 16L, 17L, 20L, 19L), dad = c(NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, 1L, 1L, 4L, 6L, 4L, 10L,
12L, 13L, 13L, 14L), mum = c(NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, 2L, 3L, 2L, 5L, 11L, 11L, 5L, 3L, 7L, 2L), GEN = c(1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L,
3L, 3L, 3L)), class = "data.frame", row.names = c(NA, -20L))
A <- dorm(fam)
【问题讨论】:
-
如果你使用稀疏矩阵,一次性创建整个矩阵不是更简单吗?它只需要矩阵中的值及其位置。
-
是的,这是我的想法,但对于更大的数据 (>400k),它已经运行了 2 周,这非常慢,这就是我要求这个的原因以及我该如何解决价值观和他们的立场?
-
这听起来像是生成稀疏矩阵的代码中的一个问题(你是怎么做到的?),而不是使用较小的子矩阵来解决的问题。假设您的数据有 1M 变量,我假设矩阵在每一行和每一列中至少有 1 个非零值,使用 Matrix 包创建这应该不会超过几秒钟。
-
例如:
n <- 1e6;d <- rnorm(n);r <- seq(n);c <- sample(r);system.time(mm <- sparseMatrix(i = r, j = c, x = d))。在我的小笔记本电脑上大约需要 0.24 秒。 -
这似乎很熟悉。我认为使用稀疏矩阵最终会受到伤害 - 你所有的
NA结果结果都是非稀疏的。另见:stackoverflow.com/questions/57301390/…
标签: r sparse-matrix submatrix