函数为每一行数据填充一个矩阵
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))
现在我想用以下方式填充这个数组:
- 如果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 元素向量,其值相乘 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
我想为我的数据的每一行 (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))
现在我想用以下方式填充这个数组:
- 如果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 元素向量,其值相乘 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