函数为每一行数据填充一个矩阵

Function to fill one matrix for each row of data

我想为我的数据的每一行 (N = 500) 填充一个 2x2 矩阵。

N = 500   # Number of observations
S = 2     # Number of rows and columns of the data

假设这是我的示例数据。它包含 5 个协变量的 500 个观察值。

X <- data.frame(matrix(rexp(2500, rate=.1), ncol=5))
X

从我的模型中,我为每个协变量检索了 2 个系数。

beta <- data.frame(matrix(rexp(10, rate=.1), ncol=5))
beta

因为我想为每一行数据填充一个 2x2 矩阵,所以我创建了一个大小为 22n.

的输出数组

output_array = array(NA, dim = c(S,S,N))

现在我想用以下方式填充这个数组:

我想对所有 500 行数据执行此过程(...所以它遍历行),从而产生 500 个 2x2 矩阵(每行数据一个)。

我的想法是下面的函数,但是貌似维度不匹配,我做错了。

for(t in 1:N){
  betarow = 1
  for (k in 1:S){
    for (j in 1:S){
      if(k == j){
        output_array[t,k,j] = 1;
      } else {
        output_array = X1[t,]*beta[betarow]
          betarow = betarow + 1;
        }
      }
  }
}

在 R 中,一个 5 元素向量和一个 5 元素向量的乘积是另一个 5 元素向量,其值相乘 element-wise。您正试图将五个数字放入一个“单元格”中。据推测,您打算将 X[i,] * beta[1,]sum 作为标量并将其放入每个单元格中。

此外,在行 output_array = X1[t,]*beta[betarow] 中,您是 over-writing 整个 output_array 而不是其中的一个元素。

记得尽可能利用 R 中的矢量化。我们可以在 lapply 中单独创建矩阵,然后以这种方式创建整个数组:

X    <- data.frame(matrix(rexp(2500, rate=.1), ncol = 5))
beta <- data.frame(matrix(rexp(10, rate=.1), ncol = 5))

output_array <- `dim<-`(unlist(lapply(seq(nrow(X)), function(i) { 
  matrix(c(1, sum(X[i,] * beta[1,]), sum(X[i,] * beta[2,]), 1), nrow = 2)
})), c(2, 2, nrow(X)))

所以 output_array 的前三个“切片”看起来像这样:

output_array[,,1:3]
#> , , 1
#> 
#>          [,1]    [,2]
#> [1,]   1.0000 184.826
#> [2,] 677.8113   1.000
#> 
#> , , 2
#> 
#>          [,1]     [,2]
#> [1,]   1.0000 263.7545
#> [2,] 335.3813   1.0000
#> 
#> , , 3
#> 
#>          [,1]     [,2]
#> [1,]   1.0000 156.0655
#> [2,] 235.1856   1.0000