如何在 R 中保存嵌套循环的结果

How to save the results of a nested loop in R

我有一个包含 15 个变量的数据集(1 个正在检查,14 个是它的回归变量)都是数字。我所做的是 运行 一种算法,它是一种递归预测技术。该算法切割样本内和样本外的数据。 这里我想弄清楚如何存储为 at 的每个值生成的结果,它们是 cv.hqreg 函数的参数( hqreg package)。

对于每个 cv.hqreg,我得到 100 个拟合模型,我通过此 LMQ$fit$beta[,which(LMQ$lambda.min==LMQ$lambda)] 命令行从中 select 误差最小的模型。

   dataR<-TRAINSET
    fittedvaluesQRidge<-NULL
        for(i in 1:(nrow(TESTSET)-1)){ #adding a new row and repeat
          for(a in seq(0,1,0.1)){ #for each penalty of selection
            for(t in seq(0,1,0.05)){ #for each quantile
      print(i)                         #to see it works/or where stops
      dataR<-rbind(dataR,TESTSET[i,])  #update dataset
      LMQ<-cv.hqreg(as.matrix(dataR[,-15]),dataR$LHS,method = "quantile",tau=t,alpha = a)  #FIT THE Lasso Quantile-MODEL 
      predictdQR<-LMQ$fit$beta[1,which(LMQ$lambda.min==LMQ$lambda)]+LMQ$fit$beta[2,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,1]+LMQ$fit$beta[3,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,2]+LMQ$fit$beta[4,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,3]+LMQ$fit$beta[5,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,4]+LMQ$fit$beta[6,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,5]+LMQ$fit$beta[7,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,6]+LMQ$fit$beta[8,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,7]+LMQ$fit$beta[9,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,8]+LMQ$fit$beta[10,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,9]+LMQ$fit$beta[11,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,10]+LMQ$fit$beta[12,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,11]+LMQ$fit$beta[13,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,12]+LMQ$fit$beta[14,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,13]+LMQ$fit$beta[15,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,14] #find the forecasts
      fittedvaluesQRidge<-c(fittedvaluesQRidge,predictdQR) #then put them in a vector 
        }
      }
    }

我用来获取预测值的命令非常广泛,一次使用一个变量。但是,我尝试使用矩阵代数(covariates %*% data 的矩阵,但没有结果,但出现错误:二元运算符的非数字参数。它以一种丑陋的方式工作,但如果有更短的方式我会喜欢所有的帮助。

考虑 sapply()expand.grid(),因为 sapply 可以采用多个输入列表或向量,类似于嵌套 for 循环,但 returns 是一个矩阵。使用 expand.grid 交叉连接 data.frame 对象中的两个列表,您可以捕获 at 之间的每个组合:

at_combns <- expand.grid(a=seq(0,1,0.05), t=seq(0,1,0.1))

matpredictdQR <- sapply(seq(nrow(at_combns)), function(j, i){
  # UPDATE dataset
  dataR <- rbind(TRAINSET, TESTSET[1:i,])

  # FIT THE Lasso Quantile-MODEL 
  LMQ <- cv.hqreg(as.matrix(dataR[,-15]),dataR$LHS,method = "quantile",
                  tau=at_combns$t[j], alpha=at_combns$a[j]) 

  predictdQR <-LMQ$fit$beta[1,which(LMQ$lambda.min==LMQ$lambda)]+
               LMQ$fit$beta[2,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,1]+
               LMQ$fit$beta[3,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,2]+
               LMQ$fit$beta[4,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,3]+
               LMQ$fit$beta[5,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,4]+
               LMQ$fit$beta[6,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,5]+
               LMQ$fit$beta[7,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,6]+
               LMQ$fit$beta[8,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,7]+
               LMQ$fit$beta[9,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,8]+
               LMQ$fit$beta[10,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,9]+
               LMQ$fit$beta[11,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,10]+
               LMQ$fit$beta[12,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,11]+
               LMQ$fit$beta[13,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,12]+
               LMQ$fit$beta[14,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,13]+
               LMQ$fit$beta[15,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,14] 

  return(predictdQR)

}, seq(nrow(TESTSET)-1))