微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

用于为每一行数据填充一个矩阵

如何解决用于为每一行数据填充一个矩阵

我想为数据的每一行(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,ncol=5))
beta

因为我想为数据的每一行填充一个2x2矩阵,所以我创建了一个大小为2 2 n的输出数组。

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

现在,我想通过以下方式填充此数组:

  • 如果2x2矩阵中的位置是[1,1]或[2,2],我希望它是1。
  • 如果矩阵中的位置为[1,2],我希望它是beta第一行和X第一行中系数的乘积
  • 如果矩阵中的位置为[2,1],我希望它是beta第二行和X第一行中系数的乘积

我要对所有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元素向量,其值乘以逐元素相乘。您试图将五个数字放入单个“单元格”中。大概是要获取X[i,] * beta[1,] sum 作为标量,并将其放入每个单元格中。

此外,在output_array = X1[t,]*beta[betarow]行中,您正在覆盖output_array整个,而不仅仅是它的单个元素。

请记住在可能的情况下利用R中的向量化。我们可以仅在lapply中创建矩阵,然后以这种方式创建整个数组:

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

output_array <- `dim<-`(unlist(lapply(seq(nrow(X)),function(i) { 
  matrix(c(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]     [,]   1.0000 263.7545
#> [2,] 335.3813   1.0000
#> 
#>,3
#> 
#>          [,]   1.0000 156.0655
#> [2,] 235.1856   1.0000

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。