使用循环在R中创建矩阵



我试图在一个相对较小的数据集(n = 22, p = 17)上对LARS算法进行线性回归进行留一交叉验证。本质上,我需要创建n个标准化数据矩阵(每列由以平均值为中心的条目组成,并通过列的SD进行标准化)。

我以前从未使用过列表,但只要不同矩阵的列可以被操纵/标准化,我愿意制作列表。

下面是我在R中所做的尝试:

for (i in 1:n)
{
  x.standardized.i <- matrix(data = NA, nrow = (n-1), ncol = p)  #creates n matrices, all n-1 x p
  for (j in 1:p)
  {
    x.standardized.i[,j] <- ((x[-i,j]-mean(x[-i,j]))/sd(x[-i,j])) #and standardizes the p variables with the ith row missing in each n matrix (i increments from 1 to n)
  }
}

我不确定我是否可以共享数据,因为它与类的成绩有关,但是当我运行代码时,它会通过循环并通过分配一个标准化矩阵来停止,最后一行缺失为x. standarzed . I。

对于sapplyscale可以很简单地做到这一点:

# Create dummy data
m <- matrix(runif(200), ncol=10)
# Leave each row out in turn, and scale each column
A <- sapply(seq_len(nrow(m)), function(i) scale(m[-i, ]), simplify='array')

默认情况下,scale以其平均值为每列的中心,并除以其sd。

对于上面的示例,您最终将得到一个包含19行、10列和20片的数组。

要访问特定的切片(即交叉验证训练折叠),您可以像这样进行子集:

A[,, 1] # all rows, all cols, first slice
A[,, 10] # all rows, all cols, tenth slice

确认列以其平均值为中心并以一个sd:

进行标准化
apply(A, c(2, 3), mean)
apply(A, c(2, 3), sd)

相关内容

  • 没有找到相关文章

最新更新