首页 > 解决方案 > 保存数量是一个 for 循环

问题描述

将结果保存在 for 循环中时遇到问题。我正在计算一个方差(我认为这不相关),我的代码是:

library(dirmult)
n <- 50
p <- 20
size <- 5*p
prob_true <- rep(1/p, p)
multinom <- as.matrix(rmultinom(n, size, prob = prob_true))
zeros <- round(0.5*p*n)
a <- c(as.matrix(multinom))
a[sample(1:(p*n), zeros)] <- 0
data_zeros <- matrix(a, p, n)
dirmult <- dirmult(t(data_zeros))
alpha <- dirmult$gamma
sum_alpha <- (1-dirmult$theta)/dirmult$theta

for (j in ncol(data_zeros)){
  A <- alpha/sum_alpha
  B <- 1 - A
  N <- colSums(data_zeros)
  C <- 1 + sum_alpha
  var_s_dirm <- list()
  var_s_dirm[[j]] <- N[j]*A*B*((N[j]+sum_alpha)/C)
}

特别是我可以说 alpha 是一个有 20 个值的向量, sum_alpha 是一个标量 data_zeros 是我的数据集,它有 20 行和 50 列,N 是数据集每列的总和,所以它是一个有 50 个值的向量。

做我想做的事情似乎很简单:我想得到一个包含 50 个向量的列表,其中每个向量的不同之处在于我乘以不同的 N 值。

我真的希望有人可以帮助我找到错误。

标签: rlistfor-looperror-handling

解决方案


问题是(可能)您在每次 j 增加时都设置常量,并且在每一步中,您都使用以下行清除列表var_s_dirm <- list()...

看看这是否适合你

library(dirmult)
n <- 50
p <- 20
size <- 5*p
prob_true <- rep(1/p, p)
multinom <- as.matrix(rmultinom(n, size, prob = prob_true))
zeros <- round(0.5*p*n)
a <- c(as.matrix(multinom))
a[sample(1:(p*n), zeros)] <- 0
data_zeros <- matrix(a, p, n)
dirmult <- dirmult(t(data_zeros))
alpha <- dirmult$gamma
sum_alpha <- (1-dirmult$theta)/dirmult$theta


A <- alpha/sum_alpha
B <- 1 - A
N <- colSums(data_zeros)
C <- 1 + sum_alpha
var_s_dirm <- list()

for (j in 1:ncol(data_zeros)){
  var_s_dirm[[j]] <- N[j]*A*B*((N[j]+sum_alpha)/C)
}

输出

var_s_dirm
[[1]]
 [1] 2.614833 2.327105 2.500483 3.047700 2.233528 2.130223 2.700103 2.869699 2.930213 2.575903 2.198459 2.846096
[13] 2.425448 3.517559 3.136266 2.565345 2.578267 2.763113 2.709707 3.420792

[[2]]
 [1] 2.568959 2.286279 2.456615 2.994231 2.194343 2.092850 2.652732 2.819353 2.878806 2.530712 2.159889 2.796165
[13] 2.382897 3.455848 3.081244 2.520339 2.533034 2.714637 2.662168 3.360778

[[3]]
 [1] 3.211199 2.857849 3.070769 3.742790 2.742930 2.616064 3.315916 3.524193 3.598509 3.163391 2.699862 3.495207
[13] 2.978622 4.319811 3.851556 3.150424 3.166294 3.393297 3.327711 4.200974

....

推荐阅读