我试图在一个相对较小的数据集(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。 standardized.i。
答案 0 :(得分:0)
您可以使用sapply
和scale
完成此操作:
# 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)